⛄一、差分进化算法简介
如同所有的优化算法一样, 差分进化算法基于种群的进化算法。差分进化算法主要的参数主要有种群规模NP, 解空间的维数D, 缩放因子F和交叉概率Cr。D维矢量XGi=[xGi,1, xGi,2, …, xi, DG], i=1, 2, …, Np, 表示G代第i个个体。变异和交叉操作在每一代中产生新的种群, 然后选择操作实现种群优化。基本差分进化算法过程如下。
1 变异
通过变异操作, 新产生的个体由初始种群中任意选取的个体加上任意选取的两个个体的差分量乘以缩放因子。根据如下所示, 缩放因子我们采用自适应缩放因子, 如公式 (1) 所示。
VG+1i=xGr1+F (xGr2-xGr3) (1)
r1, r2, r3∈{1, 2, …, Np}任意选择且互不相等, 并且和i也不相等。缩放因子F控制着差分量 (xr2G-xr3G) 的大小。
2 交叉
交叉操作用来增加种群多样性, UG+1i,j表示第i个个体交叉个体第j个分量, rand ( ) 表示在[0, 1]区间任取的随机数, Cr是交叉概率, 而条件j=rand (0, D) 是为了确保试验个体中至少有一位是由VG+1i贡献的, 增加试验个体的多样性。交叉时我们采用分组交叉思想, 增强算法的局部搜索能力。
UG+1i,j={VG+1i,[rand()≤CR或j=rand(0,D)]xGi,j,其他 (2)
3 选择
选择操作是为了决定交叉个体是否保留到G+1代。对于最小化问题, 交叉个体UG+1i,j和原始个体通过贪婪策略进行比较, 目标函数更小的个体被保留作为新产生的种群个体。选择操作公式如下所示
这里的f (x) 代表目标函数, XiG+1代表新产生的种群个体。
文中算法改进主要有2方面。算法的参数值在算法开始时已经被设定, 随着迭代次数的改变, 可能不适应种群变化的要求。差分算法的控制参数主要有缩放因子 (F) 和交叉概率 (Cr) 。缩放因子 (F) 的大小决定了算法的收敛速度和种群的多样性, 在进化过程中发挥着重要的作用。选择合适的F能够平衡算法全局搜索和局部搜索。较小的F有助于提高算法的局部搜索能力, 但同时也增加了算法陷入局部最优, 出现早熟的可能性;而较大的F有利于增加种群的多样性, 提高全局寻优能力, 但会降低算法的收敛速度。我们提出了一种自适应的缩放因F, 使缩放因子能够随着迭代次数的改变, 适应当前种群的变化情况, 使得最优解可以保存。颜学峰, 余娟等也提出了自适应差分进化算法[7]748, 主要改进了算法的全局寻优能力。本文提出的自适应的缩放因子可以从以下公式得出
F=0.8[ (Gmax-G+1) /Gmax] (4)
Gmax是种群最大迭代次数, G是种群当前迭代次数。同时为了能够更早的找到最优解, 减少算法的计算量。在交叉过程中, 我们采用种群分组交叉思想。经种群变异产生的子代个体, 通过比较其适应度大小, 适应度更好的个体直接进入选择操作, 而剩下的个体根据交叉概率选择性的进入选择操作。通过分组交叉, 可以大大提高种群搜索到最优解的概率, 同时增加算法的健壮性。
⛄二、部分源代码
%-----------------------参数定义及初始化-------------------------
close all;
clc,clear;
NP=50; %种群个体数量
D=37; %染色体长度,这里有36旬,共37个节点蓄水量
G=2000; %迭代代数
F0=0.5; %缩放因子[0,2],一般取0.5
CR=0.3; %交叉率[0,1],一般取0.3,增大会更快收敛,造成早熟
Inf=10^20; %罚因子
K=8; %水库出力系数
%尾水曲线的三个参数 Zd=aq^2+bq+d
a=0.0000000011101;
b=0.0000836;
d=65.5;
%水库的水位库容曲线
zu=[130 135 140 145 150 155 160 165 170 175 185];
V=[103.3 124.1 147 171.5 196.9 228 262 300.2 344 393 445.7];
%各旬初的最低水位与最高水位
Zmin=[155 155 155 155 155 155 155 155 155 155 145 145 145 145 145 145 145 145 …
145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 145 155];
Zmax=[175 175 175 175 175 175 175 175 175 175 175 175 175 175 170 155 146.5 146.5 146.5 …
146.5 146.5 146.5 146.5 146.5 146.5 165 165 175 175 175 175 175 175 175 175 175 175];
%内插各旬初的最低蓄水量与最高蓄水量
Vmin=[228,228,228,228,228,228,228,228,228,228,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,171.5,228];
Vmax=[393,393,393,393,393,393,393,393,393,393,393,393,393,393,344,228,179.12,179.12,179.12,179.12,179.12,179.12,179.12,179.12,179.12,300.2,300.2,393,393,393,393,393,393,393,393,393,393];
%各旬入库流量
Q=[5323 5351 4467 3967 4000 4382 4984 5037 4962 6194 7709 5354 6993 11091 12918 14778 15566 17060 …
27816 32798 33851 23446 20049 14796 17779 21637 17266 11754 10443 9019 7725 7244 6161 5424 5471 5250];
%各旬的最小下泄流量
qmin=[6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 5700 5700 5700 5700 5700 5700 …
5700 5700 5700 5700 5700 5700 5700 5700 10000 10000 8000 8000 5700 5700 5700 5700 5700 5700];
%各旬的时段长,h
dt=[240 240 264 240 240 192 240 240 264 240 240 240 240 240 264 240 240 240 …
240 240 264 240 240 264 240 240 240 240 240 264 240 240 240 240 240 240];
Z0=174; %调度期初水位约束
ZT=173; %调度期末水位约束
V0=interp1(zu,V,Z0); %调度期初蓄量约束
VT=interp1(zu,V,ZT); %调度期末蓄量约束
%种群初始化
for i=1:1:NP
x=init(i,x); %生成一个时间序列,满足水位约束
q(i,:)=-(diff(x(i,:)))10^8./(3600dt) + Q; %q为出库流量
end
% 计算目标参数
Vmean=(conv2(x’,[1;1],‘valid’))'/2; %用conv2求相邻旬蓄量平均值
Zu=interp1(V,zu,Vmean); %根据库容曲线内插得到上游水位
Zd=aq.^2+bq+d; %根据尾水曲线公式生成下游水位
N=Kq.(Zu-Zd); %各旬的出力
N(N>Nmax)=Nmax; %出力超过装机容量的旬时段改为装机容量
E=N.dt; %各旬的发电量
Fit=E+Infmin((N-Nmin)/Nmin,0)+Inf*min((q-qmin)./qmin,0); %适应度矩阵
ob=sum(Fit,2); %适应度矩阵每一行的和
trace(1)=max(ob); %记录下适应度最大值
⛄三、运行结果
⛄四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]周萧,王万良,徐新黎.解决作业车间调度问题的混合差分进化算法[J].轻工机械. 2010,28(05)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除