都市のTSP問題を解決するための遺伝的アルゴリズム

1.遺伝的アルゴリズムとTSPの概要

1.遺伝的アルゴリズムとは、ダーウィンの生物進化の自然選択過程と遺伝学の進化メカニズムをシミュレーションする計算モデルであり、自然進化過程をシミュレーションすることで最適解を探索する手法です。遺伝的アルゴリズムは、問題の潜在的なソリューションセットを表す母集団から始まり、母集団は、遺伝的にコード化された特定の数の個人で構成されます。各個人は、実際には特徴的な染色体を持つ実体です。遺伝物質の主要なキャリア、つまり複数の遺伝子の集まりとして、内部発現(つまり遺伝子型)は、個体の形状の外部発現を決定する遺伝子の特定の組み合わせです。したがって、最初に、表現型から遺伝子型へのマッピング、つまりコーディングを実現する必要があります。第1世代の母集団が生成された後、適者生存と適者生存の原則に従って、進化的世代はより適切な近似解を生成します。各世代では、身体は問題領域における個人の適合度と自然遺伝学に従って選択されます遺伝的演算子は、交差と突然変異を組み合わせて、新しいソリューションセットを表す母集団を生成します。このプロセスにより、母集団の子孫は前世代よりも環境に順応します。最後の母集団の最適な個体がデコードされ、問題の近似最適解として使用できます。
基本的なプロセスを下の図に示します
ここに画像の説明を挿入
。2.巡回セールスマン問題、つまりTSP問題(巡回セールスマン問題)は、数学の分野でよく知られている問題の1つである巡回セールスマン問題とセールスマン問題にも変換されます。出張中のビジネスマンがn個の都市を訪問したい場合、彼は自分の行きたい経路を選択する必要があります。パス選択の目標は、必要なパス距離がすべてのパスの中で最小値になることです。

第二に、遺伝的アルゴリズムの基本原理

遺伝的アルゴリズムは、生物界の進化の法則(適者生存、適者生存)を借用した一種のランダム化された検索方法であり、その主な機能は、構造オブジェクトを直接操作することであり、導出および関数の連続性の制限はありません。固有の暗黙的な並列処理と優れたグローバル最適化機能を備えており、最適化された検索空間を自動的に取得および誘導し、特定のルールを必要とせずに検索方向を適応的に調整できる確率論的最適化手法を採用しています。

3.遺伝的アルゴリズムの主なステップ

1.初期母集団:いくつかの解が実行可能ドメイン内でランダムに生成され、初期母集団と呼ばれます。
2.母集団内の各ソリューションの適合性を評価し、各個人が環境にどの程度順応しているかを評価します。
3.適者生存、不適切な乱数の除去、および保持に適した不適切な個人を排除するその他の方法。
4.クロスエクスチェンジ、ミューテーションなどを通じてクラウドを妨害します。基本的には、実行可能なドメイン内を検索して、環境に最も適したソリューションを見つけます。
上記の環境は、目的関数、最適値を解く必要のある関数、各個人は各実行可能解です。適合性評価は、実行可能解を計算のために関数に取り込み、そのサイズを比較します(実行可能解が関数に置き換えられている場合)。すばらしい。このソリューションが最適なソリューションです。適者生存の生存は、優れたソリューションの保持、貧しいソリューションの排除、クロスオーバーおよび変異がソリューションを妨害してソリューションの優位性をさらに向上させることです。

第四に、遺伝的アルゴリズムの特徴

1.遺伝的アルゴリズムは個々の遺伝子に対してのみ機能するため、実際の問題がどれほど複雑であっても、その安定性に大きな影響はありません。
2.遺伝的アルゴリズムの検索プロセスは並列計算に属し、解空間をよく検索できます。
3.非線形の高次元の複雑な最適化問題に適した、強力な安定性と堅牢性。

5、アルゴリズム実装コードモジュール

1.点描画関数plot_route.m

function plot_route(a,R)
scatter(a(:,1),a(:,2),'rx');
hold on;
plot([a(R(1),1),a(R(length(R)),1)],[a(R(1),2),a(R(length(R)),2)]);
hold on;
for i=2:length(R)
    x0=a(R(i-1),1);
    y0=a(R(i-1),2);
    x1=a(R(i),1);
    y1=a(R(i),2);
    xx=[x0,x1];
    yy=[y0,y1];
    plot(xx,yy);
    hold on;
end

end

2.染色体距離コスト関数mylength.m

function len=myLength(D,p)%p是一个排列
[N,NN]=size(D);
len=D(p(1,N),p(1,1));
for i=1:(N-1)
    len=len+D(p(1,i),p(1,i+1));
end
end

3.フィットネス関数fit.m

function fitness=fit(len,m,maxlen,minlen)
fitness=len;
for i=1:length(len)
    fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.0001)).^m;
