LINGO軟體入門

許一城發表於2017-07-21

LINGO軟體入門

一、二次線性規劃問題

這裡寫圖片描述

LINGO的 程式碼:

max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;
x1+x2<100;
x1<=2*x2;
@gin(x1);@gin(x);
  1. LINGO總是根據“MAX=”或“MIN=”尋找目標函式,語句順序不重要。
  2. 限定變數取整數值的語句為“@GIN(X1)”和“@GIN(X2)”,不可以寫成“@GIN(2)”,否則LINGO將把這個模型看成沒有整數變數。
  3. LINGO中函式一律需要以“@”開頭,其中整型變數函式(@BIN、@GIN)和上下界限定函式(@FREE、@SUB、@SLB)與LINDO中的命令類似。而且0/1變數函式是@BIN函式。

二、集合的基本用法和LINGO模型的基本要素

例:SAILCO公司需要決定下四個季度的帆船生產量。下四個季度的帆船需求量分別是40條,60條,75條,25條,這些需求必須按時滿足。每個季度正常的生產能力是40條帆船,每條船的生產費用為400美元。如果加班生產,每條船的生產費用為450美元。每個季度末,每條船的庫存費用為20美元。假定生產提前期為0,初始庫存為10條船。如何安排生產可使總費用最小?

用DEM,RP,OP,INV分別表示需求量、正常生產的產量、加班生產的產量、庫存量,則DEM,RP,OP,INV對每個季度都應該有一個對應的值,也就說他們都應該是一個由4個元素組成的陣列,其中DEM是已知的,而RP,OP,INV是未知數。

MODEL:
    SETS:
        QUARTERS/1,2,3,4/:DEM,RP,OP,INV;
    ENDSETS

    MIN=@SUM(QUARTERS:400*RP+450*OP+20*INV);
    @FOR(QUARTERS(I):RP(I)<40);
    @FOR(QUARTERS(I)|I#GT#1:
    INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I););
INV(1)=A+RP(1)+OP(1)-DEM(1);

DATA:
    DEM=40,0,75,25;
    A=?;

ENDDATA

END
  1. 這裡S和ENDSETS用來定義集合。
  2. 這裡DATA以上,ENDSETS以下用來定義約束條件和目標函式。
    其中@SUM(集合(下標):關於集合的屬性的表示式),
    本例中目標函式也可以等價地寫成
    @SUM(QUARTERS(i): 400*RP(i) +450*OP(i) +20*INV(i) )。

  3. I#GT#1 表示I>1時,GT=Greater Than。

  4. DATA來設定資料。
  5. 比如不知道初始庫存的話,可以將初始庫存設為A,在資料段使用“A=?”,這時執行的話將會提示輸入A。

執行結果截圖:
這裡寫圖片描述


三、基本集合與派生集合

例:建築工地的位置(用平面座標a, b表示,距離單位:公里)及水泥日用量d(噸)下表給出。有兩個臨時料場位於P (5,1), Q (2, 7),日儲量各有20噸。從A, B兩料場分別向各工地運送多少噸水泥,使總的噸公里數最小。兩個新的料場應建在何處,節省的噸公里數有多少
這裡寫圖片描述

這裡寫圖片描述

模型簡稱 模型名
LP 線性規劃
ILP 整數線性規劃
BILP 兩層的線性整數規劃
NLP 非線性規劃
INLP 非線性整數規劃
QP 二次規劃
IQP 二次整數規劃
PIP 帶引數整數規劃
ZOP 零一規劃
MODEL:
TITLE Location Problem;
SETS:
    demand/1..6/:a,b,d;
    supply/1..2/:x,y,e;
    link(demand,supply):c;
ENDSETS

DATA:
a=1.2,8.75,0.5,5.75,3,7.25;
b=1.25,0.75,4.75,5,6.5,7.75;
d=3,5,4,7,6,11;
e=20,20;
ENDDATA

INIT:
x,y=5,1,2,7;
!初始點賦值為x=(5,2),y=(1,7);
ENDINIT

[OBJ] min= @sum(link(i,j):c(i,j)*((x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2));
@for(demand(i):[DEMAND_CON] @sum(supply(j):c(i,j))=d(i););
@for(supply(i):[SUPPLY_CON] @sum(demand(j):c(j,i))<=e(i););
@for(supply:@free(X);@free(Y););

END

這裡寫圖片描述

這裡解出來的是新料場的位置,如果想繼續使用原料場,將初始化裡面的資料放到 DATA中即可。

相關文章