如何在Matlab中将模拟退火算法实现为进化算法的本地搜索阶段?

时间:2019-04-04 14:09:35

标签: matlab simulated-annealing

我正在研究一种进化算法。该代码在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变量的初始化值。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我不确定您的代码,但是我根据目标函数 f ,域间隔Omega,邻域函数 N <构造了SA方法的伪代码。 / em>用于计算随机向量 z ^ k 和最高温度 T_0 。而且,我假设温度在每次迭代时都会更新:

enter image description here

将此与您的代码进行比较,我发现:

  1. 您没有在1和值P之间应用min函数

  2. 必须始终将T0和alpha值调整为您要最小化的函数,但是T0的值必须高得多,而alpha则要低。

  3. SA方法需要大量迭代,请尝试增加它!

  4. 关于SA变量的初始化值,您应该在域内尽可能地随意。在循环中,您可以使用正态分布(matlab中的函数为 normrnd )以最佳值作为分布的平均值来生成新值。

希望它有所帮助!