混沌优化算法
基于Logistic映射产生混沌运动轨道的遍历性,可将其混沌用于函数优化问题:
混沌优化算法的基本思想是将变量从混沌空间变换到解空间,然后利用混沌变量所具有的丰富的非线性动力学特征————随机性、遍历性、规律性的特点进行搜索。混沌优化算法易跳出局部最优解,不需要优化问题具有连续性和可微性。
变尺度混沌优化算法
以求目标函数:
带条件约束:
\begin{equation} s.t. \begin{cases} x_1+x_2+2x_3\le 3\\ x_1,x_2,x_3\ge 0\\ \end{cases} \end{equation}
step 1:应用Logistic方程产生混沌变量进行优化搜索:
step 2:随机产生初始为[0,1]区间内n个相异初值$$x_{0i}$$,得到n个轨迹不同的混沌变量。计算性能指标$$f(x_{0i})$$,$$x_{0i} =a+x_{0i}(b-a)$$。
step 3:根据混沌方程进行迭代,产生新解$$x_i\in \left[ 0,1 \right] $$。计算相应的性能指标$$f(x_{i}),x_{i} =a+x_{i}(b-a)$$。
step 4:如果$$f(x_i) < f(x_{i0})$$则接受新解$$x_{i0}=x_i$$(用于复制运算)
step 5:随机对新种群中部分解按照概率$$P_c$$进行交换运算
step 6:随机对新种群中部分解按照概率$$P_m$$进行变异运算,经过4~6后得到$$x_{1i} \in \left[ 0,1 \right] $$
step 7:如果$$f(x_{1i}) < f(x_{i0})$$,则接受新解$$x_{i0}=x_{1i}$$从中找出性能最好的个体$$X_c$$。转跳到步骤3.如果$$X_c$$在规定的迭代次数m里没有满足指定的误差要求搜索条件,则进行下一步骤8,否则结束。
step 8:以上一搜索结果$$X_c$$为中心,以$$\frac{r}{a}$$为半径,r为前一步的搜索半径,即前一步解空间的半径,a为r的衰减因子。以$$x_{k+1} = \mu \cdot x_k (1.0 -x_k)$$为搜索函数,重复步骤3~7,缩小范围进行搜索,直到满足误差要求。最终所得到的$$X_c,f(X_c)$$为全局最优。
注意:若$$x_i$$定义域包含负数,则可以通过混沌函数:$$x_{k+1} = \mu \cdot x^{3}_n - \mu x_n+x_n$$此时$$x_i$$在[-1,1]上遍历,目标函数为$$f(X),X=ax$$
代码如下:
(1)函数定义:
function myfunction=myfunction(x1,x2,x3)
myfunction=1-(2*x1^2+2*x2^2+x3^2+2*x1*x2+2*x1*x3-8*x1-6*x2-4*x3+9)
end
(2)设置吸收域:
function myjudge=myjudge(x1,x2,x3)
a=-x1-x2-2*x3+3;
if x1>0&&x2>0&&x3>0&&a>=0
myjudge=1;
else
myjudge=0;
end
(3)主函数:
%参数设置
num=3; %混沌变量
r=2;
for k=1:100
for z=1:100
X=rand(num,1);
TempX = r * X;
if myjudge(TempX(1), TempX(2), TempX(3)) == 1 %当TempX变量满足可行域时跳出循环
break
end
end
MaxX = TempX;
MaxF = myfun(MaxX(1), MaxX(2), MaxX(3)); %性能指标
for i = 2:5000
for j =1:num %X的每个变量做循环
X(j, i) = 4 * X(j, i - 1) * (1 - X(j, i - 1)); %logistic迭代
TempX(j) = r * X(j, i); %搜索半径为2
end
if myjudge(TempX(1), TempX(2), TempX(3))==1 %如果可行且性能更好,更换新解
TempF = myfun(TempX(1), TempX(2), TempX(3));
if TempF > MaxF
MaxX(j) = TempX(j);
MaxF = TempF;
end
end
end
%二次载波
X=rand(num,1);
for i = 2:5000
for j = 1:num
X(j, i) = 4 * X(j, i - 1) * (1 - X(j, i - 1));
end
end
for i = 1:5000
TempX = MaxX + 0.0001 * X(:, i);
if myjudge(TempX(1), TempX(2), TempX(3))==1
TempF = myfun(TempX(1), TempX(2), TempX(3));
if TempF > MaxF
MaxX(j) = TempX(j);
MaxF = TempF;
end
end
end
MaxF = vpa(MaxF, 4); %保留四位有效数字
for i = 1:num
MaxX(i) = vpa(MaxX(i), 4);
end
Max(k)=MaxF;
end
sz=subs(Max);
[m,n]=max(sz);
B=Max(n);%最大值
X=MaxX;%解