end

4.交差操作関数cross.m

function [A,B]=cross(A,B)
L=length(A);
if L<10
    W=L;
elseif ((L/10)-floor(L/10))>=rand&&L>10
    W=ceil(L/10)+8;
else
    W=floor(L/10)+8;
end
%%W为需要交叉的位数
p=unidrnd(L-W+1);%随机产生一个交叉位置
%fprintf('p=%d ',p);%交叉位置
for i=1:W
    x=find(A==B(1,p+i-1));
    y=find(B==A(1,p+i-1));
    [A(1,p+i-1),B(1,p+i-1)]=exchange(A(1,p+i-1),B(1,p+i-1));
    [A(1,x),B(1,y)]=exchange(A(1,x),B(1,y));
end

end

5.スワップ関数exchange.m

function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
 
end

6.突然変異関数Mutation.m

function a=Mutation(A)
index1=0;index2=0;
nnper=randperm(size(A,2));
index1=nnper(1);
index2=nnper(2);
%fprintf('index1=%d ',index1);
%fprintf('index2=%d ',index2);
temp=0;
temp=A(index1);
A(index1)=A(index2);
A(index2)=temp;
a=A;

end

7.主な機能

%main
clear;
clc;
%%%%%%%%%%%%%%%输入参数%%%%%%%%
N=25;               %%城市的个数
M=100;               %%种群的个数
ITER=2000;               %%迭代次数
%C_old=C;
m=2;                %%适应值归一化淘汰加速指数
Pc=0.8;             %%交叉概率
Pmutation=0.05;       %%变异概率
%%生成城市的坐标

pos=randn(N,2);  
%randn是一种产生标准正态分布的随机数或矩阵的函数,属于MATLAB函数
%返回一个N*2的随机项的矩阵。如果N不是个数量,将返回错误信息。

%%生成城市之间距离矩阵
D=zeros(N,N);
%zeros(N,N)产生N×N的double类零矩阵
for i=1:N
    for j=i+1:N
        dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2;
        D(i,j)=dis^(0.5);
        D(j,i)=D(i,j);
    end
end

%%生成初始群体

popm=zeros(M,N);
%zeros(M,N)产生M×N的double类零矩阵
for i=1:M
    popm(i,:)=randperm(N);%随机排列,比如[2 4 5 6 1 3]
end
%%随机选择一个种群
R=popm(1,:);
figure(1);
scatter(pos(:,1),pos(:,2),'rx');%画出所有城市坐标
axis([-3 3 -3 3]);
figure(2);
plot_route(pos,R);      %%画出初始种群对应各城市之间的连线
axis([-3 3 -3 3]);
%%初始化种群及其适应函数
fitness=zeros(M,1);
len=zeros(M,1);

for i=1:M%计算每个染色体对应的总长度
    len(i,1)=myLength(D,popm(i,:));
end
maxlen=max(len);%最大回路
minlen=min(len);%最小回路

fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);%找到最小值的下标,赋值为rr
R=popm(rr(1,1),:);%提取该染色体,赋值为R
for i=1:N
    fprintf('%d ',R(i));%把R顺序打印出来
end
fprintf('\n');

fitness=fitness/sum(fitness);
distance_min=zeros(ITER+1,1);  %%各次迭代的最小的种群的路径总长
nn=M;
iter=0;
while iter<=ITER
    fprintf('迭代第%d次\n',iter);
    %%选择操作
    p=fitness./sum(fitness);
    q=cumsum(p);%累加
    for i=1:(M-1)
        len_1(i,1)=myLength(D,popm(i,:));
        r=rand;
        tmp=find(r<=q);
        popm_sel(i,:)=popm(tmp(1),:);
    end 
    [fmax,indmax]=max(fitness);%求当代最佳个体
    popm_sel(M,:)=popm(indmax,:);

    %%交叉操作
    nnper=randperm(M);
%    A=popm_sel(nnper(1),:);
 %   B=popm_sel(nnper(2),:);
    %%
    for i=1:M*Pc*0.5
        A=popm_sel(nnper(i),:);
        B=popm_sel(nnper(i+1),:);
        [A,B]=cross(A,B);
  %      popm_sel(nnper(1),:)=A;
  %      popm_sel(nnper(2),:)=B; 
         popm_sel(nnper(i),:)=A;
         popm_sel(nnper(i+1),:)=B;
    end

    %%变异操作
    for i=1:M
        pick=rand;
        while pick==0
             pick=rand;
        end
        if pick<=Pmutation
           popm_sel(i,:)=Mutation(popm_sel(i,:));
        end
    end

    %%求适应度函数
    NN=size(popm_sel,1);
    len=zeros(NN,1);
    for i=1:NN
        len(i,1)=myLength(D,popm_sel(i,:));
    end

    maxlen=max(len);
    minlen=min(len);
    distance_min(iter+1,1)=minlen;
    fitness=fit(len,m,maxlen,minlen);
    rr=find(len==minlen);
    fprintf('minlen=%d\n',minlen);
    R=popm_sel(rr(1,1),:);
    for i=1:N
        fprintf('%d ',R(i));
    end
    fprintf('\n');
    popm=[];
    popm=popm_sel;
    iter=iter+1;
    %pause(1);

