我正在研究一种进化算法。该代码在Matlab中实现。 “本地搜索”步骤如下:
%% Local Search
for iter2 = 1:MaxIter2
v = ceil(number_Best*rand);
w = ceil(number_Best*rand);
Best1 = Best_History(v,:);
Best2 = Best_History(w,:);
[New_Best,New_fBest] = two_way(Best1,Best2,SE,nodes_number);
Best_History = [Best_History;New_Best];
fBest_History = [fBest_History;New_fBest];
end
该算法运行良好,并且输出可接受。为了提高输出效果,我决定在本地搜索阶段使用“模拟退火”算法。这是我建议的实现,已由上述本地搜索代替:
%% Local Search
%SA Parameters
MaxIt=40; % Maximum Number of Iterations
MaxSubIt=15; % Maximum Number of Sub-iterations
T0=0.025; % Initial Temp.
alpha=0.99; % Temp. Reduction Rate
% Initialize Temp.
T=T0;
for iter2 = 1:MaxIt
for subit=1:MaxSubIt
v = ceil(number_Best*rand);
w = ceil(number_Best*rand);
Best1 = Best_History(v,:);
Best2 = Best_History(w,:);
[New_Best,New_fBest] = two_way(Best1,Best2,SE,nodes_number);
if New_fBest>=fBest_History
Best_History = [Best_History;New_Best];
fBest_History = [fBest_History;New_fBest];
else
DELTA=(New_fBest-fBest_History)/fBest_History;
P=exp(-DELTA/T);
if rand<=P
Best_History = [Best_History;New_Best];
fBest_History = [fBest_History;New_fBest];
end
end
% Update Best Solution Ever Found
if New_fBest>=fBest_History
Best_History = [Best_History;New_Best];
fBest_History = [fBest_History;New_fBest];
end
end
% Store Best Solution Ever Found
Best_History = [Best_History;New_Best];
fBest_History = [fBest_History;New_fBest];
% Update Temp.
T=alpha*T;
end
代码运行没有错误。但是,输出与“旧”本地搜索方法的输出完全相同。显然,这段代码不会影响进化算法的整个过程(但会影响运行时间)。您能告诉我我的SA算法实现有什么问题吗?
我也不确定SA变量的初始化值。有什么建议吗?
答案 0 :(得分:1)
我不确定您的代码,但是我根据目标函数 f ,域间隔Omega,邻域函数 N <构造了SA方法的伪代码。 / em>用于计算随机向量 z ^ k 和最高温度 T_0 。而且,我假设温度在每次迭代时都会更新:
将此与您的代码进行比较,我发现:
您没有在1和值P之间应用min函数
必须始终将T0和alpha值调整为您要最小化的函数,但是T0的值必须高得多,而alpha则要低。
SA方法需要大量迭代,请尝试增加它!
关于SA变量的初始化值,您应该在域内尽可能地随意。在循环中,您可以使用正态分布(matlab中的函数为 normrnd )以最佳值作为分布的平均值来生成新值。
希望它有所帮助!