Main Content

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

実現可能性の問題を解決する

一部の問題では、最小化すべき目的関数がなく、すべての制約を満たす点を見つける必要があります。たとえば、次のような制約があるとします。

(y+x2)2+0.1y21yexp(-x)-3yx-4.

(x,y) のいずれかの点が制約を満たしていますか?これを調べるには、構造体フィールド Ineq に制約を返す関数を作成します。制約を (x,y) ではなく 2 要素ベクトル x=(x1,x2) で記述します。各不等式の右辺を両辺から減算して、各不等式を関数 c(x)、つまり不等式 c(x)0 として書きます。プロットを有効にするには、各行が 1 つのポイントを表すベクトル化された方法で関数を記述します。このヘルパー関数のコード(objconstr という名前)は、この例の最後に表示されます。

3 つの関数が -2x2-4y2 の等式を満たす点をプロットし、関数値が –1/2 に等しい水平線をプロットして不等式を示します。

[XX,YY] = meshgrid(-2:0.1:2,-4:0.1:2);
ZZ = objconstr([XX(:),YY(:)]).Ineq;
ZZ = reshape(ZZ,[size(XX),3]);
h = figure;
ax = gca;
contour(ax,XX,YY,ZZ(:,:,1),[-1/2 0],'r','ShowText','on');
hold on
contour(ax,XX,YY,ZZ(:,:,2),[-1/2 0],'k','ShowText','on');
contour(ax,XX,YY,ZZ(:,:,3),[-1/2 0],'b','ShowText','on');
hold off

プロットは[1.75,–3]付近に実行可能な点が存在することを示しています。

下限を –5、上限を 3 に設定し、surrogateopt を使用して問題を解きます。

rng(1) % For reproducibility
lb = [-5,-5];
ub = [3,3];
[x,fval,exitflag,output,trials] = surrogateopt(@objconstr,lb,ub)

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
x = 1×2

    1.7553   -3.0551

fval =

  1x0 empty double row vector
exitflag = 0
output = struct with fields:
        elapsedtime: 16.2262
          funccount: 200
    constrviolation: -0.0660
               ineq: [-0.0660 -0.2280 -0.8104]
           rngstate: [1x1 struct]
            message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ...'

trials = struct with fields:
       X: [200x2 double]
    Ineq: [200x3 double]

返されたソリューション x で実現可能性を確認します。

disp(output.ineq)
   -0.0660   -0.2280   -0.8104

同様に、返されたソリューション x で関数 objconstr を評価します。

disp(objconstr(x).Ineq)
   -0.0660   -0.2280   -0.8104

同様に、trials 構造の Ineq フィールドを調べて、ソリューション x を探します。まず、trials.X フィールドで x のインデックスを見つけます。

indx = ismember(trials.X,x,'rows');
disp(trials.Ineq(indx,:))
   -0.0660   -0.2280   -0.8104

すべての制約関数の値は負であり、点 x が実行可能であることを示しています。

surrogateopt によって評価された実行可能なポイントを表示します。

opts = optimoptions("surrogateopt");
indx = max(trials.Ineq,[],2) <= opts.ConstraintTolerance; % Indices of feasible points
figure(h);
hold on
plot(trials.X(indx,1),trials.X(indx,2),'*')
xlim([1 2])
ylim([-3.5 -2.5])
hold off

次のコードは、補助関数 objconstr を作成します。

function f = objconstr(x)
c(:,1) = (x(:,2) + x(:,1).^2).^2 + 0.1*x(:,2).^2 - 1;
c(:,2) = x(:,2) - exp(-x(:,1)) + 3;
c(:,3) = x(:,2) - x(:,1) + 4;
f.Ineq = c;
end

参考

関連するトピック