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);
- LINGO总是根据“MAX=”或“MIN=”寻找目标函数,语句顺序不重要。
- 限定变量取整数值的语句为“@GIN(X1)”和“@GIN(X2)”,不可以写成“@GIN(2)”,否则LINGO将把这个模型看成没有整数变量。
- 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
- 这里S和ENDSETS用来定义集合。
这里DATA以上,ENDSETS以下用来定义约束条件和目标函数。
其中@SUM(集合(下标):关于集合的属性的表达式),
本例中目标函数也可以等价地写成
@SUM(QUARTERS(i): 400*RP(i) +450*OP(i) +20*INV(i) )。I#GT#1 表示I>1时,GT=Greater Than。
- DATA来设置数据。
- 比如不知道初始库存的话,可以将初始库存设为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中即可。