31禁忌搜索算法函数寻优--视频分享
禁忌搜索算法函数寻优百度网盘链接:链接:http://pan.baidu.com/s/1o8K2c4M 密码:9bss
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
代码如下:
function bestsofar=ts(x0)
%%禁忌算法部分,是用来求最大值
%%产生五个领域点
%%bestsofar,保存到目前为止最优值
%%candidate,保存候选解
%%xnow,当前解
xu=6;%上界
xl=-6;%下界
L=randi();%%禁忌长度6,13之间的随机数
Gmax=200;%%禁忌算法的最大迭代次数;
Gm=80;
scale=1;
%%把禁忌表设成队列形式
tabu=[];%%禁忌表
%%把初始解赋给目前最优解,把初始解赋给当前解
bestsofar.label=x0;
xnow(1).label=x0;
bestsofar.value=fitvalue(bestsofar.label);%%有遗传算法算出的子种群最优个体适应值
xnow(1).value=fitvalue(xnow(1).label);%%当前解的适应度值
g=1;
while g<Gmax
x_near=[];
scale=scale*0.998;
%%用当前解,产生五个领域点
for i=1:5
x_temp=xnow(g).label;
x1=x_temp(1);
x2=x_temp(2);
if g<Gm
x_near(i,1)=x1+(2*rand-1)*scale*(xu-xl);
x_near(i,1)=adjust(x_near(i,1));%%做调整
x_near(i,2)=x2+(2*rand-1)*scale*(xu-xl);
x_near(i,2)=adjust(x_near(i,2));%%做调整
else
k1=randi();
x_near(i,k1)=x_temp(k1)+(2*rand-1)*scale*(xu-xl);
x_near(i,k1)=adjust(x_near(i,k1));%%做调整
k2=setxor(,k1);%%返回不在和k1交集的元素
x_near(i,k2)=x_temp(k2);
x_near(i,k2)=adjust(x_near(i,k2));
end
fitvalue_near(i)=fitvalue(x_near(i,:)); %%计算领域点的适应值
end
temp=find(fitvalue_near==max(fitvalue_near));
candidate(g).label=x_near(temp,:);%%候选解,候选解是领域集合里面的最优解
candidate(g).value=fitvalue(candidate(g).label);%%候选解的适应度值
delta1=candidate(g).value-xnow(g).value; %%候选解和目前最优解的评价函数差
delta2=candidate(g).value-bestsofar.value; %%候选解和当前解的评价函数差
if delta1<=0 %%说明候选解并没有改进解,把候选解赋给下一次迭代的当前解,当候选解比当前解优时,称候选解为改进解
xnow(g+1).label=candidate(g).label;
xnow(g+1).value=fitvalue(xnow(g).label);
tabu=;%%更新禁忌表
if size(tabu,1)>L%%禁忌表里的元素比L多时,把最先进去的元素移出禁忌表
tabu(1,:)=[];
end
g=g+1;%%更新禁忌表后,迭代次数自增1
else %%如果相对于当前解有改进,则应与目前最优解比较
if delta2>0%%说明候选解比目前最优解优
%%把改进解(候选解)赋给下一次迭代的当前解
xnow(g+1).label=candidate(g).label;
xnow(g+1).value=fitvalue(xnow(g+1).label);
tabu=;%%更新禁忌表
if size(tabu,1)>L%%禁忌表里的元素比L多时,把最先进去的元素移出禁忌表
tabu(1,:)=[];
end
%%把改进解(候选解)赋给下一次迭代的目前最优解,此处包含了藐视法则
bestsofar.label=candidate(g).label;
bestsofar.value=fitvalue(bestsofar.label);
g=g+1;%%更新禁忌表后,迭代次数自增1
%%把改进解(候选解)赋给下一次迭代的目前最优解,此处包含了藐视法则
else
ifjudge(candidate(g).label,tabu)==0 %%判断改进解(候选解)时候在禁忌表里,0表示不在,1表示在
%%改进解不在禁忌表里,把改进解(候选解)赋给下一次迭代的当前解
xnow(g+1).label=candidate(g).label;
xnow(g+1).value=fitvalue(xnow(g+1).label);
tabu=;%%更新禁忌表
if size(tabu,1)>L%%禁忌表里的元素比L多时,把最先进去的元素移出禁忌表
tabu(1,:)=[];
end
g=g+1;%%更新禁忌表后,迭代次数自增1
else
%%如果改进解在禁忌表里,用当前解重新产生领域点,寻找候选解
xnow(g).label=xnow(g).label;
xnow(g).value=fitvalue(xnow(g).label);
end
end
end
end
haohoahoahaohaoahoa 好好,非常好。 禁忌搜索算法,多谢分享。 函数优化的禁忌搜索 我要程序送达 学习一下,谢谢分享~ 好详细的介绍,学习到了,不过根据的相关公式能否提供呢 禁忌搜索在路径选择时也是一个很好的方法
页:
[1]