供需优化(Supply-demand-based optimization, SDO)算法是Zhao等于2019年受经济学供需机制的启发而提出的一种新型元启发式优化算法。该算法在数学上模拟了消费者的需求关系和生产者的供给关系,通过将供求机制之稳定模式和非稳定模式引入到SDO算法中,利用两种模式在给定空间中进行局部搜索和全局搜索求解待优化问题。与传统群智能算法相比,SDO算法收敛速度快、寻优精度高、调节参数少,具有较好的探索和开发能力。
假设有
n
n
n个市场,每个市场有
d
d
d种不同的商品,每种商品都有一定的数量和价格。市场中
d
d
d种商品价格表示优化问题
d
d
d维变量的一组候选解,同时将市场中d种商品数量作为一组可行解进行评估,如果可行解优于候选解,则可行解替换候选解。
n
n
n个市场商品价格和商品数量分别用
X
X
X、
Y
Y
Y两个矩阵表:
X
=
[
x
1
x
2
⋮
x
n
]
=
[
x
1
1
x
1
2
⋯
⋯
x
1
d
x
2
1
x
2
2
⋯
⋯
x
2
d
⋮
⋮
⋮
⋮
⋮
x
n
1
x
n
2
⋯
⋯
x
n
d
]
(1)
X=\begin{bmatrix}x_1\\x_2\\\vdots\\x_n\end{bmatrix}=\begin{bmatrix} x_{1}^1 & x_{1}^2 & \cdots & \cdots & x_{1}^d \\x_{2}^1 & x_{2}^2 & \cdots & \cdots & x_{2}^d\\\vdots & \vdots & \vdots & \vdots & \vdots\\x_{n}^1 & x_{n}^2 & \cdots & \cdots & x_{n}^d \\\end{bmatrix}\tag{1}
X=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡x11x21⋮xn1x12x22⋮xn2⋯⋯⋮⋯⋯⋯⋮⋯x1dx2d⋮xnd⎦⎥⎥⎥⎤(1)
Y
=
[
y
1
y
2
⋮
y
n
]
=
[
y
1
1
y
1
2
⋯
⋯
y
1
d
y
2
1
y
2
2
⋯
⋯
y
2
d
⋮
⋮
⋮
⋮
⋮
y
n
1
y
n
2
⋯
⋯
y
n
d
]
(2)
Y=\begin{bmatrix}y_1\\y_2\\\vdots\\y_n\end{bmatrix}=\begin{bmatrix} y_{1}^1 & y_{1}^2 & \cdots & \cdots & y_{1}^d \\y_{2}^1 & y_{2}^2 & \cdots & \cdots & y_{2}^d\\\vdots & \vdots & \vdots & \vdots & \vdots\\y_{n}^1 & y_{n}^2 & \cdots & \cdots & y_{n}^d \\\end{bmatrix}\tag{2}
Y=⎣⎢⎢⎢⎡y1y2⋮yn⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡y11y21⋮yn1y12y22⋮yn2⋯⋯⋮⋯⋯⋯⋮⋯y1dy2d⋮ynd⎦⎥⎥⎥⎤(2)其中,
x
i
x_i
xi和
y
i
y_i
yi分别为第
i
i
i个商品的价格和数量;
x
i
j
x_i^j
xij和
y
i
j
y_i^j
yij分别为第
j
j
j个商品在第
i
i
i个市场中的价格和数量。
利用适应度函数分别对每个市场中的商品价格和数量进行评估,对于
n
n
n个市场,商品价格的适应度为:
F
x
=
[
F
x
1
F
x
2
⋯
F
x
n
]
T
(3)
F_x=[F_{x_1}\,\,F_{x_2}\,\,\cdots\,\,F_{x_n}]^T\tag{3}
Fx=[Fx1Fx2⋯Fxn]T(3)商品数量的适应度为:
F
y
=
[
F
y
1
F
y
2
⋯
F
y
n
]
T
(4)
F_y=[F_{y_1}\,\,F_{y_2}\,\,\cdots\,\,F_{y_n}]^T\tag{4}
Fy=[Fy1Fy2⋯Fyn]T(4)
假设每种商品的均衡价格 x 0 x_0 x0和均衡数量 y 0 y_0 y0在每次迭代过程中都是可变的,从每个市场商品数量集合中选择一种商品数量作为其数量均衡向量,其市场适应度值越大,表示每个市场所选商品数量的概率就越大。同时,每个市场也可以根据其概率从商品价格集合中选择一种商品价格或以所有市场商品价格的平均值作为均衡价格。商品均衡数量 y 0 y_0 y0表示如下: N i = ∣ F y i − 1 n ∑ i = 1 n F y i ∣ (5) N_i=\left|F_{y_i}-\frac1n\sum_{i=1}^nF_{y_i}\right|\tag{5} Ni=∣∣∣∣∣Fyi−n1i=1∑nFyi∣∣∣∣∣(5) Q = N ∑ i = 1 n N i (6) Q=\frac{N}{\displaystyle\sum_{i=1}^nN_i}\tag{6} Q=i=1∑nNiN(6) y 0 = y k , k = RouletteWheelSelection ( Q ) (7) y_0=y_k,\quad k=\text{RouletteWheelSelection}(Q)\tag{7} y0=yk,k=RouletteWheelSelection(Q)(7)商品均衡价格 x 0 x_0 x0表示如下: M i = ∣ F x i − 1 n ∑ i = 1 n F x i ∣ (8) M_i=\left|F_{x_i}-\frac1n\sum_{i=1}^nF_{x_i}\right|\tag{8} Mi=∣∣∣∣∣Fxi−n1i=1∑nFxi∣∣∣∣∣(8) P = M ∑ i = 1 n M i (9) P=\frac{M}{\displaystyle\sum_{i=1}^nM_i}\tag{9} P=i=1∑nMiM(9) x 0 = { r 1 ⋅ ∑ i = 1 n x i n i f r a n d < 0.5 x k , k = RouletteWheelSelection ( P ) i f r a n d ≥ 0.5 (10) x_0=\begin{dcases}r_1\cdot\frac{\displaystyle\sum_{i=1}^nx_i}{n}\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\,\, if \,\,rand<0.5\\x_k,\,\,k=\text{RouletteWheelSelection}(P)\quad if \,\,rand≥0.5\end{dcases}\tag{10} x0=⎩⎪⎪⎪⎨⎪⎪⎪⎧r1⋅ni=1∑nxiifrand<0.5xk,k=RouletteWheelSelection(P)ifrand≥0.5(10)其中, r 1 r_1 r1是 [ 0 , 1 ] [0,1] [0,1]中的随机数。
依据均衡数量
y
0
y_0
y0、均衡价格
x
0
x_0
x0分别给出供给函数和需求函数:
y
i
(
t
+
1
)
=
y
0
+
α
⋅
(
x
i
(
t
)
−
x
0
)
(11)
y_i(t+1)=y_0+\alpha\cdot(x_i(t)-x_0)\tag{11}
yi(t+1)=y0+α⋅(xi(t)−x0)(11)
x
i
(
t
+
1
)
=
x
0
−
β
⋅
(
y
i
(
t
+
1
)
−
y
0
)
(12)
x_i(t+1)=x_0-\beta\cdot(y_i(t+1)-y_0)\tag{12}
xi(t+1)=x0−β⋅(yi(t+1)−y0)(12)其中,
x
i
(
t
)
x_i(t)
xi(t)和
y
i
(
t
)
y_i(t)
yi(t)分别为第
t
t
t次迭代第
i
i
i个商品价格和数量;
α
\alpha
α和
β
\beta
β分别为需求权重和供给权重,通过调整
α
\alpha
α、
β
\beta
β对均衡价格和均衡数量进行更新。
将式(11)插入式(12)中,可以将需求算式重写为:
x
i
(
t
+
1
)
=
x
0
−
α
β
⋅
(
x
i
(
t
)
−
x
0
)
(13)
x_i(t+1)=x_0-\alpha\beta\cdot(x_i(t)-x_0)\tag{13}
xi(t+1)=x0−αβ⋅(xi(t)−x0)(13)可以发现,从这个方程中,商品价格实际上是根据均衡价格相对于其当前价格进行更新的。通过调整权重
α
\alpha
α和
β
\beta
β的值,可以得到不同的商品价格向量。为了在SDO中进行勘探和开发,需要适当地给出供给权重
α
\alpha
α和需求权重
β
\beta
β。这两个权重可以表示为:
α
=
2
⋅
(
T
−
t
+
1
)
T
⋅
sin
(
2
π
r
)
(14)
\alpha=\frac{2\cdot(T-t+1)}{T}\cdot\sin(2\pi r)\tag{14}
α=T2⋅(T−t+1)⋅sin(2πr)(14)
β
=
2
⋅
cos
(
2
π
r
)
(15)
\beta=2\cdot\cos(2\pi r)\tag{15}
β=2⋅cos(2πr)(15)其中,
T
T
T为最大迭代次数,
r
r
r为
[
0
,
1
]
[0,1]
[0,1]中的随机数。用变量
L
L
L表示供应权重
α
\alpha
α和需求权重
β
\beta
β的乘积,可以得到:
L
=
α
β
=
4
⋅
(
T
−
t
+
1
)
T
⋅
sin
(
2
π
r
)
⋅
cos
(
2
π
r
)
(16)
L=\alpha\beta=\frac{4\cdot(T-t+1)}{T}\cdot\sin(2\pi r)\cdot\cos(2\pi r)\tag{16}
L=αβ=T4⋅(T−t+1)⋅sin(2πr)⋅cos(2πr)(16)变量
L
L
L有助于SDO算法在勘探和开发之间平稳过渡。
∣
L
∣
<
1
|L|<1
∣L∣<1属稳定模式,通过调整供应权重
α
\alpha
α和需求权重
β
\beta
β得到均衡价格
x
0
x_0
x0周围不同的商品价格,这些商品价格可以通过随机数r在当前价格和均衡价格之间随机变化,稳定模式机制强调“开发”以改善SDO算法的局部勘探能力。
∣
L
∣
>
1
|L|>1
∣L∣>1属非稳定模式,它允许任何市场中的商品价格远离均衡价格,非稳定模式机制迫使每个市场在搜索空间中加强“勘探”未知区域以提高SDO算法的全局搜索能力。
图1描述了变量
L
L
L迭代的值,其中最大迭代次数
T
T
T设置为1000。如图所示,在早期迭代中,
L
L
L值大于1或小于-1的概率很高。随着迭代次数的增加,这种高概率开始减少,函数值在
[
−
1
,
1
]
[-1,1]
[−1,1]中的概率也在增加。在以后的迭代中,
L
L
L值在
[
−
1
,
1
]
[-1,1]
[−1,1]中的概率越来越高。显然,SDO在迭代的早期阶段得到了高度的探索,并在迭代的后期阶段平滑地切换到高度开发。
SDO通过随机创建一组市场开始优化。在每次迭代中,市场的每个商品数量都会根据均衡价格和均衡数量进行更新,然后市场的每个商品价格都会根据均衡价格进行更新。均衡价格可以根据其在价格数组中的概率和商品价格的平均值在价格数组中选择的商品价格之间随机切换。均衡数量根据其概率从商品数量中选择。商品价格和数量的更新是通过调整
α
\alpha
α和
β
\beta
β的权重值来实现的。为了进行探索或开发,变量
L
L
L的值随随机波动而降低。当
∣
L
∣
>
1
| L |>1
∣L∣>1时,市场商品价格倾向于偏离均衡价格,当
∣
L
∣
<
1
| L |<1
∣L∣<1时,市场商品价格趋向于接近均衡价格。然后通过适应度函数对更新后的价格向量和数量向量进行评估。对于每个市场,如果其商品数量的适应度值优于其商品价格的适合度值,则其商品价格将替换为商品数量作为候选解决方案。最终,当满足停止标准时,返回市场的最佳商品价格向量,作为迄今为止找到的最佳解决方案。SDO算法的伪代码如图2所示。
将SDO与DE、CS和GSA进行对比,以文献[1]中的F1、F2(单峰函数/30维)、F10、F11(多峰函数/30维)、F18、F19(固定维度多峰函数/2维、3维)为例,种群规模设置为50,最大迭代次数设置为1000,每个算法独立运算30次。结果显示如下:
函数:F1 SDO:最差值: 0,最优值: 0,平均值: 0,标准差: 0 DE:最差值: 3.2459e-12,最优值: 5.1533e-13,平均值: 1.6181e-12,标准差: 7.0789e-13 CS:最差值: 0.018637,最优值: 0.0041907,平均值: 0.00925,标准差: 0.0035382 GSA:最差值: 3.6491e-17,最优值: 1.1564e-17,平均值: 2.1624e-17,标准差: 6.1163e-18 函数:F2 SDO:最差值: 1.3562e-221,最优值: 8.3254e-250,平均值: 7.4562e-223,标准差: 0 DE:最差值: 5.7666e-08,最优值: 2.3806e-08,平均值: 3.7317e-08,标准差: 7.4574e-09 CS:最差值: 3.9717,最优值: 0.57752,平均值: 1.4775,标准差: 0.79205 GSA:最差值: 3.266e-08,最优值: 1.6686e-08,平均值: 2.367e-08,标准差: 3.7802e-09 函数:F10 SDO:最差值: 8.8818e-16,最优值: 8.8818e-16,平均值: 8.8818e-16,标准差: 0 DE:最差值: 4.571e-07,最优值: 1.6143e-07,平均值: 3.3331e-07,标准差: 6.7617e-08 CS:最差值: 10.2657,最优值: 1.8735,平均值: 4.2762,标准差: 1.7889 GSA:最差值: 4.5218e-09,最优值: 2.813e-09,平均值: 3.6258e-09,标准差: 4.4603e-10 函数:F11 SDO:最差值: 0,最优值: 0,平均值: 0,标准差: 0 DE:最差值: 1.3385e-10,最优值: 2.8634e-12,平均值: 2.7485e-11,标准差: 3.4877e-11 CS:最差值: 0.16107,最优值: 0.031708,平均值: 0.10017,标准差: 0.029381 GSA:最差值: 7.3898,最优值: 2.1345,平均值: 4.2402,标准差: 1.4944 函数:F18 SDO:最差值: 3,最优值: 3,平均值: 3,标准差: 1.1516e-15 DE:最差值: 3,最优值: 3,平均值: 3,标准差: 1.9877e-15 CS:最差值: 3,最优值: 3,平均值: 3,标准差: 1.0066e-15 GSA:最差值: 3,最优值: 3,平均值: 3,标准差: 1.7897e-15 函数:F19 SDO:最差值: -3.8628,最优值: -3.8628,平均值: -3.8628,标准差: 2.7101e-15 DE:最差值: -3.8628,最优值: -3.8628,平均值: -3.8628,标准差: 2.7101e-15 CS:最差值: -3.8628,最优值: -3.8628,平均值: -3.8628,标准差: 2.7101e-15 GSA:最差值: -3.0822,最优值: -3.8628,平均值: -3.5463,标准差: 0.25706
结果表明,SDO算法能够在探索、开发、避免局部最优和收敛速度方面得到很好的结果。
焊接梁设计问题具体请参考这里。仿真实验中,5种算法的运行次数、种群规模和最大迭代次数都保持一致,即
N
=
50
,
T
=
500
N=50,T=500
N=50,T=500,每种算法分别独立运行30次。结果显示如下:
DE:最差值: 3.3615,最优值: 1.9778,平均值: 2.7004,标准差: 0.39933,秩和检验: 3.0199e-11 CS:最差值: 1.7015,最优值: 1.6957,平均值: 1.6975,标准差: 0.0014562,秩和检验: 3.0199e-11 GSA:最差值: 4.1401,最优值: 2.0054,平均值: 2.9979,标准差: 0.55662,秩和检验: 3.0199e-11 SDO:最差值: 1.6952,最优值: 1.6952,平均值: 1.6952,标准差: 9.0225e-08,秩和检验: 1
实验结果表明:SDO在求解焊接梁设计约束优化问题时具有优越的性能。
本文采用0/1覆盖模型。设监测区域为
50
m
×
50
m
50 m×50 m
50m×50m的二维平面,传感器节点个数
N
=
35
N=35
N=35,其感知半径是
R
s
=
5
m
R_s=5m
Rs=5m,通信半径
R
c
=
10
m
R_c=10m
Rc=10m,迭代500次。初始部署、SDO优化覆盖、SDO算法覆盖率进化曲线如下图所示。
初始部署和最终部署的节点位置及对应的覆盖率分别为:
初始位置: 5.6582 37.4245 23.1577 34.8591 13.2724 24.4803 24.8642 12.5946 32.7883 46.4487 7.8353 18.4138 18.3774 3.5258 45.8099 36.9291 44.0056 21.116 18.9288 41.8486 3.3807 14.3399 26.4406 37.2905 45.614 47.6354 19.0823 6.0845 24.7767 48.3064 0.37507 23.0336 3.4123 46.5971 40.1028 0.58516 15.0606 38.449 7.1656 26.5867 18.9867 30.3204 19.7615 16.8684 44.2607 28.5768 18.9665 9.827 12.8224 36.2787 34.4507 24.5613 42.4493 39.2337 25.6159 26.5446 35.0056 35.9155 1.704 2.3365 22.2871 32.6603 28.7723 47.0198 12.7802 45.1629 48.4652 2.7958 38.0223 34.0163 初始覆盖率:0.71434 最优位置: 18.2297 17.9504 46.7946 27.2327 22.4647 1.391 40.6251 40.5068 33.4091 3.8476 27.6412 46.6652 27.3794 15.8952 20.737 38.5994 45.3512 18.2282 3.7902 5.3513 14.9054 31.161 17.3529 46.7079 36.5573 12.9072 33.2656 31.4272 29.3992 40.5606 9.3408 13.7054 46.8982 32.6605 11.3766 39.3557 9.9051 25.4657 12.6419 2.6447 4.1495 45.4464 40.237 24.8203 45.8554 10.4365 17.888 9.546 25.0576 21.2343 34.3161 21.9932 24.7155 31.6475 37.1252 46.899 3.5699 22.2425 42.872 5.7517 18.1397 25.8205 37.4114 34.7203 26.4583 9.4486 3.3356 35.3194 47.1419 45.7288 最优覆盖率:0.89081
实验结果表明,SDO能够有效提升WSN的覆盖率,使节点分布更加均匀。
[1] W. Zhao, L. Wang, Z. Zhang. Supply-Demand-Based Optimization: A Novel Economics-Inspired Algorithm for Global Optimization[J]. IEEE Access, 2019, 7: 73182-73206.
[2] 崔东文, 李代华. 基坑变形预测的改进供需优化算法-指数幂乘积模型[J]. 水利水电科技进展, 2020, 40(4): 43-50.