シミュレーテッドアニーリングとtsp問題に基づくMatlabの実装

この記事は「新人クリエーションセレモニー」活動に参加し、一緒にナゲットクリエーションの道を歩み始めました

定義とフローチャート

シミュレーテッドアニーリングアルゴリズムは、固体アニーリングの原理に基づいています。これは確率ベースのアルゴリズムです。固体は十分に高いレベルに加熱された後、ゆっくりと冷却されます。加熱中、固体内の粒子は、しかし、粒子が徐々に冷えると、各温度で平衡状態になり、最終的には室温で基底状態になり、内部エネルギーが最小になります。==これはシミュレーテッドアニーリングに関する人気のある科学ウェブサイトです==シミュレーテッドアニーリングシミュレーテッドアニーリングは主に3つの部分に分かれています:1。加熱プロセス。その目的は、平衡位置から離れる粒子の熱運動を強化することです。温度が十分に高い場合、固体は液体に溶け、それによってシステムの既存の不均一な状態を排除します。2.等温プロセス。周囲の環境と熱を交換し、温度が一定である閉鎖系の場合、システム状態の自発的な変化は常に自由エネルギーを減少させる方向にあり、自由エネルギーが最小になると、システムは平衡状態に達します。3.冷却プロセス。粒子の熱運動が弱まり、システム容量が減少し、結晶構造が得られます。インテリジェントなアルゴリズムとして、シミュレーテッドアニーリングを使用して、いくつかの複雑な問題の最適値を見つけることができます。たとえば、tsp問題でうまく使用できます。次に、著者は、Matlabでシミュレーテッドアニーリングに基づいてtsp問題を実装します。読者はシミュレーションをより深く理解することができます。アニーリングのプロセス。ここに画像の説明を挿入

トピックと分析

これがタイトルリンクのtspの例です。タイトルは英語で、読者は百度翻訳を使用して翻訳できます。トピック:ここに画像の説明を挿入

分析:最初に、n個の石がある要素の位置を除いて、各要素に対して0の行列を生成します。これらの非0要素の位置は、ブルドーザーが移動する座標です。タイトルの要件に従って、10個の非0要素があります(他の問題も同様です。データやその他の細部を変更します)。すべての点を通る最短経路を見つけます。これはtsp問題に変換できるため、非常によく知られています。さらに面倒なことをせずに、==Matlab==コードを見てください。

コードと結果

詳細なコードについては、私のWebサイトを参照してください:詳細なコード

clear
clc
T0 = 1000;      % 起始温度
Tend = 1e-3;    % 终止温度
L = 200;    % 各温度下的迭代次数
q = 0.9;    % 降温速率
position = [2 8
    1 1
    5 9
    10 3
    4 5
    7 1
    3 2
    6 4
    5 5
    9 3];

% 计算各点之间的距离矩阵
[m,n] = size(position);
D = zeros(m);
for i = 1:m
    for j = 1:m
        if i == j
            D(i,j) = 0;
        else
            D(i,j) = sqrt((position(i,1)-position(j,1))^2+(position(i,2)-position(j,2))^2);
        end
    end
end

s1 = randperm(m); % 产生一个解、画图并输出路径
drawpath(s1,position);
disp('一可行解的路径')
outputpath(s1);
r = pathlength(D,s1);
disp(['回路长度为:',num2str(r)]);
count = 0;

% 开始迭代
while T0 > Tend
    temp = zeros(L,m+1);
    count = count + 1;
    for k = 1:L
        s2 = newanswer(s1);
        [s1,r] = metropolis(s1,s2,D,T0);
        temp(k,:) = [s1,r];
    end
    % 记录每次迭代的最优路线
    [~,index] = min(temp(:,end));
    record(count) = temp(index,end);
    track(count,:) = temp(index,1:end-1); 
    T0 = q*T0;
end
% 画图显示结果
[~,tip] = min(record);
drawpath(track(tip,:),position);
hold on 
title('最优路线')
figure
hold on
plot(1:count,record)
xlabel('迭代次数')
ylabel('距离')
title('优化过程')
disp(['最优路径与距离',num2str(record(tip))])
outputpath(track(tip,:));

詳細なコードについては、私のWebサイトを参照してください:詳細なコード ここに画像の説明を挿入 ここに画像の説明を挿入

ここに画像の説明を挿入図1は任意の解、図2はシミュレーテッドアニーリングアルゴリズムによって得られた最適解、図3は反復プロセスにおける距離の最適化プロセスです。この図から、最終的に最適解が見つかったことがわかります。これは、シミュレーテッドアニーリングがこの問題を解決するための良い方法であることを示しています。

おすすめ

転載: juejin.im/post/7117819043888758797