このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
遺伝的アルゴリズムを用いた多目的最適化の実行
この例では、Global Optimization Toolbox の多目的遺伝的アルゴリズム関数 gamultiobj を使用して多目的最適化を実行する方法を示します。
単純な多目的最適化問題
gamultiobj は、複数の変数における多目的最適化問題を解決するために使用できます。ここでは、それぞれ 1 つの決定変数を持つ 2 つの目的を最小化したいと考えています。
min F(x) = [objective1(x); objective2(x)]
x where, objective1(x) = (x+2)^2 - 10, and
objective2(x) = (x-2)^2 + 20% Plot two objective functions on the same axis x = -10:0.5:10; f1 = (x+2).^2 - 10; f2 = (x-2).^2 + 20; plot(x,f1); hold on; plot(x,f2,'r'); grid on; title('Plot of objectives ''(x+2)^2 - 10'' and ''(x-2)^2 + 20''');

2 つの目標値は、それぞれ x = -2 と x = +2 で最小値を持ちます。ただし、多目的問題では、x = -2、x = 2、および範囲-2 <= x <= 2 内の任意のソリューションが等しく最適です。この多目的問題には単一の解決策はありません。多目的遺伝的アルゴリズムの目的は、その範囲内(理想的には良好な広がりを持つ)のソリューションのセットを見つけることです。解の集合はパレート フロントとも呼ばれます。パレート フロント解はすべて最適です。
適応度関数のコーディング
simple_multiobjective.m という名前の MATLAB ® ファイルを作成します。
function y = simple_multiobjective(x) y(1) = (x+2)^2 - 10; y(2) = (x-2)^2 + 20;
遺伝的アルゴリズム ソルバーは、適応度関数が 1 つの入力 x を受け取ることを想定しています。ここで、x は、問題内の変数の数と同じ数の要素を持つ行ベクトルです。適応度関数は各目的関数の値を計算し、これらの値を単一のベクトル出力 y で返します。
gamultiobj を使用した最小化
gamultiobj 関数を使用するには、少なくとも 2 つの入力引数、適応度関数、および問題内の変数の数を指定する必要があります。gamultiobj によって返される最初の 2 つの出力引数は、パレート フロントの点である X と、値 X における目的関数の値である FVAL です。3 番目の出力引数 exitFlag は、gamultiobj が停止した理由を示します。4 番目の引数 OUTPUT には、ソルバーのパフォーマンスに関する情報が含まれます。gamultiobj は、gamultiobj が終了したときの母集団を含む 5 番目の引数 POPULATION と、gamultiobj が終了したときの POPULATION のすべての目的関数の値を含む 6 番目の引数 SCORE も返すことができます。
FitnessFunction = @simple_multiobjective; numberOfVariables = 1; [x,fval] = gamultiobj(FitnessFunction,numberOfVariables);
gamultiobj stopped because it exceeded options.MaxGenerations.
ソルバーによって返される X は、各行が目的関数のパレート フロント上の点である行列です。FVAL は、各行に X の対応するポイントで評価された目的関数の値が含まれる行列です。
size(x) size(fval)
ans =
18 1
ans =
18 2
制約付き多目的最適化問題
gamultiobj は、線形不等式、等式、および単純な境界制約を持つ最適化問題を処理できます。ここでは、以前に解決した単純な多目的問題に境界制約を追加します。
min F(x) = [objective1(x); objective2(x)]
xsubject to -1.5 <= x <= 0 (bound constraints)
where, objective1(x) = (x+2)^2 - 10, and
objective2(x) = (x-2)^2 + 20 gamultiobj は、A*x <= b 形式の線形不等式制約、Aeq*x = beq 形式の線形等式制約、および lb <= x <= ub 形式の境界制約を受け入れます。A と Aeq を行列として渡し、b、beq、lb、ub をベクトルとして渡します。この例では線形制約がないため、それらの入力には [] を渡します。
A = []; b = []; Aeq = []; beq = []; lb = -1.5; ub = 0; x = gamultiobj(FitnessFunction,numberOfVariables,A,b,Aeq,beq,lb,ub);
gamultiobj stopped because it exceeded options.MaxGenerations.
X (各行) のすべてのソリューションは、options.ConstraintTolerance で指定された許容値内のすべての線形制約と境界制約を満たします。ただし、独自の交叉関数または突然変異関数を使用する場合は、新しい個体が線形制約および単純な境界制約に関して実行可能であることを確認してください。
視覚化の追加
gamultiobj は、オプション引数を通じて 1 つ以上のプロット関数を受け入れることができます。この機能は、実行時にソルバーのパフォーマンスを視覚化するのに役立ちます。プロット関数は optimoptions を使用して選択できます。
ここでは、optimoptions を使用して 2 つのプロット関数を選択します。最初のプロット関数は gaplotpareto で、世代ごとにパレート フロント(任意の 3 つの目的に限定) をプロットします。2 番目のプロット関数は gaplotscorediversity で、各目標のスコア多様性をプロットします。オプションはソルバーへの最後の引数として渡されます。
options = optimoptions(@gamultiobj,'PlotFcn',{@gaplotpareto,@gaplotscorediversity});
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);
gamultiobj stopped because it exceeded options.MaxGenerations.

適応度関数のベクトル化
先ほどの適応度関数をもう一度考えてみましょう。
objective1(x) = (x+2)^2 - 10, and objective2(x) = (x-2)^2 + 20
デフォルトでは、gamultiobj ソルバーは一度に 1 つのポイントのみを適応度関数に渡します。ただし、適応度関数がベクトル化されて点のセットを受け入れ、関数値のセットを返す場合は、ソリューションを高速化できます。
たとえば、ソルバーがこの適応度関数を 1 回呼び出すことで 5 つのポイントを評価する必要がある場合、ソルバーは 5 行 1 列 (つまり 5 行 1 列) の行列を使用して関数を呼び出します (1 は変数の数であることに注意してください)。
vectorized_multiobjective.m という MATLAB ファイルを作成します。
function scores = vectorized_multiobjective(pop)
popSize = size(pop,1); % Population size
numObj = 2; % Number of objectives
% initialize scores
scores = zeros(popSize, numObj);
% Compute first objective
scores(:,1) = (pop + 2).^2 - 10;
% Compute second objective
scores(:,2) = (pop - 2).^2 + 20;このベクトル化されたバージョンの適応度関数は、任意の数の点(pop 行)を持つ行列 pop を受け取り、サイズが populationSize 行 numberOfObjectives 列の行列を返します。
optimoptions を使用して作成されたオプションを使用して、適応度関数がベクトル化されるように指定する必要があります。オプションは 9 番目の引数として渡されます。
FitnessFunction = @(x) vectorized_multiobjective(x);
options = optimoptions(@gamultiobj,'UseVectorized',true);
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.