【C#】 ペナルティ法による制約条件付き最適化
制約条件が付いた最適化問題をペナルティ法を使って解いてみます。ここでは例として 制約条件: を満たす上で 目的関数: の最小値を与えるを求めます。
まずは目的関数、制約条件、ペナルティ係数から新しい目的関数を作成するクラスを作成します。
public class PenaltyFunctionMethod { public static Func<double[], double> CreateObjectiveFunction(Func<double[], double> f, Func<double[], double> penaltyFunction, double penalty) { return x => f(x) + penalty*penaltyFunction(x); } }
次にPenaltyFunctionMethodクラスで作成した新しい目的関数の最小化をSteepestDescentMethodMVクラス(【C#】 最急降下法による多変数関数の最適化 - 旅行好きなソフトエンジニアの備忘録)を使って行います。 罰金関数についてですが、制約条件から の時 ⇒ の時 ⇒ となります。
// 目的関数 Func<double[], double> objectiveFunction = x => 4.0*x[0]*x[0] + x[1]*x[1]; // 罰金関数 Func<double[], double> penaltyFunction = x => { if (x[0] + 2.0*x[1] <= 2.0) { return 2.0 - (x[0] + 2.0*x[1]); } else { return 0.0; } }; // ペナルティ係数 double penalty = 10.0; // 罰金関数を考慮した新しい目的関数を作成する Func<double[], double> newObjectiveFunction = PenaltyFunctionMethod.CreateObjectiveFunction(objectiveFunction, penaltyFunction, penalty); // 初期値を(x0, x1)=(3.7, 3.7)とする var initialX = new double[] { 3.7, 3.7 }; // 計算回数 int iteration = 200; // 学習係数 double learningRate = 0.01; // 新しい目的関数に対して最小値を求める double[] answer = SteepestDescentMethodMV.Compute(newObjectiveFunction, initialX, iteration, learningRate);
実行してみると分かるのですが、ペナルティ係数と学習係数の調整が難しく、そもそもこの手法自体あまり優れた解法ではないようです。 とはいえせっかく勉強したのでひとまずメモしておきます。
- 作者: 天谷賢治
- 出版社/メーカー: 数理工学社
- 発売日: 2008/05
- メディア: 単行本
- 購入: 4人 クリック: 78回
- この商品を含むブログ (3件) を見る