1 次元半無限制約
以下を最小化する x の値を探します。
f(x) = (x1 – 0.5)2 + (x2– 0.5)2 + (x3– 0.5)2
ここで、
すべての値に対して、w1 と w2 の範囲は以下になります。
1 ≤ w1 ≤ 100,
1 ≤ w2 ≤ 100.
半無限制約は 1 次元、すなわち、ベクトルであることに注意してください。制約は、Ki(x,wi) ≤ 0 の形式になる必要があるため、以下のように制約を計算しなければなりません。
まずはじめに目的関数を計算するファイルを記述します。
function f = myfun(x,s) % Objective function f = sum((x-0.5).^2);
次に非線形等式制約と非線形不等式制約と半無限制約を計算するファイル mycon.m
を記述します。
function [c,ceq,K1,K2,s] = mycon(X,s) % Initial sampling interval if isnan(s(1,1)), s = [0.2 0; 0.2 0]; end % Sample set w1 = 1:s(1,1):100; w2 = 1:s(2,1):100; % Semi-infinite constraints K1 = sin(w1*X(1)).*cos(w1*X(2)) - 1/1000*(w1-50).^2 -... sin(w1*X(3))-X(3)-1; K2 = sin(w2*X(2)).*cos(w2*X(1)) - 1/1000*(w2-50).^2 -... sin(w2*X(3))-X(3)-1; % No finite nonlinear constraints c = []; ceq=[]; % Plot a graph of semi-infinite constraints plot(w1,K1,'-',w2,K2,':') title('Semi-infinite constraints') drawnow
次に最適化ルーチンを呼び出します。
x0 = [0.5; 0.2; 0.3]; % Starting guess
[x,fval] = fseminf(@myfun,x0,2,@mycon);
8 回の反復後、解は以下になります。
x
x = 0.6675 0.3012 0.4022
解 x
での関数値と半無限制約の最大値は以下になります。
fval
fval = 0.0771
[c,ceq,K1,K2] = mycon(x,NaN); % Initial sampling interval
max(K1)
ans = -0.0077
max(K2)
ans = -0.0812
半無限制約のプロットを作成します。
このプロットは、制約境界上での両関数のピークの様子を示しています。
mycon.m
内のプロット コマンドは計算を遅くさせます。計算スピードを上げるにはこの行を削除します。