私は候補の選択肢を最適化する必要があるという問題があります。各候補にはスコア(0〜1)、タイプ(1〜10の10の選択肢)、および数量があります。非線形制約と2進変数による線形目的関数
最適化する変数はバイナリです。彼らは候補者の選択肢を表すかどうかを表します。オブジェクト関数は線形であり、バイナリ変数とスコアベクトルのスカラー積です。アイデアはスコアの最高合計を選択することです。
今私は、線形制約があります。選択可能な候補者の数は、せいぜい35
ことができますが、私はまた、10非線形制約を持っています。候補者の10種類があります。最後の選択では、各タイプの総量は全タイプの総量の最大10%でなければなりません。
それはバイナリ変数を扱うので、私はそれゆえintlinprog
を使用してコードを書いてきたが、私は非線形制約に対処するために苦労しています。線形化を試みたり、別のソルバーを使用するのが最善であるかどうかはわかりません。
ここのコードです:
rng('default');
clc;
clear;
n = 100;
maxSize = 35;
nbType = 10;
NAV = 6000000;
thresholdType = 0.1 * NAV;
%%%TOP BASKET
score = rand(n,1)/10+0.9;
quantity = rand(n,1)*300000;
type = ceil(rand(n,1)*nbType);
typeMask = zeros(n,nbType);
for i=1:nbType
typeMask(:,i) = type(:,1) == i;
end
f = -score;
intcon = [1:1:n];
%Write the linear INEQUALITY constraints:
A = [ones(1,n);bsxfun(@times,typeMask,quantity)'/thresholdType];
b = [maxSize;ones(nbType,1)];
%Write the linear EQUALITY constraints:
Aeq = [];
beq = [];
%Write the BOUND constraints:
lb = zeros(n,1);
ub = ones(n,1); % Enforces i1,i2,...in binary
%x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub);
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub);
問題は、私のA、Bには、第1の制約は(ほとんどの35件の候補で)線形一つである、最後の10はそう明らかに非直線的であるが、正しい結果が得られません。
こんにちはとStackOverflowのを歓迎します。説明を明確にするために、あなたの質問をコメントに書くことができます。 – obchardon
いいえ、私はあなたが私を許さないので、できません。 – Chris
いいえ、それはそれより少し複雑です。各候補には数量が添付されています。次に、選択された1つのタイプの候補の合計量は、すべてのタイプのすべての選択された候補の総量の10%を超えることはできません。基本的には、最適化の最後に、私は自分の最適化された選択肢(最大35の候補)を見たいと思っています。そして、1つのタイプのすべての候補について量を合計すると、この値は以下の合計の10%選択された全ての候補の数量。それがより明確であることを望みますか? – Tulkkas