1.题目
其中
x=[0.0221911365005748 0.0151331609473779 0.0122589338442028 0.00896321217501718 0.0115736574045548 0.00961340045180030 0.00770704215908083 0.00832454657016513];
y=[150 310 590 910 1800 4030 11500 36500];
2.思路
运用智能算法,关键是要注意其适应度函数的选择,还有注意其是否有约束条件,以及要问的问题是什么。这里以预测值和真实值的误差平方作为适应度函数。且其有约束条件。
3.代码实现
3.1遗传算法
%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%
%初始化
clear all; %清除所有变量
close all; %清图
clc; %清屏
D=4; %单染色体上的基因数(即4个变量)(每个基因采用4进制)
NP=100; %染色体数目(初始化种群的数目)
Xs=[0.1 0 1 0]'; %变量上限
Xx=[0 -2 0 -5]'; %变量下限
G=1000; %最大遗传代数
f=zeros(D,NP); %初始种群赋空间 创建一个4*100的0矩阵
nf=zeros(D,NP); %子种群赋空间 创建一个4*100的0矩阵
Pc=0.8; %交叉概率
Pm=0.1; %变异概率
f=rand(D,NP).*(Xs-Xx)+Xx; %随机获得初始种群(4进制的种群),维数4*100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%按适应度升序排列
for np=1:NP
MSLL(np)=shiyingdu(f(:,np)); %计算个染色体的适应度
end
[SortMSLL,Index]=sort(MSLL); %sort对数组元素按升序排列 SortMSLL放排序后的数 Index放排序后的位置
Sortf=f(:,Index); %将适应度按升序排列
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%遗传算法循环
for gen=1:G
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%采用君主方案进行选择交叉操作
Emper=Sortf(:,1); %君主染色体(即最好的一个)
NoPoint=round(D*Pc); %每次交叉点的个数 round取整函数
PoPoint=randi([1 D],NoPoint,NP/2); %交叉基因的位置
nf=Sortf;
%%%50个个体交叉
for i=1:NP/2
nf(:,2*i-1)=Emper; %将所有的奇数项换为君主染色体
nf(:,2*i)=Sortf(:,2*i); %偶数项不变
for k=1:NoPoint
nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);
nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%变异操作
for m=1:NP %对所有个体进行变异
for n=1:D %每个基因都可能变异
r=rand(1,1);
if r<Pm
nf(:,m)=rand(1,1).*(Xs-Xx)+Xx; %变异操作
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%子种群按适应度升序排列
for np=1:NP
NMSLL(np)=shiyingdu(nf(:,np));
end
[NSortMSLL,Index]=sort(NMSLL);
NSortf=nf(:,Index);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%产生新种群
f1=[Sortf,NSortf]; %子代和父代合并
MSLL1=[SortMSLL,NSortMSLL]; %子代和父代的适应度值合并
[SortMSLL1,Index]=sort(MSLL1); %适应度按升序排列
Sortf1=f1(:,Index); %按适应度排列个体
SortMSLL=SortMSLL1(1:NP); %取前NP个适应度值(这个地方有子代变为父代了)
Sortf=Sortf1(:,1:NP); %取前NP个个体
trace(gen)=SortMSLL(1); %历代最优适应度值
end
Bestf=Sortf(:,1) %最后最优个体
trace(end) %最优值 end为取最后一个值
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
figure(2);
b=[150,310,590,910,1800,4030,11500,36500];
x=Bestf(1).*b.^(Bestf(2))+Bestf(3).*b.^(Bestf(4));
plot(b,x,'b-.');
hold on;
a=[0.0221911365005748,0.0151331609473779,0.0122589338442028,0.00896321217501718,0.0115736574045548,0.00961340045180030,0.00770704215908083,0.00832454657016513];
plot(b,a,'k-*');
legend('拟合值','真实值');
xlabel('y');
ylabel('x');
适应度进化曲线为
拟合值与真实值为
最终结果为
3.2蚁群算法
close all; %清图
clc; %清屏
m=20; %蚂蚁个数
minX_max=200; %最大迭代次数
Rho=0.9; %信息素蒸发系数
P0=0.2; %转移概率常数
S=[0.1 0 1 0];
L=[0 -2 0 -5];
%%%%%%%%%%%%%%%%%随机设置蚂蚁初始位置%%%%%%%%%%%%%%%%%%%%%%
for i=1:m
X(i,:)=(L+(S-L)*rand);
Tau(i)=shiyingdu(X(i,:));
end
step=0.1; %局部搜索步长
for NC=1:minX_max
lamda=1/NC;
[Tau_best,BestIndex]=min(Tau);
%%%%%%%%%%%%%%%%%%计算状态转移概率%%%%%%%%%%%%%%%%%%%%
for i=1:m
P(NC,i)=(Tau(BestIndex)-Tau(i))/Tau(BestIndex);
end
%%%%%%%%%%%%%%%%%%%%%%位置更新%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:m
%%%%%%%%%%%%%%%%%局部搜索%%%%%%%%%%%%%%%%%%%%%%
if P(NC,i)<P0
temp=X(i,:)+(2*rand-1)*step*lamda;
else
%%%%%%%%%%%%%%%%全局搜索%%%%%%%%%%%%%%%%%%%%%%%
temp=X(i,:)+(S-L)*(rand-0.5);
end
%%%%%%%%%%%%%%%%%%%%%边界处理%%%%%%%%%%%%%%%%%%%%%%%
% if temp1<XMIN
% temp1=XMIN;
% end
% if temp1>XMAX
% temp1=XMAX;
% end
% if temp2<YMIN
% temp2=YMIN;
% end
% if temp2>YMAX
% temp2=YMAX;
% end
%%%%%%%%%%%%%%%%%%蚂蚁判断是否移动%%%%%%%%%%%%%%%%%%
if shiyingdu(temp)<shiyingdu(X(i,:))
X(i,:)=temp;
end
end
%%%%%%%%%%%%%%%%%%%%%%%更新信息素%%%%%%%%%%%%%%%%%%%%%%%
for i=1:m
Tau(i)=(1-Rho)*Tau(i)+shiyingdu(X(i,:));
end
[value,index]=min(Tau);
trace(NC)=shiyingdu(X(index,:));
end
[min_value,min_index]=min(Tau);
minX=X(min_index,:) %最优变量
minValue=shiyingdu(X(min_index,:)) %最优值
figure
plot(trace)
xlabel('搜索次数');
ylabel('适应度值');
title('适应度进化曲线')
figure(2);
b=[150,310,590,910,1800,4030,11500,36500];
x=minX(1).*b.^(minX(2))+minX(3).*b.^(minX(4));
plot(b,x,'b-.');
hold on;
a=[0.0221911365005748,0.0151331609473779,0.0122589338442028,0.00896321217501718,0.0115736574045548,0.00961340045180030,0.00770704215908083,0.00832454657016513];
plot(b,a,'k-*');
legend('拟合值','真实值');
xlabel('y');
ylabel('x');
适应度进化曲线为:
结果: