【禁忌搜索算法】基于禁忌搜索算法求解函数极值问题含Matlab源码
【禁忌搜索算法】基于禁忌搜索算法求解函数极值问题含Matlab源码
TT_Matlab
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,完整matlab代码或者程序定制加qq1575304183。
1 简介
2 完整代码
%%%
%%%
%%%
%%%
%%%
%禁忌搜索算法求函数极值问题
%%%
%%%
%%%
%%%
%%%
%%%
%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
初始化
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
xu=
5
; %上界
xl=-
5
; %下界
L=randi([
5
11
],
1
,
1
); %禁忌长度取
5
,
11
之间的随机数
Ca=
5
; %邻域解个数
Gmax=
200
; %禁忌算法的最大迭代次数;
w=
1
; %自适应权重系数
tabu=[]; %禁忌表
x
0
=rand(
1
,
2
)*(xu-xl)+xl; %随机产生初始解
bestsofar.key=x
0
; %最优解
xnow(
1
).key=x
0
; %当前解
%%%
%%%
%%%
%%%
%%%
%最优解函数值,当前解函数值
%%%
%%%
%%%
%%%
%%%
%%
bestsofar.value=func2(bestsofar.key);
xnow(1).value=func2(xnow(1).key);
g=1;
while g<Gmax
x_near=[]; %
邻域解
w=w*
0
.
998
;
for
i=
1
:Ca
%%%
%%%
%%%
%%%
%%%
%%%
%%%
产生邻域解
%%%
%%%
%%%
%%%
%%%
%%%
%%
x_temp=xnow(g).key;
x1=x_temp(1);
x2=x_temp(2);
x_near(i,1)=x1+(2*rand-1)*w*(xu-xl);
%
%%%
%%%
%%%
%%%
%%%
%边界条件处理
%%%
%%%
%%%
%%%
%%%
%%%
%
%%%
%%%
%%%
%%%
%%%
%%%
%边界吸收
%%%
%%%
%%%
%%%
%%%
%%%
%%%
if
x_near(i,
1
)<xl
x_near(i,
1
)=xl;
end
if
x_near(i,
1
)>xu
x_near(i,
1
)=xu;
end
x_near(i,
2
)=x2+(
2
*rand-
1
)*w*(xu-xl);
%%%
%%%
%%%
%%%
%%%
%%边界条件处理%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%边界吸收
%%%
%%%
%%%
%%%
%%%
%%%
%%%
if
x_near(i,
2
)<xl
x_near(i,
2
)=xl;
end
if
x_near(i,
2
)>xu
x_near(i,
2
)=xu;
end
%%%
%%%
%%%
%%%
%%计算邻域解点的函数值%
%%%
%%%
%%%
%%%
%%%
%%%
fitvalue_near(i)=func2(x_near(i,
:
));
end
%%%
%%%
%%%
%%%
%%%
%%%
%%最优邻域解为候选解%
%%%
%%%
%%%
%%%
%%%
%%%
temp=find(fitvalue_near==max(fitvalue_near));
candidate(g).key=x_near(temp,
:
);
candidate(g).value=func2(candidate(g).key);
%%%
%%%
%%%
%%%
%%候选解和当前解的评价函数差%
%%%
%%%
%%%
%%%
%%%
%%
delta1=candidate(g).value-xnow(g).value;
%
%%%
%%%
%%%
%%%
%候选解和目前最优解的评价函数差
%%%
%%%
%%%
%%%
%%%
delta2=candidate(g).value-bestsofar.value;
%%%
%%候选解并没有改进解,把候选解赋给下一次迭代的当前解%
%%%
%%
if delta1<=0
xnow(g+1).key=candidate(g).key;
xnow(g+1).value=func2(xnow(g).key);
%
%%%
%%%
%%%
%%%
%%%
%%%
%%更新禁忌表%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%
tabu=[tabu;xnow(g+
1
).key];
if
size(tabu,
1
)>L
tabu(
1
,
:
)=[];
end
g=g+
1
; %更新禁忌表后,迭代次数自增
1
%%%
%%%
%如果相对于当前解有改进,则应与目前最优解比较
%%%
%%%
%%%
%
else
if
delta2>
0
%候选解比目前最优解优
%%%
%%%
%%%
%把改进解赋给下一次迭代的当前解
%%%
%%%
%%%
%%%
xnow(g+
1
).key=candidate(g).key;
xnow(g+
1
).value=func2(xnow(g+
1
).key);
%%%
%%%
%%%
%%%
%%%
%%%
%%更新禁忌表%
%%%
%%%
%%%
%%%
%%%
%%%
%%
tabu=[tabu;xnow(g+1).key];
if size(tabu,1)>L
tabu(1,:)=[];
end
%
%%%
%%%
%把改进解赋给下一次迭代的目前最优解
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%包含藐视准则%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%
bestsofar.key=candidate(g).key;
bestsofar.value=func2(bestsofar.key);
g=g+
1
; %更新禁忌表后,迭代次数自增
1
else
%%%
%%%
%%%
%%%
%%%
判断改进解时候在禁忌表里
%%%
%%%
%%%
%%%
%%%
[M,N]=size(tabu);
r=
0
;
for
m=
1
:M
if
candidate(g).key(
1
)==tabu(m,
1
)...
& candidate(g).key(
2
) == tabu(m,
1
)
r=
1
;
end
end
if
r==
0
%%改进解不在禁忌表里,把改进解赋给下一次迭代的当前解
xnow(g+1).key=candidate(g).key;
xnow(g+1).value=func2(xnow(g+1).key);
%
%%%
%%%
%%%
%%%
%%%
%%%
%%更新禁忌表%
%%%
%%%
%%%
%%%
%%%
%%
tabu=[tabu;xnow(g).key];
if size(tabu,1)>L
tabu(1,:)=[];
end
g=g+1; %
更新禁忌表后,迭代次数自增
1
else
%%%
如果改进解在禁忌表里,用当前解重新产生邻域解
%%%
%%
xnow(g).key=xnow(g).key;
xnow(g).value=func2(xnow(g).key);
end
end
end
trace(g)=func2(bestsofar.key);
end
bestsofar; %
最优变量及最优值
figure
plot(trace);
xlabel(
’迭代次数’
)
ylabel(
’目标函数值’
)
title(
’搜索过程最优值曲线’
)
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%适配值函数
%%%
%%%
%%%
%%%
%%%
%%%
%%%
%%%
function y=func2(x)
y=(cos(x(
1
)^
2
+x(
2
)^
2
)-
0
.
1
)/(
1
+
0
.
3
*(x(
1
)^
2
+x(
2
)^
2
)^
2
)+
3
;
3 运行结果
4 参考文献
[1]戚峰, 俞晶菁, 黄召杰. 基于禁忌搜索算法求解车间作业调度问题[J]. 兰州交通大学学报, 2011, 30(3):7.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
-
2023年血糖新标准公布,不是3.9-6.1,快来看看你的血糖正常吗? 2023-02-07
-
2023年各省最新电价一览!8省中午执行谷段电价! 2023-01-03
-
GB 55009-2021《燃气工程项目规范》(含条文说明),2022年1月1日起实施 2021-11-07
-
PPT导出高分辨率图片的四种方法 2022-09-22
-
2023年最新!国家电网27家省级电力公司负责人大盘点 2023-03-14
-
全国消防救援总队主官及简历(2023.2) 2023-02-10
-
盘点 l 中国石油大庆油田现任领导班子 2023-02-28
-
我们的前辈!历届全国工程勘察设计大师完整名单! 2022-11-18
-
关于某送变电公司“4·22”人身死亡事故的快报 2022-04-26