end
%end of while

figure(3)
plot_route(pos,R);
axis([-3 3 -3 3]);
figure(4)
plot(distance_min);

第6に、制御変数は、解に対する各パラメーターの影響を分析します。

1.解に対する母集団サイズの影響
定数パラメーターは次のとおりです:
N = 25; //都市の
数ITER = 2000; /反復数
m = 2; //通常の適応加速インデックス
Pc = 0.8; / /交差確率
Pmutation = 0.05; //突然変異確率
①M= 20; //母集団の数
ここに画像の説明を挿入
②M= 50; //母集団の数
ここに画像の説明を挿入
③M= 100; //母集団の数
ここに画像の説明を挿入
結論:母集団のサイズが大きいほど、アルゴリズムの結果は大きくなります正確であるほど、適応性は高くなりますが、実行時間は長くなります。
2.解に対する反復回数の影響
定数パラメーターは次のとおりです:
N = 25; //都市の数
M = 100; //母集団の数
m = 2; //通常の適応加速指数
Pc = 0.8; //交差確率
Pmutation = 0.05; //突然変異確率
①ITER= 1000; /反復数
ここに画像の説明を挿入
ここに画像の説明を挿入
②ITER= 1500; /反復数
ここに画像の説明を挿入
ここに画像の説明を挿入
③ITER= 2000; /
ここに画像の説明を挿入
ここに画像の説明を挿入
反復反復数が多いほど、ソリューションの正しいレートは高くなります。反復数が1000に達すると、アルゴリズムの実行結果は安定する傾向があり(最短パスが安定して得られる)、アルゴリズムの効率は比較的高くなります。アルゴリズムの最適な反復回数は2000です。
3.解に対する都市の数の影響
定数パラメーターは次のとおりです:
M = 100; //母集団の数
ITER = 2000; /反復数
m = 2; //正規化された除去指数
Pc = 0.8; //交差確率
Pmutation = 0.05; //突然変異確率
①N= 15; //都市数
ここに画像の説明を挿入
②N= 20; //都市数
ここに画像の説明を挿入
③N= 25; //都市数
ここに画像の説明を挿入
結論:都市が複数の反復の後、50都市を超える多数の都市がある場合、GAはまだ収束しません。考えられる問題は、局所最適解でスタックしていること
です。4.に対する交差確率の影響
定数パラメーターは次のとおりです:
N = 25; //都市数
M = 100; //集団の数
ITER = 2000; /反復
M = 2; //アウト適応値は、正規化加速度指標た
Pmutation = 0.05; //突然変異確率
①Pc= 0.6; //交叉確率
ここに画像の説明を挿入
②Pc = 0.7; //クロスオーバー確率
ここに画像の説明を挿入
③Pc= 0.8; //クロスオーバー確率
ここに画像の説明を挿入
結論:クロスオーバー確率が低すぎる場合、最適な解は得られません。クロスオーバー確率が高いほど、平均適合度は高くなります。
5.解に対する突然変異確率の影響
定数パラメーターは次のとおりです:
N = 25; //都市の数
M = 100; //母集団の数
ITER = 2000; /反復数
m = 2; //適応値の戻り均一除去加速指数
Pc = 0.8; //交差確率
①Pmutation= 0.01; //突然変異確率
ここに画像の説明を挿入
②Pmutation= 0.05; //突然変異確率
ここに画像の説明を挿入
③Pmutation= 0.1; //突然変異確率
ここに画像の説明を挿入
結論:突然変異の確率が高すぎる、または低すぎると、最適なソリューションに影響します。

7.まとめ

遺伝的アルゴリズムの全体的な探索戦略と最適化計算は勾配情報に依存しないため、探索方向に影響を与える目的関数と対応する適合関数のみが必要であるため、広く使用されています。現在の計算では列挙法を使用して最適解を解くことが難しいため、遺伝的計算を使用して大規模問題の最適化を組み合わせることは、より効果的な方法です。しかし、遺伝的アルゴリズムにも欠点があり、アルゴリズムの正確さ、実現可能性、および計算の複雑さを効果的に定量的に分析する方法がありません。この論文のアルゴリズムを通じて、遺伝的アルゴリズムによって得られた解が必ずしも最適解ではないことを明確に理解できます。

オリジナルの記事を11件公開 Likes0 Visits 1040

おすすめ

転載: blog.csdn.net/likepanda99/article/details/103142786