|
禁忌搜索算法函数寻优
百度网盘链接:链接: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]);%%禁忌长度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([1,2]);
- x_near(i,k1)=x_temp(k1)+(2*rand-1)*scale*(xu-xl);
- x_near(i,k1)=adjust(x_near(i,k1));%%做调整
- k2=setxor([1,2],k1);%%返回不在[1,2]和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=[tabu;xnow(g+1).label];%%更新禁忌表
- 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=[tabu;xnow(g+1).label];%%更新禁忌表
- if size(tabu,1)>L %%禁忌表里的元素比L多时,把最先进去的元素移出禁忌表
- tabu(1,:)=[];
- end
-
- %%把改进解(候选解)赋给下一次迭代的目前最优解,此处包含了藐视法则
- bestsofar.label=candidate(g).label;
- bestsofar.value=fitvalue(bestsofar.label);
- g=g+1;%%更新禁忌表后,迭代次数自增1
- %%把改进解(候选解)赋给下一次迭代的目前最优解,此处包含了藐视法则
- else
- if judge(candidate(g).label,tabu)==0 %%判断改进解(候选解)时候在禁忌表里,0表示不在,1表示在
- %%改进解不在禁忌表里,把改进解(候选解)赋给下一次迭代的当前解
- xnow(g+1).label=candidate(g).label;
- xnow(g+1).value=fitvalue(xnow(g+1).label);
- tabu=[tabu;xnow(g).label];%%更新禁忌表
- 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
复制代码
|
|