このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
実現可能性の問題を解決する
一部の問題では、最小化すべき目的関数がなく、すべての制約を満たす点を見つける必要があります。たとえば、次のような制約があるとします。
のいずれかの点が制約を満たしていますか?これを調べるには、構造体フィールド Ineq
に制約を返す関数を作成します。制約を ではなく 2 要素ベクトル で記述します。各不等式の右辺を両辺から減算して、各不等式を関数 、つまり不等式 として書きます。プロットを有効にするには、各行が 1 つのポイントを表すベクトル化された方法で関数を記述します。このヘルパー関数のコード(objconstr
という名前)は、この例の最後に表示されます。
3 つの関数が と の等式を満たす点をプロットし、関数値が –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