今日は、主にアルゴリズムの原理とコードの実践から始めて、多目的 Salp アルゴリズムを共有します。インテリジェントなアルゴリズム、機械学習、深層学習、信号処理に関連する理論を理解する必要がある場合は、バックグラウンドでプライベート メッセージを送信できます。次号で共有される内容は、知りたい内容です。
1. アルゴリズム原理
前の記事で共有した SSA アルゴリズムは、サルプを食料源に近づけ、反復プロセス中に更新することができます。ただし、このアルゴリズムは、主に次の 2 つの理由により、多目的問題を解決できません。
1. SSA は 1 つのソリューションのみを最適なソリューションとして保存するため、複数の目的の問題に対する最適なソリューションとして複数のソリューションを保存することはできません。
2. SSA は各反復でこれまでに得られた最適解で食料源を更新しますが、多目的問題に対する単一の最適解は存在しません。
多目的サルプ群アルゴリズム(SSA)は、多目的問題のためのSSAアルゴリズムに基づいて提案されています。
SSA アルゴリズムの原理については、前回の記事を参照してください: Salpグループ アルゴリズム MATLAB 実戦
多目的問題に関する関連説明については、以前の記事「多目的粒子群アルゴリズム MATLAB 戦闘」を参照してください。
最初の問題は、SSA アルゴリズムに食料源のライブラリを装備することで解決されます。このリポジトリは、多目的粒子群最適化 (MOPSO) のアーカイブと同様に、最適化プロセス中にこれまでに得られた最適解を維持します [78]。リポジトリには、有限数の最適なソリューションを保存できる最大サイズがあります。最適化中に、パレート優勢演算子を使用して、各 salp がすべてのリポジトリの元の提案と比較されます。salp がリポジトリを支配している場合、salp を交換する必要があります (salp をリポジトリに置き、元の計画を外します)。salp がリポジトリ内のソリューションのセットよりも優れている場合は、ソリューションのセットをリポジトリから完全に削除し、salp をリポジトリに追加する必要があります。リポジトリ内の元のソリューションの少なくとも 1 つが salp よりも優れている場合は、salp を破棄し、リポジトリに追加しないでください。
salp がすべてのリポジトリ常駐者と比較して相互に排他的である場合、salp が最適なソリューションとなるため、リポジトリに追加する必要があります。
これらのルールにより、リポジトリは、これまでのアルゴリズムによって得られた最適なソリューションを常に取得することが保証されます。ただし、リポジトリがいっぱいで、リポジトリの元のソリューションと比較して salp が優勢ではないという特殊なケースがあります。この時点では、salp がリポジトリに追加されるはずですが、リポジトリがいっぱいです。もちろん、最も簡単な方法は、アーカイブ内のソリューションの 1 つをランダムに削除し、それをこの salp に置き換えることです。
より賢明なアプローチは、リポジトリ内の同様の非支配的なソリューションを削除することです。アーカイブから削除する最適な候補は、人口密度の高い地域にあります。このアプローチにより、反復中のリポジトリ内の提案の分散が改善されます。
近傍内の人口による非優勢な解を見つけるには、近傍内で特定の最大距離を持つ解の数を計算する必要があります。この距離の定義は次のとおりです。
Max と min は、それぞれ各目的関数の最大値と最小値を格納する 2 つのベクトルです。各セグメントに 1 つのソリューションを含むリポジトリが最適なケースです。隣接するソリューションの数に基づいて各リポジトリ常駐にレベルを割り当てた後、ルーレット ホイールを使用して削除するソリューションを選択します。ソリューションに隣接するソリューションの数が多いほど (レベルの数が多いほど)、リポジトリから削除される可能性が高くなります。図 1 は、このリポジトリ更新メカニズムの例を示しています。すべての解に対して近傍を定義する必要がありますが、このグラフでは 4 つの非優勢解のみが検討されていることに注意してください。
図 1 リポジトリがいっぱいになった場合の更新メカニズム
図に示すように、リポジトリの更新メカニズムを導入した後、SSA を使用して多目的問題を解決する場合の 2 番目の問題は、多目的検索空間には複数の最適解があるため、食料源の選択です。同様に、食料源はリポジトリからランダムに選択できます。ただし、より適切なアプローチは、最適なソリューションのセットから最も混雑の少ない領域を選択することです。これは、リポジトリ メンテナンス オペレーターで使用されるのと同じ並べ替えプロセスとルーレット ホイールの選択を使用して実行できます。主な違いは、最適なソリューションを選択する確率です。リポジトリのメンテナンス削除では、ランクの高いソリューション (近隣の混雑度) が選択される可能性が高くなります。対照的に、貯蔵庫内の最適解の場合、母集団が小さいほど (ランク数が低いほど)、食料源として選択される可能性が高くなります。(こうすることで、より未踏の領域を開拓し、大域的な探索能力を強化することができます。密集した領域を探索し続けると局所最適に陥りやすくなりますが、疎な領域を餌として選択することで、局所最適に陥る可能性を減らすことができます)図 2 に示すように、中央に隣接する解がない最適解が、最も高い確率で食料源として選択されます。
図 2 赤いボックス内の白い点は、食料源として選択される確率が最も高い
MSSA アルゴリズムの擬似コードを図 3 に示します。
図 3 MSSA アルゴリズムの擬似コード
2. コード戦闘
ZDT1をテスト関数として使用してシミュレーション実験を実行します
clc;
clear;
close all;
% Change these details with respect to your problem%%%%%%%%%%%%%%
ObjectiveFunction=@ZDT1;
dim=5;
lb=0;
ub=1;
obj_no=2;
if size(ub,2)==1
ub=ones(1,dim)*ub;
lb=ones(1,dim)*lb;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
max_iter=100;
N=200;
ArchiveMaxSize=100;
Archive_X=zeros(100,dim);
Archive_F=ones(100,obj_no)*inf;
Archive_member_no=0;
r=(ub-lb)/2;
V_max=(ub(1)-lb(1))/10;
Food_fitness=inf*ones(1,obj_no);
Food_position=zeros(dim,1);
Salps_X=initialization(N,dim,ub,lb);
fitness=zeros(N,2);
V=initialization(N,dim,ub,lb);
iter=0;
position_history=zeros(N,max_iter,dim);
for iter=1:max_iter
c1 = 2*exp(-(4*iter/max_iter)^2); % Eq. (3.2) in the paper
for i=1:N %Calculate all the objective values first
Salps_fitness(i,:)=ObjectiveFunction(Salps_X(:,i)');
if dominates(Salps_fitness(i,:),Food_fitness)
Food_fitness=Salps_fitness(i,:);
Food_position=Salps_X(:,i);
end
end
[Archive_X, Archive_F, Archive_member_no]=UpdateArchive(Archive_X, Archive_F, Salps_X, Salps_fitness, Archive_member_no);
if Archive_member_no>ArchiveMaxSize
Archive_mem_ranks=RankingProcess(Archive_F, ArchiveMaxSize, obj_no);
[Archive_X, Archive_F, Archive_mem_ranks, Archive_member_no]=HandleFullArchive(Archive_X, Archive_F, Archive_member_no, Archive_mem_ranks, ArchiveMaxSize);
else
Archive_mem_ranks=RankingProcess(Archive_F, ArchiveMaxSize, obj_no);
end
Archive_mem_ranks=RankingProcess(Archive_F, ArchiveMaxSize, obj_no);
% Archive_mem_ranks
% Chose the archive member in the least population area as food`
% to improve coverage
index=RouletteWheelSelection(1./Archive_mem_ranks);
if index==-1
index=1;
end
Food_fitness=Archive_F(index,:);
Food_position=Archive_X(index,:)';
for i=1:N
index=0;
neighbours_no=0;
if i<=N/2
for j=1:1:dim
c2=rand();
c3=rand();
%%%%%%%%%%%%% % Eq. (3.1) in the paper %%%%%%%%%%%%%%
if c3<0.5
Salps_X(j,i)=Food_position(j)+c1*((ub(j)-lb(j))*c2+lb(j));
else
Salps_X(j,i)=Food_position(j)-c1*((ub(j)-lb(j))*c2+lb(j));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
elseif i>N/2 && i<N+1
point1=Salps_X(:,i-1);
point2=Salps_X(:,i);
Salps_X(:,i)=(point2+point1)/(2); % Eq. (3.4) in the paper
end
Flag4ub=Salps_X(:,i)>ub';
Flag4lb=Salps_X(:,i)<lb';
Salps_X(:,i)=(Salps_X(:,i).*(~(Flag4ub+Flag4lb)))+ub'.*Flag4ub+lb'.*Flag4lb;
end
display(['At the iteration ', num2str(iter), ' there are ', num2str(Archive_member_no), ' non-dominated solutions in the archive']);
end
figure
Draw_ZDT1();
hold on
plot(Archive_F(:,1),Archive_F(:,2),'ro','MarkerSize',8,'markerfacecolor','k');
legend('True PF','Obtained PF');
title('MSSA');
set(gcf, 'pos', [403 466 230 200])
完全なコード: