1

MATLABの最適化ツールボックス「fmincon」を使っているのですが、次の問題があります。

変化させるパラメーターは 6 つあります。そのうちの 2 つは 4 から 16 までの偶数で変化します (この値は変化する可能性がありますが、常に偶数で変化します)。したがって、次のように定義しましょう。

x1=[4:2:16];
x2=[4:2:16];

別の 2 つの変数は、300 から 1500 の間で 100 刻みで変化する必要があります。つまり、次のようになります。

x3=[300:100:1500];
x4=[300:100:1500];

最後のカップルは、次のように 4 ~ 6 の間で変化します。

x5=4:6;
x6=4:6;

パラメータの制限は次のとおりです。

x1<=x2
x3<=x4
x5<=x6

ここで非常に重要なことは、 の変化はfminconほとんど変化しないということです。つまり、変化の最初の値が でx1あっては4ならないということ4.0000000001です。そして、私の問題があります。ステップが小さすぎるため、変動は何もせず、アルゴリズムは目的関数の変動がないと言って停止します。

fmincon、 、および を設定しましたがDiffMinChange=1、これは最初の反復で機能し、ステップが少なすぎます。これは の初期構成ですfmincon

options1 = optimset('Display','iter',...
    'Algorithm','sqp','PlotFcns',@optimplotfval,...
    'MaxIter',400,'MaxFunEvals',2000,'DiffMinChange',1);

最初の制限は次のとおりです。

A=[1 -1 0 0 0 0;0 0 1 -1 0 0;0 0 0 0 1 -1];
b=[0;0;0];

より明確にするために、私が探しているのは、次のように定義できる 3 つの範囲を作成することです。

R1=[x1:2:x2];
R2=[x3:100:x4];
R3=[x5:x6];

EDIT 1:目的関数の各評価には約2〜3時間かかることを知っているかもしれません。

ご覧のとおり、最後に私が探しているのは間隔の変化です。そのため、最初の制限は上の制限より大きくすることはできません。そうでない場合、ランクは空になります。

4

3 に答える 3

0

fminconは継続的な問題のオプティマイザーであり、問​​題は離散的であるため、問題とソリューションのアプローチの間に不適合があります。たとえば wiki を参照してください

branch and boundなどの離散最適化ソルバーを試すことができます。実行可能な領域内のポイントの数は非常に限られているため、ブルート フォース アプローチも機能する可能性があります (目的関数が必要とする時間によって異なります)。このようなものが目的関数に対して機能するはずですfun:

lb = [4 4 300 300 4 4]; % lower bound
st = [2 2 100 100 1 1]; % step size
ub = [16 16 1500 1500 6 6]; % upoper bound

% init the best solution as infinity
bestF = inf;
bestX = nan(6,1);

% construct all permutations
for idx = 1:numel(lb)
    % construct range
    nextRange = (lb(idx):st(idx):ub(idx))';
    if (idx==1)
        permutations = nextRange;
    else
        a = repmat(permutations,numel(nextRange),1);
        b = repmat(nextRange,1,size(permutations,1))';
        permutations = [a,b(:)];
    end
    % remove permutations that do not satisfy constraints
    if (idx==2)
        permutations(permutations(:,1) > permutations(:,2),:) = [];
    end
    if (idx==4)
        permutations(permutations(:,3) > permutations(:,4),:) = [];
    end
    if (idx==6)
        permutations(permutations(:,5) > permutations(:,6),:) = [];
    end
end

N = size(permutations,1);

assert(N == 7*4 * 13*7 * 6)

for idx = 1:N
    candX = permutations(idx,:)';
    % evaluate ...
    candF = fun(candX);
    % ... and if improvement, update best
    if (candF < bestF)
        bestF = candF;
        bestX = candX;
    end
end

% results
bestF
bestX

順列の数は 15288 であるため、目的関数funが 0.1 秒を必要とする場合 (これはかなりの量です ;))、回答が得られるまで 25 分間待たなければなりません。

于 2014-10-03T07:49:13.387 に答える
0

私は多くのフォーラムを読んでいて、非常に興味深い解決策を見つけました。試してみたところ、実際にはかなりうまく機能します。私が見つけたのは、目的関数の間にいくつかの違いがあるということです。ここで試したのは fmincon ですが、この関数は目的関数が全範囲で変化する、つまり全範囲で微分可能である場合にしか機能しません。しかし、ここでは違いがあります。この関数は特定の値でしか機能せず、変動が大きくなければ目的関数は同じになるからです。つまり、すべての範囲で微分可能ではありません。私が見つけたのは、MATLAB に「パターン検索」と呼ばれる関数があることです。試してみたところ、すばらしい結果が得られました。fmincon と非常によく似ていますが、動作が異なります。こんなお悩みにオススメです。

于 2014-10-12T15:00:49.950 に答える