我有一個關於優化的問題。約束下的優化
我有一個矩陣x有3列和一定數量的行(最大200)。每一行代表一個候選人。第一列包含一個分數(在0和1之間),第二列包含候選人的種類(總共有10種標記從1到10),列3包含每個候選人的數量。有一件事情需要考慮:金額可以是負數
我想要做的是在這些候選人中選擇最多35個元素,以最大限度地發揮他們各自的得分(第1列)約束條件是每種類型最多可以有10%以下列方式計算:種類1種類:總數種類1除以總額全部數量。
最後,我想有一個最大35個候選人滿足約束和優化他們的分數總和的集合。
這裏是一個代碼我想出了這麼遠,但我10%的約束上掙扎,因爲它似乎並沒有被考慮在內:
rng('default');
clc;
clear;
n = 100;
maxSize = 35;
%%%TOP BASKET
nbCandidates = 100;
score = rand(100,1)/10+0.9;
quantity = rand(100,1)*100000;
type = ceil(rand(100,1)*10)
typeMask = zeros(n,10);
for i=1:10
typeMask(:,i) = type(:,1) == i;
end
fTop = -score;
intconTop = [1:1:n];
%Write the linear INEQUALITY constraints:
A = [ones(1,n);bsxfun(@times,typeMask,quantity)'/sum(type.*quantity)];
b = [maxSize;0.1*ones(10,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 = intlinprog(fTop,intconTop,A,b,Aeq,beq,lb,ub);
我將不勝感激一些建議,其中我做錯了!
你是什麼意思的10%規則? ** A **:'''sum_amount_kind_x/sum_all_amounts''或** B **:'''sum_amound_kind_x_selected/sum_all_amounts_selected''''。 ** A **是一個簡單的混合整數程序。 ** B **將非常困難(在我看來可能是非凸的)。 – sascha
這裏應該理解10%規則如下:選擇完成後的sum_amount_kind_x,這意味着尊重其他約束,如最大35個元素不應該大於sum_all_amounts_selected的10%。所以我相信這不幸落入你的B類別。因爲基本上A部分沒有什麼意義。我希望在選擇後的每個類別中選擇最多10%。希望澄清一點。 – Tulkkas