------------恢復內容開始------------
小編最近在看解決整數線性規划。
對於一維的決策變量,使用matlab和lingo均可。
matlab可以用intlinprog(f,incont,a,b,aeq,beq,ln.hn)
f對應的所求式子的列向量,incont對應着 為整數的相關索引,a為不等式的限定矩陣,b為不等式的資源矩向量,同理aeqhebeq為等式的對應矩陣和向量。
下面用lingo求解整數線性規划問題:

兩種方法:
第一種,按照每個備選校址,寫出對應的覆蓋小區的向量,組成一個矩陣。
列向量分別代表每一個校址對應所覆蓋的小區,分別為0,1(二進制變量)
model: sets: col/1..6/:x; row/1..8/; link(row,col):a; endsets data: a = 1 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1; enddata min = @ sum(col(i):x(i)); @for(row(i):@sum(col(j):a(i,j)*x(j))>1); @for(col(j):@bin(x(j))); end

如圖所示,顯示答案為1,4,5.
第二種方法:
xi{1: 在備選校址Bi建學校, 0: 在備選校址Bi不建學校}
由於小區A1可以被備選校址B1,B2,B3所間的學校所覆蓋,所以有約束條件:
x1 + x2 + x3 >=1
類似的其他的也一樣:
min 求和(xi)(小編求和符號復制不過來)
s.t:
x1 + x2 + x3 >=1
x2 + x4 >=1
x3 + x5 >=1
x4 + x6 >=1
x5 + x6 >=1
x1 >=1
x1 + x4 + x6 >=1
lingo程序如下:
代碼更加簡潔
model: sets: var/1..6/:x; endsets min=@sum(var:x); x(1)+x(2)+x(3)>1 x(2)+x(4)>1 x(3)+x(5)>1 x(4)+x(6)>1 x(1)>1 x(2)+x(4)+x(6)>1 end
------------恢復內容結束------------
