Main Content

このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。

遺伝的アルゴリズムを使用した多目的最適化の実行

この例では、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 = -2x = +2 で最小値を持ちます。ただし、多目的問題では、x = -2x = 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 形式の境界制約を受け入れます。AAeq を行列として渡し、bbeqlbub をベクトルとして渡します。この例では線形制約がないため、それらの入力には [] を渡します。

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 を受け取り、サイズが populationSizenumberOfObjectives 列の行列を返します。

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.

関連するトピック