Halcom 发表于 2017-2-22 19:18:16

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





zzzlovez 发表于 2017-2-23 19:13:08

haohoahoahaohaoahoa

清风 发表于 2017-2-25 20:36:47

好好,非常好。

huwenping 发表于 2017-3-24 23:33:11

禁忌搜索算法,多谢分享。

醉生梦死2017 发表于 2017-4-30 22:32:37

函数优化的禁忌搜索

醉生梦死2017 发表于 2017-5-1 19:47:22

我要程序送达

luxian 发表于 2017-9-19 21:34:38

学习一下,谢谢分享~

菜鸟IDa 发表于 2020-7-14 20:58:53

好详细的介绍,学习到了,不过根据的相关公式能否提供呢

菜鸟IDa 发表于 2020-7-14 21:18:58

禁忌搜索在路径选择时也是一个很好的方法
页: [1]
查看完整版本: 31禁忌搜索算法函数寻优--视频分享