如果你知道xi
將成爲解決方案的一部分,你應該把它作爲1
到初始點x0
傳遞給bintprog
。對於已知可能不是解決方案的一部分的xj
應該包括爲0
。如果初始點非常接近解決方案,這將減少找到它的時間。
x = bintprog(f,A,b,Aeq,beq,x0);
另一種選擇是放鬆BILP問題與添加兩個額外條件
x <= 1
-x <= 0
,然後使用針對此問題作爲初始點BILP問題圓形溶液到LP問題。
Here作者指出bintprog
僅在小問題上表現良好。當我使用Octave而不是Matlab時,我嘗試了GNU線性編程套件(glpk)。我試圖從MATLAB documentation解決BILP問題,這裏是一個腳本
close all; clear all;
f = [25,35,28,20,40,-10,-20,-40,-18,-36,-72,-11,-22,-44,-9,-18,-36,-10,-20]';
A = zeros(14,19);
A(1,1:19) = [25 35 28 20 40 5 10 20 7 14 28 6 12 24 4 8 16 8 16];
A(2,1) = 1; A(2,6) = -1; A(2,7) = -1; A(2,8) = -1;
A(3,2) = 1; A(3,9) = -1; A(3,10) = -1; A(3,11) = -1;
A(4,3) = 1; A(4,12) = -1; A(4,13) = -1; A(4,14) = -1;
A(5,4) = 1; A(5,15) = -1; A(5,16) = -1; A(5,17) = -1;
A(6,5) = 1; A(6,18) = -1; A(6,19) = -1;
A(7,1) = -5; A(7,6) = 1; A(7,7) = 2; A(7,8) = 4;
A(8,2) = -4; A(8,9) = 1; A(8,10) = 2; A(8,11) = 4;
A(9,3) = -5; A(9,12) = 1; A(9,13) = 2; A(9,14) = 4;
A(10,4) = -7; A(10,15) = 1; A(10,16) = 2; A(10,17) = 4;
A(11,5) = -3; A(11,18) = 1; A(11,19) = 2;
A(12,2) = 1; A(12,5) = 1;
A(13,1) = 1; A(13,2) = -1; A(13,3) = -1;
A(14,3) = -1; A(14,4) = -1; A(14,5) = -1;
b = [125 0 0 0 0 0 0 0 0 0 0 1 0 -2]';
lb = zeros(size(f));
ub = ones(size(f));
ctype = repmat("U" , size(b))'; # inequality constraint
sense = 1; # minimization
param.msglev = 0;
vartype = repmat("C" , size(f)); # continuous variables
tic
for i = 1:10000
[xopt, fmin, errnum, extra] = glpk (f, A, b, lb, ub, ctype, vartype, sense, param);
end
toc
fprintf('Solution %s with value %f\n', mat2str(xopt), fmin)
vartype = repmat("I" , size(f)); # integer variables
tic
for i = 1:10000
[xopt, fmin, errnum, extra] = glpk (f, A, b, lb, ub, ctype, vartype, sense, param);
end
toc
fprintf('Solution %s with value %f\n', mat2str(xopt), fmin)
這些被發現的解決方案:
Elapsed time is 7.9 seconds.
Solution [0;0.301587301587301;1;1;0;0;0;0;0;0.603174603174603;0;1;1;0.5;1;1;1;0;0] with value -81.158730
Elapsed time is 11.5 seconds.
Solution [0;0;1;1;0;0;0;0;0;0;0;1;0;1;1;1;1;0;0] with value -70.000000
我不得不執行10000次迭代,使性能差異明顯的問題還是相當小。與BILP解決方案相比,LP解決方案更快,而且它們非常接近。
謝謝,實際上我不知道'Xi'會不會是解決方案的一部分,只有我知道的是'Xi'有更多的機會在解決方案中,我也不能設置'x0',因爲我有許多'Xi',只有其中一些可以在解決方案中爲1。 – oMiD
同樣,如果'Xi'可能是解決方案的一部分,那麼在'x0'中將它設置爲'1',如果它可能超出解,則將其設置爲'0'。如果沒有可用信息,則可以使用隨機值。 – divanov
非常感謝,我的問題解決了,請參閱我的回答:) – oMiD