非線性整數規划模型LINGO
講解分析:
第一步:確定決策變量
問題是確定調運方案,使得總運輸費用最小。
而總運輸費用=貨物運量*貨物單價,題目給了貨物單價了,我們求貨物運量即可,這里的貨物運量則是我們的決策變量。
第二步:確定目標函數和約束條件
上圖第一行就是我們的目標函數,下面三行是我們的約束條件,在滿足約束條件的前提下,軟件會不斷遍歷Xij所有可能的值,然后z也會根據Xij的變化而產生不同的值,這個時候用一個min函數取所有可能值當中的最小值,即可。
第三步:用LINGO代碼實現
model:
title 最少運費問題;
sets:
!集合的定義,WH是集合的名字,W1..W6是集合的長度,一般寫成1..6,相當於創建了一個能放六個元素的容器WH,是抽象的,是虛無的,是一種聲明,告訴我們“:”后面的變量是一個什么類型的變量,顯然,后面的AI是一個確確實實有六個數的數組,是具體的,是實在的。
WH/W1..W6/:AI;
!集合的名稱、集合內的成員、集合的屬性(可以看成是與改集合有關的變量或常量,相當與數組);
VD/V1..V8/:DJ;
links(WH,VD):C,X;
!以WH和VD為基礎,衍生集合。相當於把兩個向量結合在一起,形成一個二維數組,有行和列,C和X這兩個變量是實在的具體的二維數組,只不過后面C我們賦值了,X是通過系統根據約束條件和目標函數自己賦值的;
endsets
data:
!數據段;
AI=60,55,51,43,41,52;
DJ=35,37,22,32,41,32,43,38;
C=6,2,6,7,4,2,5,9
4,9,5,3,8,5,8,2
5,2,1,9,7,4,3,3
7,6,7,3,9,2,7,1
2,3,9,5,7,2,6,5
5,5,2,2,8,1,4,3;
enddata
min=@sum(links(I,J):c(i,j)*x(i,j)); !目標函數.links我們上線提到了,是一個6X8的集合名;
@for(WH(i):@sum(VD(j):x(i,j))<=AI(I));!約束條件.@for一出,你就要知道這一行寫的就是約束條件了;
@for(vd(j):@sum(WH(i):x(i,j))=DJ(j));!約束條件.;
end