このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
遺伝的アルゴリズムを使用した多目的最適化の実行
この例では、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)] x
subject 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.