lingo程序实例
(整理)lingo超经典案例.

Lingo超经典案例大全LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”。
Lingo超强的优化计算能力在很多方面(线性规划、非线性规划、线性整数规划、非线性整数规划、非线性混合规划、二次规划等)比matlab、maple等强得多,Lingo编程简洁明了,数学模型不用做大的改动(或者不用改动)便可以直接采用Lingo语言编程,十分直观。
Lingo模型由4个段构成:(1)集合段(sets endsets);(2)数据段(data enddata);(3)初始段(init endinit);(4)目标与约束段。
Lingo的五大优点:1. 对大规模数学规划,LINGO语言所建模型较简洁,语句不多;2. 模型易于扩展,因为@FOR、@SUM等语句并没有指定循环或求和的上下限,如果在集合定义部分增加集合成员的个数,则循环或求和自然扩展,不需要改动目标函数和约束条件;3. 数据初始化部分与其它部分语句分开,对同一模型用不同数据来计算时,只需改动数据部分即可,其它语句不变;4. “集合”是LINGO有特色的概念,它把实际问题中的事物与数学变量及常量联系起来,是实际问题到数学量的抽象,它比C语言中的数组用途更为广泛。
5. 使用了集合以及@FOR、@SUM等集合操作函数以后可以用简洁的语句表达出常见的规划模型中的目标函数和约束条件,即使模型有大量决策变量和大量数据,组成模型的语句并不随之增加.一、求解线性整数规划、非线性整数规划问题:1.线性整数规划:model:max=x1+x2;x1+9/14*x2<=51/14;-2*x1+x2<=1/3;@gin(x1);@gin(x2);end求得x1=3,x2=1,最大值为4.运用matlab求时可以发现有两组解:x1=3,x2=1和x1=2,x2=2。
通过验证也可知这两组解均满足。
运用lingo解决问题的例子

运用lingo解决问题的例子
以下是一个运用LINGO解决实际问题的例子:
问题描述:
某公司生产A、B两种产品,已知生产1单位A产品需要3单位原料1和2单位原料2,同时产生2单位废料;生产1单位B产品需要4单位原料1和2单位原料2,同时产生3单位废料。
该公司有10单位原料1和8单位原料2,同时最多可以产生10单位废料。
请为公司制定一个生产计划,使得A、B两种产品的产量最大。
模型建立:
1. 设x1为A产品的产量,x2为B产品的产量。
2. 设原料1的消耗为3x1 + 4x2,原料2的消耗为2x1 + 2x2,废料产生为2x1 + 3x2。
3. 原料1的限制条件为3x1 + 4x2 <= 10,原料2的限制条件为2x1 +
2x2 <= 8,废料的限制条件为2x1 + 3x2 <= 10。
4. 目标函数为max x1 + x2,即最大化A、B两种产品的产量之和。
LINGO代码:
SETS:
I / 1 /;
J / 1,2 /;
K / I,J /;
PARAMETERS:
C(K) / 3I + 4J, 2I + 2J, 2I + 3J /; D(I) / 10 /;
E(I) / 8 /;
F(I) / 10 /;
VARIABLES:
X(K) / >=0 /;
MAXIMIZE Z: X(1) + X(2); SUBJECT TO:
3X(1) + 4X(2) <= D(1);
2X(1) + 2X(2) <= E(1);
2X(1) + 3X(2) <= F(1); ENDSETS
END。
lingo程序实例

例1.2使用LINGO软件计算6个发点8个收点的最小费用运输问题。
产销model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/:capacity;vendors/v1..v8/:demand;links(warehouses,vendors):cost,volume;endsets!目标函数域;min=@sum(links:cost*volume);!需求约束域;@for(vendors(j):@sum(warehouses(i):volume(i,j))=demand(j));!产量约束;@for(warehouses(i):@sum(vendors(j):volume(i,j))<=capacity(i));!数据域;data:capacity=60 55 51 43 41 52;demand=;cost=;enddataendGlobal optimal solution found.Objective value: 664.0000Infeasibilities: 0.000000Total solver iterations: 15Model Class: LPTotal variables: 48Nonlinear variables: 0Integer variables: 0Total constraints: 15Nonlinear constraints: 0Total nonzeros: 144Nonlinear nonzeros: 0Variable Value Reduced Cost CAPACITY( WH1) 60.00000 0.000000 CAPACITY( WH2) 55.00000 0.000000 CAPACITY( WH3) 51.00000 0.000000 CAPACITY( WH4) 43.00000 0.000000 CAPACITY( WH5) 41.00000 0.000000 CAPACITY( WH6) 52.00000 0.000000 DEMAND( V1) 35.00000 0.000000 DEMAND( V2) 37.00000 0.000000 DEMAND( V3) 22.00000 0.000000 DEMAND( V4) 32.00000 0.000000 DEMAND( V5) 41.00000 0.000000 DEMAND( V6) 32.00000 0.000000 DEMAND( V7) 43.00000 0.000000 DEMAND( V8) 38.00000 0.000000COST( WH1, V2) 2.000000 0.000000 COST( WH1, V3) 6.000000 0.000000 COST( WH1, V4) 7.000000 0.000000 COST( WH1, V5) 4.000000 0.000000 COST( WH1, V6) 2.000000 0.000000 COST( WH1, V7) 5.000000 0.000000 COST( WH1, V8) 9.000000 0.000000 COST( WH2, V1) 4.000000 0.000000 COST( WH2, V2) 9.000000 0.000000 COST( WH2, V3) 5.000000 0.000000 COST( WH2, V4) 3.000000 0.000000 COST( WH2, V5) 8.000000 0.000000 COST( WH2, V6) 5.000000 0.000000 COST( WH2, V7) 8.000000 0.000000 COST( WH2, V8) 2.000000 0.000000 COST( WH3, V1) 5.000000 0.000000 COST( WH3, V2) 2.000000 0.000000 COST( WH3, V3) 1.000000 0.000000 COST( WH3, V4) 9.000000 0.000000 COST( WH3, V5) 7.000000 0.000000 COST( WH3, V6) 4.000000 0.000000 COST( WH3, V7) 3.000000 0.000000 COST( WH3, V8) 3.000000 0.000000 COST( WH4, V1) 7.000000 0.000000 COST( WH4, V2) 6.000000 0.000000 COST( WH4, V3) 7.000000 0.000000 COST( WH4, V4) 3.000000 0.000000 COST( WH4, V5) 9.000000 0.000000 COST( WH4, V6) 2.000000 0.000000 COST( WH4, V7) 7.000000 0.000000 COST( WH4, V8) 1.000000 0.000000 COST( WH5, V1) 2.000000 0.000000 COST( WH5, V2) 3.000000 0.000000 COST( WH5, V3) 9.000000 0.000000 COST( WH5, V4) 5.000000 0.000000 COST( WH5, V5) 7.000000 0.000000 COST( WH5, V6) 2.000000 0.000000 COST( WH5, V7) 6.000000 0.000000 COST( WH5, V8) 5.000000 0.000000 COST( WH6, V1) 5.000000 0.000000 COST( WH6, V2) 5.000000 0.000000 COST( WH6, V3) 2.000000 0.000000 COST( WH6, V4) 2.000000 0.000000COST( WH6, V6) 1.000000 0.000000 COST( WH6, V7) 4.000000 0.000000 COST( WH6, V8) 3.000000 0.000000 VOLUME( WH1, V1) 0.000000 5.000000 VOLUME( WH1, V2) 19.00000 0.000000 VOLUME( WH1, V3) 0.000000 5.000000 VOLUME( WH1, V4) 0.000000 7.000000 VOLUME( WH1, V5) 41.00000 0.000000 VOLUME( WH1, V6) 0.000000 2.000000 VOLUME( WH1, V7) 0.000000 2.000000 VOLUME( WH1, V8) 0.000000 10.00000 VOLUME( WH2, V1) 1.000000 0.000000 VOLUME( WH2, V2) 0.000000 4.000000 VOLUME( WH2, V3) 0.000000 1.000000 VOLUME( WH2, V4) 32.00000 0.000000 VOLUME( WH2, V5) 0.000000 1.000000 VOLUME( WH2, V6) 0.000000 2.000000 VOLUME( WH2, V7) 0.000000 2.000000 VOLUME( WH2, V8) 0.000000 0.000000 VOLUME( WH3, V1) 0.000000 4.000000 VOLUME( WH3, V2) 11.00000 0.000000 VOLUME( WH3, V3) 0.000000 0.000000 VOLUME( WH3, V4) 0.000000 9.000000 VOLUME( WH3, V5) 0.000000 3.000000 VOLUME( WH3, V6) 0.000000 4.000000 VOLUME( WH3, V7) 40.00000 0.000000 VOLUME( WH3, V8) 0.000000 4.000000 VOLUME( WH4, V1) 0.000000 4.000000 VOLUME( WH4, V2) 0.000000 2.000000 VOLUME( WH4, V3) 0.000000 4.000000 VOLUME( WH4, V4) 0.000000 1.000000 VOLUME( WH4, V5) 0.000000 3.000000 VOLUME( WH4, V6) 5.000000 0.000000 VOLUME( WH4, V7) 0.000000 2.000000 VOLUME( WH4, V8) 38.00000 0.000000 VOLUME( WH5, V1) 34.00000 0.000000 VOLUME( WH5, V2) 7.000000 0.000000 VOLUME( WH5, V3) 0.000000 7.000000 VOLUME( WH5, V4) 0.000000 4.000000 VOLUME( WH5, V5) 0.000000 2.000000 VOLUME( WH5, V6) 0.000000 1.000000 VOLUME( WH5, V7) 0.000000 2.000000 VOLUME( WH5, V8) 0.000000 5.000000VOLUME( WH6, V2) 0.000000 2.000000 VOLUME( WH6, V3) 22.00000 0.000000 VOLUME( WH6, V4) 0.000000 1.000000 VOLUME( WH6, V5) 0.000000 3.000000 VOLUME( WH6, V6) 27.00000 0.000000 VOLUME( WH6, V7) 3.000000 0.000000 VOLUME( WH6, V8) 0.000000 3.000000Row Slack or Surplus Dual Price1 664.0000 -1.0000002 0.000000 -4.0000003 0.000000 -5.0000004 0.000000 -4.0000005 0.000000 -3.0000006 0.000000 -7.0000007 0.000000 -3.0000008 0.000000 -6.0000009 0.000000 -2.00000010 0.000000 3.00000011 22.00000 0.00000012 0.000000 3.00000013 0.000000 1.00000014 0.000000 2.00000015 0.000000 2.000000。
Lingo的应用实例

Lingo应用——旅游路线最短问题题目:从北京乘飞机到东京、纽约、墨西哥城、伦敦、巴黎五个城市做旅游,每个城市去且仅去一次,再回到东京,问如何安排旅游线路,使总旅程最短。
各城市之间的航线距离如下表:运用lingo软件求解模型建立前问题分析:1.这是一个求路线最短的问题,题目给出了两两城市之间的距离,而在最短路线中,这些城市有的两个城市是直接相连接的(即紧接着先后到达的关系),有些城市之间就可能没有这种关系,所以给出的两两城市距离中有些在最后的最短路线距离计算中使用到了,有些则没有用。
这是一个0-1规划的问题,也是一个线性规划的问题。
2.由于每个城市去且仅去一次,最终肯定是形成一个圈的结构,这就导致了这六个城市其中有的两个城市是直接相连的,另外也有两个城市是不连接的。
这就可以考虑设0-1变量,如果两个城市紧接着去旅游的则为1,否则为0。
就如同下图实线代表两个城市相连为1,虚线代表没有相连为03. 因为每个城市只去一次,所以其中任何一个城市的必有且仅有一条进入路线和一条出去的路线。
求解:为了方便解题,给上面六个城市进行编号,如下表(因为北京是起点, 将其标为1)假设:设变量x ij 。
如果x ij =1,则表示城市i 与城市j 直接相连(即先后紧接到达关系),否则若x ij =0,则表示城市i 与城市j 不相连。
特别说明:x ij 和x ji 是同一变量,都表示表示城市i 与城市j 是否有相连的关系。
这里取其中x ij (I<j)的变量。
模型建立:由于这是一个最短路线的问题,且变量已经设好。
目标函数:min z=51*x12+78*x13+68*x14+51*x15+13*x16+56*x23+35*x24+21*x25+60*x26+21*x34+57*x35+70*x36+36*x45+68*x46+61*x56约束条件:1. 上面目标函数中的变量是表示两个城市是否直接相连接的关系,且最短路线是可以形成圈的,如下图实线代表两个城市相连为1,虚线代表没有相连为0如上图城市a和城市b有直接相连接的关系,所以之间变量为1,而城市a 与城市e则没有直接相连接的关系,之间变量为0。
用Lingo求解整数(0-1)规划模型

1、建立数学模型, 2、用lingo循环语句编写程序.
上机作业题 人员安排问题
某城市的巡逻大队要求每天的各个时间段都有一
定数量的警员值班, 以便随时处理突发事件, 每人连续 工作6h, 中间不休息. 如表所示是一天8个班次所需值 班警员的人数情况统计:
班次
时间段
人数 班次
时间段
人数
1
6:00~9:00
例 4 求函数 z x 22 y 22 的最小值.
例 4 求函数 z x 22 y 22 的最小值.
解: 编写Lingo 程序如下:
min=(x+2)^2+(y-2)^2; @free(x); 求得结果: x=-2, y=2
二、Lingo 循环编程语句
(1) 集合的定义 包括如下参数: 1) 集合的名称.
12,8 3,0; enddata
!数据赋值;
max=@sum(bliang(i):a(i)*x(i)); !目标函数;
@for(yshu(j):@sum(bliang(i):x(i)*c(j,i))<=b(j));
!约束条件;
例6:人员选拔问题
队员号码 身高 / m 位置 队员号码 身高 / m 位置
例 2 用Lingo软件求解整数规划问题
min z 2 x1 5 x2 3 x3
4 x1 x2 x3 0
2
x1
4 x2
2 x3
2
x1
x2
x3
2
xi 0 且取整数, i 1, 2, 3
Lingo 程序:
min=2*x1+5*x2+3*x3; -4*x1-x2+x3>=0; -2*x1+4*x2-2*x3>=2; x1-x2+x3>=2; @gin(x1);@gin(x2);@gin(x3);
Lingo超经典案例大全

Lingo超经典案例大全LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”。
Lingo超强的优化计算能力在很多方面(线性规划、非线性规划、线性整数规划、非线性整数规划、非线性混合规划、二次规划等)比matlab、maple等强得多,Lingo 编程简洁明了,数学模型不用做大的改动(或者不用改动)便可以直接采用Lingo语言编程,十分直观。
Lingo模型由4个段构成:(1)集合段(sets endsets);(2)数据段(data enddata);(3)初始段(init endinit);(4)目标与约束段。
Lingo的五大优点:1. 对大规模数学规划,LINGO语言所建模型较简洁,语句不多;2. 模型易于扩展,因为@FOR、@SUM等语句并没有指定循环或求和的上下限,如果在集合定义部分增加集合成员的个数,则循环或求和自然扩展,不需要改动目标函数和约束条件;3. 数据初始化部分与其它部分语句分开,对同一模型用不同数据来计算时,只需改动数据部分即可,其它语句不变;4. “集合”是LINGO有特色的概念,它把实际问题中的事物与数学变量及常量联系起来,是实际问题到数学量的抽象,它比C语言中的数组用途更为广泛。
5. 使用了集合以及@FOR、@SUM等集合操作函数以后可以用简洁的语句表达出常见的规划模型中的目标函数和约束条件,即使模型有大量决策变量和大量数据,组成模型的语句并不随之增加.一、求解线性整数规划、非线性整数规划问题:1.线性整数规划:model:max=x1+x2;x1+9/14*x2<=51/14;-2*x1+x2<=1/3;@gin(x1);@gin(x2);end求得x1=3,x2=1,最大值为4.运用matlab求时可以发现有两组解:x1=3,x2=1和x1=2,x2=2。
通过验证也可知这两组解均满足。
LINGO常用通用程序例

LINGO 求解常见数学规划问题通用程序1.求解线性规划 m a x ..Z cxAx b s t x =⎧⎨⎩≤≥0model:sets:row/1..m/:b;arange/1..n/:x,c;link(row, arange):a;endsetsdata:b=b(1),b(2),……,b(m);c=c(1),c(2),……,c(n);a=a(1,1),a(1,2),……,a(1,n),a(2,1),a(2,2),……,a(2,n),……a(m,1),a(m,2),……,a(m,n);enddatamax=@sum(arange(j):c(j)*x(j));@for(row(i):@sum(arange(j):a(i,j)*x(j))<=b(i)); @for(arange(j):x(j)>=0);end2.求解运输问题Model:Sets:row/1..m/:a; !产地的个数arrange/1..n/:b; !销地的个数link(row,arrange):c,x;endsetsdata:b=b(1),b(2),……,b(n);a=a(1),a(2),……,a(m);c=c(1,1),c(1,2),……,c(1,n),c(2,1),c(2,2),……,c(2,n),……c(m,1),c(m,2),……,c(m,n); enddatamin=@sum(link(i,j):c(i,j)*x(i,j));@for(row(i):@sum(arrange(j):x(i,j))=a(i)); @for(arrange(j):@sum(row(i):x(i,j))=b(j)); @for(link:x>=0);end3.整数规划求解(1).一般整数规划问题Model:Sets:num_i/1..m/:b; !m表示数组的维数num_j/1..n/:x,c; !n表示数组的维数link(num_i,num_j):a;endsetsdata:b=b(1),b(2),……,b(m); !约束条件右端项系数c=c(1),c(2),……,c(n); !目标函数系数a=a(1,1),a(1,2),……,a(1,n),a(2,1),a(2,2),……,a(2,n),……a(m,1),a(m,2),……,a(m,n); ! 约束条件系数矩阵enddatamax=@sum(num_j(j):c(j)*x(j));@for(num_i(i):@sum(num_j(j):a(i,j)*x(j))<=b(i);); @for(num_j(j):x(j)>=0);@for(num_j(j):@gin(x(j));end(2) 一般0—1规划问题Model:Sets:num_i/1..m/:b;num_j/1..n/:x,c;link(num_i, num_j):a;endsetsdata:b=b(1),b(2),……,b(m); !约束条件右端项系数c=c(1),c(2),……,c(n); !目标函数系数a=a(1,1),a(1,2),……,a(1,n),a(2,1),a(2,2),……,a(2,n),……a(m,1),a(m,2),……,a(m,n); ! 约束条件系数矩阵enddatamax=@sum(num_j(j):c(j)*x(j));@for(num_i(i):@sum(num_j(j):a(i,j)*x(j))<=b(i)); @for(num_j(j):@bin(x(j));End(3) 一般批派问题Model:Sets:Num_i/1..n/;Num_j/1..m/;Link(num_i,num_j):x,c;EndsetsData:c=c(1,1),c(1,2),……,c(1,n),c(2,1),c(2,2),……,c(2,n),……c(m,1),c(m,2),……,c(m,n);enddatamax=@sum(link(i,j):c(i,j)*x(i,j));@for(num_i(i):@sum(num_j(j):c(i,j)*x(i,j))=1); @for(num_j(j):@sum(num_i(i):c(i,j)*x(i,j))=1); @for(link(i,j):@bin(x(i,j)));End4.非线性规划问题(1) 非线性规划模型 ()()012012min ()(),,,..(),,, i j f x h x i m s t g x j l ⎧==⎪⎨=⎪⎩≥ Model:Sets:Num_i/1..m/; Num_j/1..l/;Num_k/1..n/:x0,x; Endsetsinit: !赋初值以缩小x0=x0(1), x0(2),……,x0(n); !最优解的寻找范围endinitmin=f(x);@for(num_i(i):hi(x)= =0);@for(num_j(j):gj(x)>=0);@for(num_k(k):x(k)>=0);End(2) 二次规划模型()()()1111012012min ,,,..,,,,, n n nj j jk j kj j k nij j i j j jk kj f x c x c x x a x b i m s t x c c j k n =====+⎧+=⎪⎨⎪==⎩∑∑∑∑≥≥Model:Sets:Num_i/1..m/:b;Num_j/1..n/:c,x;Num_k/1..n/:;Link_ij(num_i,num_j):a;Link_jk(num_j,num_k):c1;EndsetsData:c=c(1),c(2),……,c(n);b=b(1),b(2),……,b(m);a=a(1,1), a(1,2),……,a(1,n),a(2,1), a(2,2),……,a(2,n),…………a(m,1), a(m,2),……,a(m,n), enddatainit:x0=x0(1),x0(2),……,x0(n);endinitmin=@sum(num_j(j):c(j)*x(j)+@sum(link_jk(j,k):c(j, k)*x(j)*x(k));@for(num_i(i):@sum(num_j(j):a(i,j)*x(j))+b(i)>=0; @for(num_j(j):x(j)>=0);end。
lingo软件的使用具体例子

1
4
0
0
3
2
3
1
0
1
3
2
0
1
3
4
1
2
0
3
5
1
1
1
1
6
0
3
0
1
7
0
0
2
3
需求
50
20
15
约束 满足需求
4 x13 x22 x3x4x550 整数约束:
x22x4x53x620
x3x52x715
xi 为整数
钢管下料问题1
当余料没有用处时,通常以总根数最少为目标
目标2(总根数) M Z 2 i x 1 n x 2 x 3 x 4 x 5 x 6 x 7
客户需求
原料钢管:每根19米
4米50根
6米20根
8米15根
问题1. 如何下料最节省 ? 节省的标准是什么?
问题2. 客户增加需求:
5米10根
由于采用不同切割模式太多,会增加生产和管理成本, 规定切割模式不能超过3种。如何下料最节省?
钢管下料
切割模式
按照客户需要在一根原料钢管上安排切割的一种组合。
4米1根 6米1根
切割多少根原料钢管,最为节省?
两种 标准
1. 原料钢管剩余总余量最小 2. 所用原料钢管总根数最少
决策变量 xi ~按第i 种模式切割的原料钢管根数(i=1,2,…7)
目标1(总余量) M Z 1 3 i x 1 n x 2 3 x 3 3 x 4 x 5 x 6 3 x 7
模式 4米根数 6米根数 8米根数 余料
vk(xk,uk)gk(uk)
资源分配问题
运用Lingo进行线性规划求解(实例)

LinDo
输入模型 求解
点击求解按钮 结果
即可
♂返回
!注释内容,可用中文
输
!目标函数:最大-max,最小-min,大小写不分
max 3 x1+5 x2+4 x3
入
!约束,以subject to开始
模
subject to
型
2 x1+3 x2<=1500
2 x2+4 x3<=800
3*x1+2*x2+5*x3<=2 000; end
注意与LinDo的区别
目标函数中加等号 变量与系数之间用“*” Model:-end可省略
♂返回
LinGo 模 式
Model: Sets: !定义集合
Endsets
Data:
!定义数据
Enddata 调用函数与计算
end
♂返回
model: !开始
数
@sum(set(set_index_list)|condition:expressi
on)
@min(max)(set(set_index_list)|condition:ex pression)
♂返回
Global optimal solution found at
iteration:
3
结
Objective value: 2675.000
果
Variable Value
Reduced Cost
C( 1) 3.000000
0.000000
C( 2) 5.000000
0.000000
C( 3) 4.000000
0.000000
LINGO 程序范例

线性规划——LINGO程序集向浩 2011-7-20程序一:Model:Max= 4.8*x11 + 4.8*x21 + 5.6*x12 + 5.6*x22 - 10*x1 - 8*x2 - 6*x3; x11+x12 < x + 500;x21+x22 < 1000;0.5*x11 - 0.5*x21 > 0;0.4*x12 - 0.6*x22 > 0;x=x1+x2+x3;(x1 - 500) * x2=0;(x2 - 500) * x3=0;@bnd(0,x1, 500);@bnd(0,x2, 500);@bnd(0,x3,500);End程序二:Model:SETS:Points/1..4/: b, c, y, z; ! 端点数为4,即分段数为3; ENDSETSDATA:b=0 500 1000 1500;c=0 5000 9000 12000;y=,,,0; ! 增加的虚拟变量y(4)=0;ENDDATAMax= 4.8*x11 + 4.8*x21 + 5.6*x12 + 5.6*x22 - @sum(Points: c*z); x11+x12 < x + 500;x21+x22 < 1000;0.5*x11 - 0.5*x21 > 0;0.4*x12 - 0.6*x22 > 0;@sum(Points: b*z)=x;@for(Points(i)|i#eq#1: z(i) <= y(i));@for(Points(i)|i#ne#1: z(i) <= y(i-1)+y(i));@sum(Points: y)=1;@sum(Points: z)=1;@for(Points: @bin(y));End程序三:MODEL:TITLE 瓶颈设备的多级生产计划;! 从文本文件exam0502.LDT中读取数据;SETS:! PART = 项目集合, Setup = 生产准备费,Hold = 单件库存成本,A = 对瓶颈资源的消耗系数;PART/ @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT')/ : Setup, Hold, A; ! TIME = 计划期集合,Capacity = 瓶颈设备的能力;TIME / @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT')/ : Capacity;! USES = 项目结构关系,Req = 项目之间的消耗系数;USES( PART, PART) : Req;! PXT = 项目与时间的派生集合,Demand = 外部需求,X = 产量(批量), Y = 0/1变量,INV = 库存;PXT( PART, TIME): Demand, X, Y, Inv;ENDSETS! 目标函数;[OBJ] Min = @sum(PXT(i,t):setup(i)*Y(i,t) + hold(i)*Inv(i,t) );! 物流平衡方程;@FOR( PXT(i, t) | t #NE# 1 : [Bal]Inv(i,t-1)+X(i,t)-Inv(i,t) = Demand(i, t) +@SUM( USES(i,j): Req(i,j)*X(j,t)) );@FOR( PXT(i, t) | t #eq# 1 : [Ba0]X(i,t)-Inv(i,t) = Demand(i, t) +@SUM( USES(i,j): Req(i,j)*X(j,t)) );! 能力约束;@FOR( TIME(t):[Cap] @SUM( PART(i): A(i)*X(i,t) ) < Capacity(t) );! 其他约束;M = 25000;@FOR( PXT(i,t): X(i,t) <= M*Y(i,t));@FOR( PXT: @BIN(Y) );DATA:Demand = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT'); Capacity = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT'); Setup = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT');Hold = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT');A = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT');Req = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT'); ENDDATA程序四:model:Title 钢管下料 - 最小化钢管根数的LINGO模型;SETS:NEEDS/1..4/:LENGTH,NUM;! 定义基本集合NEEDS及其属性LENGTH,NUM;CUTS/1..3/:X;! 定义基本集合CUTS及其属性X;PATTERNS(NEEDS,CUTS):R;! 定义派生集合PATTERNS(这是一个稠密集合)及其属性R; ENDSETSDATA:LENGTH=4 5 6 8;NUM=50 10 20 15;CAPACITY=19;ENDDATAmin=@SUM(CUTS(I): X(I) );!目标函数;@FOR(NEEDS(I): @SUM(CUTS(J): X(J)*R(I,J) ) >NUM(I) );!满足需求约束;@FOR(CUTS(J): @SUM(NEEDS(I): LENGTH(I)*R(I,J) ) <CAPACITY ); !合理切割模式约束;@FOR(CUTS(J): @SUM(NEEDS(I): LENGTH(I)*R(I,J) ) >CAPACITY -@MIN(NEEDS(I):LENGTH(I)) );!合理切割模式约束;@SUM(CUTS(I): X(I) ) >26; @SUM(CUTS(I): X(I) ) <31;!人为增加约束;@FOR(CUTS(I)|I#LT#@SIZE(CUTS):X(I)>X(I+1) );!人为增加约束;@FOR(CUTS(J): @GIN(X(J)) ) ;@FOR(PATTERNS(I,J): @GIN(R(I,J)) );end程序五:model:Title 面试问题;SETS:! Person = 被面试者集合,Stage = 面试阶段的集合;Person/@FILE(exam0505.txt)/;Stage/@FILE(exam0505.txt)/;! T = 已知的面试所需要的时间,X = 面试开始时间;PXS(Person,Stage): T, X;! Y(i,k) = 1: k排在i前,0:否则;PXP(Person,Person)|&1 #LT# &2: Y;ENDSETSDATA:T=@FILE(exam0505.txt);ENDDATA[obj] min =MAXT;! MAXT是面试的最后结束时间;MAXT >= @max(PXS(i,j)|j#EQ#@size(stage): x(i,j)+t(i,j));只有参加完前一个阶段的面试后才能进入下一个阶段;!@for(PXS(i,j)|j #LT# @size(stage): [ORDER] x(i,j) + t(i,j) < x(i,j+1) );同一时间只能面试1名同学;!@for(Stage(j):@for(PXP(i,k): [SORT1] x(i,j) + t(i,j) - x(k,j) < MAXT*Y(i,k) );@for(PXP(i,k): [SORT2] x(k,j) + t(k,j) - x(i,j) < MAXT*(1-Y(i,k)) ); );@for(PXP: @bin(y));End程序六:MODEL:TITLE 飞机定位模型3;SETS:VOR/1..3/: x, y, cita, sigma,alpha;ENDSETSDATA:x, y, cita, sigma =746 1393 2.81347 0.0140629 375 0.78714 0.01051571 259 5.39307 0.0227;x4 y4 d4 sigma4 = 155 987 864.3 2.0; ENDDATAINIT:xx, yy = 980.6926, 731.5666;ENDINIT! XX,YY表示飞机坐标;@for(vor: @tan(alpha)=(xx-x)/(yy-y) );min = @sum(VOR: ((alpha - cita)/sigma)^2 )+ ((d4 - ((xx-x4)^2+(yy-y4)^2)^.5 )/sigma4 )^2; END程序七:MODEL:TITLE 交通流均衡;SETS:ROAD/AB,AC,BC,BD,CD/:Y;CAR/2,3,4/;LINK(CAR,ROAD): T, X;ENDSETSDATA:! 行驶时间(分钟) ;! T=20,52,12,52,2030,53,13,53,3040,54,14,54,40;! 增加的总行驶时间(千辆车*分钟) ;T= 20 52 12 52 2050 55 15 55 5070 57 17 57 70;ENDDATA[OBJ] MIN=@SUM(LINK: T*X); ! 目标函数;! 四个节点的流量守恒条件;[NODE_A] Y(@INDEX(AB))+Y(@INDEX(AC)) = 6;[NODE_B] Y(@INDEX(AB))=Y(@INDEX(BC))+Y(@INDEX(BD)); [NODE_C] Y(@INDEX(AC))+Y(@INDEX(BC))=Y(@INDEX(CD)); [NODE_D] Y(@INDEX(BD))+Y(@INDEX(CD))=6;! 每条道路上的总流量Y等于该道路上的分流量X的和;@FOR( ROAD(I):[ROAD_LIM] @SUM(CAR(J): X(J,I)) = Y(I) );! 每条道路的分流量X的上下界设定;@FOR(LINK(I,J)|I#EQ#1: @BND(0,X(I,J),2) );@FOR(LINK(I,J)|I#GT#1: @BND(0,X(I,J),1) );END程序八:MODEL:Title 简单的投资组合模型;SETS:YEAR/1..12/;STOCKS/ A, B, C/: Mean,X;link(YEAR, STOCKS): R;STST(Stocks,stocks): COV;ENDSETSDATA:TARGET = 1.15;! R是原始数据;R =1.300 1.225 1.1491.103 1.290 1.2601.216 1.216 1.4190.954 0.728 0.9220.929 1.144 1.1691.056 1.107 0.9651.038 1.321 1.1331.089 1.305 1.7321.090 1.195 1.0211.083 1.390 1.1311.035 0.928 1.0061.176 1.715 1.908;ENDDATACALC: !计算均值向量Mean与协方差矩阵COV;@for(stocks(i): Mean(i) =@sum(year(j): R(j,i)) / @size(year) );@for(stst(i,j): COV(i,j) = @sum(year(k):(R(k,i)-mean(i))*(R(k,j)-mean(j))) / (@size(year)-1) ); ENDCALC[OBJ] MIN = @sum(STST(i,j): COV(i,j)*x(i)*x(j)); [ONE] @SUM(STOCKS: X) = 1;[TWO] @SUM(stocks: mean*x) >= TARGET;END程序九:MODEL:Title 含有国库券的投资组合模型;SETS:STOCKS/ A, B, C, D/: Mean,X;STST(Stocks,stocks): COV;ENDSETSDATA:TARGET = 1.1; ! 1.15;! Mean是收益均值,COV是协方差矩阵;mean=1.089083 1.213667 1.234583 1.05;COV=0.01080754 0.01240721 0.01307513 00.01240721 0.05839170 0.05542639 00.01307513 0.05542639 0.09422681 00 0 0 0;ENDDATA[OBJ] MIN = @sum(STST(i,j): COV(i,j)*x(i)*x(j)); [ONE] @SUM(STOCKS: X) = 1;[TWO] @SUM(stocks: mean*x) >= TARGET;END程序十:MODEL:Title 考虑交易费的投资组合模型;SETS:STOCKS/ A, B, C/: C,Mean,X,Y,Z;STST(Stocks,stocks): COV;ENDSETSDATA:TARGET = 1.15;! 股票的初始份额;c=0.5 0.35 0.15;! Mean是收益均值,COV是协方差矩阵;mean=1.089083 1.213667 1.234583;COV=0.01080754 0.01240721 0.013075130.01240721 0.05839170 0.055426390.01307513 0.05542639 0.09422681; ENDDATA[OBJ] MIN = @sum(STST(i,j): COV(i,j)*x(i)*x(j)); [ONE] @SUM(STOCKS: X+0.01*Y+0.01*Z) = 1; [TWO] @SUM(stocks: mean*x) >= TARGET;@FOR(stocks: [ADD] x = c - y + z);END程序十一:MODEL:Title 利用股票指数简化投资组合模型; SETS:STOCKS/A, B, C/: u, b, s2, x;ENDSETSDATA:! mean0,s20,u,b,s2是线性回归的结果数据; mean0=1.191458;s20 = 0.02873661;s2 = 0.005748320,0.01564263,0.03025165;u = 0.5639761, -0.2635059,-0.5809590;b = 0.4407264, 1.239802, 1.523798; ENDDATA[OBJ] MIN = s20*y*y + @sum(stocks: s2*x*x);![OBJ] MIN = s20*@sqr(y) + @sum(stocks: s2*@sqr(x)); @sum(stocks: b*x)=y;@sum(stocks: x)=1;@sum(stocks: (u+b*mean0)*x)>1.15;END程序十二:MODEL:TITLE 新产品的市场预测;SETS:PROD/ A B C D/: P;LINK(PROD, PROD): T;ENDSETSDATA: ! 转移概率矩阵;T = .75 .1 .05 .1.4 .2 .1 .3.1 .2 .4 .3.2 .2 .3 .3;ENDDATA@FOR(PROD(I)| I #LT# @SIZE(PROD):!去掉了一个冗余约束;P(I)=@SUM(LINK(J,I): P(J)* T(J,I)) );@SUM(PROD: P) = 1;@FOR(PROD(I):@WARN( '输入矩阵的每行之和必须是1',@ABS( 1 - @SUM(LINK(I,J): T(I,J)))#GT# .000001); );END程序十三:MODEL:TITLE 产品属性的效用函数;SETS:PRICE /H, M, L/ : P;SAFETY/2, 1, 0/ : Q;M(safety, PRICE) : C0;MM(M, M)|C0(&1,&2) #LT# C0(&3,&4): ERROR; ENDSETSDATA:C0 = 7 8 9 3 4 6 1 2 5;ENDDATA@FOR( MM( i, j, k, l): ERROR( i, j, k, l) >=1 + ( P( j) + Q( i)) - ( P( l) + Q( k)) );[obj] MIN = @SUM(mm: ERROR);END程序十四:MODEL:TITLE 最小二乘法计算产品属性的效用函数; SETS:PRICE /H, M, L/ : P;SAFETY/2, 1, 0/ : Q;M(safety, PRICE) : C0, ERROR, sort; ENDSETSDATA:C0 = 7 8 9 3 4 6 1 2 5;ENDDATA@FOR(M(i,j):sort(i,j)=p(j)+q(i);ERROR(i,j)= sort(i,j) -C0(i,j) );MIN = @SUM(M: @sqr(ERROR) );![obj] MIN = @SUM(M: ERROR^2 );@FOR(M(i,j): @FREE(ERROR) );!@FOR(price: @gin(P) );!@FOR(safety: @gin(Q) );END程序十五:MODEL:TITLE 机票销售计划;SETS:route /AH,AB,AC,HB,HC/:a,b,p,q,x,y; ENDSETSDATA:a pb q =331905690 2424443193 1226167199 441406980 1618617103 ; c1 c2 c3 = 120 100 110;ENDDATA[obj] Max = @SUM(route: p*x+q*y );@SUM(route(i)|i#ne#4#and#i#ne#5:x(i)+y(i)) < c1; @SUM(route(i)|i#eq#2#or#i#eq#4:x(i)+y(i)) < c2;@SUM(route(i)|i#eq#3#or#i#eq#5:x(i)+y(i)) < c3;@FOR(route: @bnd(0,x,a);@bnd(0,y,b) );END程序十六:! 3 Warehouse, 4 Customer Transportation Problem; sets:Warehouse /1..3/: a;Customer /1..4/: b;Routes( Warehouse, Customer) : c, x;endsets! Here are the parameters;data:a = 30, 25, 21;b = 15, 17, 22, 12;c = 6, 2, 6, 7,4, 9, 5, 3,8, 8, 1, 5;enddata! The objective;[OBJ] min = @sum( Routes: c * x);! The supply constraints;@for( Warehouse(i): [SUP]@sum( Customer(j): x(i,j)) <= a(i));! The demand constraints;@for( Customer(j): [DEM]@sum( Warehouse(i): x(i,j)) = b(j));程序十七:! Assignment Problem Model;sets:Flight/1..6/;Assign(Flight, Flight): c, x;endsets! Here is income matrix;data:c = 20 15 16 5 4 717 15 33 12 8 69 12 18 16 30 1312 8 11 27 19 14-99 7 10 21 10 32-99 -99 -99 6 11 13;enddata! Maximize valve of assignments;max = @sum(Assign: c*x);@for(Flight(i):! Each i must be assigned to some j;@sum(Flight(j): x(i,j)) = 1;! Each I must receive an assignment;@sum(Flight(j): x(j,i)) = 1;);程序十八:! 2 plants, 3 warehouses and 4 customers Transshipment Problem;sets:Plant /A, B/: produce;Warhouse /x, y, z/;Customer /1..4/: require;LinkI ( Plant, Warhouse): cI, xI;LinkII ( Warhouse, Customer): cII, xII;endsets! Here are the parameters;data:produce = 9, 8;require = 3, 5, 4, 5;cI = 1, 2, 100,3, 1, 2;cII = 5, 7, 100, 100,9, 6, 7, 100,100, 8, 7, 4;enddata! The objective;[OBJ] min = @sum( LinkI: cI * xI) + @sum( LinkII: cII * xII); ! The supply constraints;@for( Plant(i): [SUP]@sum( Warhouse(j): xI(i,j)) <= produce(i));! The warhouse constraints;@for( Warhouse(j): [MID]@sum( Plant(i): xI(i,j))=@sum( Customer(k): xII(j,k))); ! The demand constraints;@for( Customer(k): [DEM]@sum( Warhouse(j): xII(j,k)) = require(k));! 2 plants, 3 warehouses and 4 customersTransshipment Problem;sets:Plant /A,B/ : produce;Warhouse /x,y,z/;Customer /1..4/ : require;Link ( Plant, Warhouse, Customer) : poss, cost, x; endsets! Here are the parameters;data:produce = 9, 8;require = 3, 5, 4, 5;poss = 1, 1, 0, 0,1, 1, 1, 0,0, 0, 0, 0,1, 1, 0, 0,1, 1, 1, 0,0, 1, 1, 1;cost = 6, 8, 0, 0,11, 8, 9, 0,0, 0, 0, 0,8,10, 0, 0,10, 7, 8, 0,0,10, 9, 6;enddata! The objective;[OBJ] min = @sum( Link: poss * cost * x);! The supply constraints;@for( Plant(i): [SUP]@sum( Warhouse(j):@sum( Customer(k): poss(i,j,k) * x(i,j,k)))<=produce(i)); ! The demand constraints;@for( Customer(k): [DEM]@sum( Plant(i):@sum( Warhouse(j): poss(i,j,k) * x(i,j,k))) = require(k));程序十九:! We have a network of 7 cities. We want to findthe length of the shortest route from city 1 to city 7; sets:! Here is our primitive set of seven cities;cities/A, B1, B2, C1, C2, C3, D/;! The Derived set "roads" lists the roads thatexist between the cities;roads(cities, cities)/A,B1 A,B2 B1,C1 B1,C2 B1,C3 B2,C1 B2,C2 B2,C3 C1,D C2,D C3,D/: w, x;endsetsdata:! Here are the distances that correspondto above links;w = 2 4 3 3 1 2 3 1 1 3 4;enddatan=@size(cities); ! The number of cities;min=@sum(roads: w*x);@for(cities(i) | i #ne# 1 #and# i #ne# n:@sum(roads(i,j): x(i,j)) = @sum(roads(j,i): x(j,i))); @sum(roads(i,j)|i #eq# 1 : x(i,j))=1;程序二十:sets:cities/1..11/;roads(cities, cities): p, w, x;endsetsdata:p = 0 1 1 1 0 0 0 0 0 0 00 0 1 0 1 0 0 0 0 0 00 1 0 1 1 1 1 0 0 0 00 0 1 0 0 0 1 0 0 0 00 1 1 0 0 1 0 1 1 0 00 0 1 0 1 0 1 0 1 0 00 0 1 1 0 1 0 0 1 1 00 0 0 0 1 0 0 0 1 0 10 0 0 0 1 1 1 1 0 1 10 0 0 0 0 0 1 0 1 0 10 0 0 0 0 0 0 0 0 0 0;w = 0 2 8 1 0 0 0 0 0 0 02 0 6 0 1 0 0 0 0 0 08 6 0 7 5 1 2 0 0 0 01 0 7 0 0 0 9 0 0 0 00 1 5 0 0 3 0 2 9 0 00 0 1 0 3 0 4 0 6 0 00 0 2 9 0 4 0 0 3 1 00 0 0 0 2 0 0 0 7 0 90 0 0 0 9 6 3 7 0 1 20 0 0 0 0 0 1 0 1 0 40 0 0 0 0 0 0 9 2 4 0;enddatan=@size(cities);min=@sum(roads:w*x);@for(cities(i) | i #ne# 1 #and# i #ne# n:@sum(cities(j): p(i,j)*x(i,j)) = @sum(cities(j): p(j,i)*x(j,i))); @sum(cities(j): p(1,j)*x(1,j))=1;程序二十一:sets:nodes/s,1,2,3,4,t/;arcs(nodes, nodes)/s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/: c, f;endsetsdata:c = 8 7 5 9 9 2 5 6 10;enddatamax=flow;@for(nodes(i) | i #ne# 1 #and# i #ne# @size(nodes):@sum(arcs(i,j):f(i,j)) - @sum(arcs(j,i):f(j,i))=0);@sum(arcs(i,j)|i #eq# 1 : f(i,j)) = flow;@for(arcs: @bnd(0, f, c));程序二十二:sets:nodes/s,1,2,3,4,t/;arcs(nodes, nodes): p, c, f;endsetsdata:p = 0 1 1 0 0 00 0 1 1 0 00 0 0 0 1 00 0 1 0 0 10 0 0 1 0 10 0 0 0 0 0;c = 0 8 7 0 0 00 0 5 9 0 00 0 0 0 9 00 0 2 0 0 50 0 0 6 0 100 0 0 0 0 0;enddatamax = flow;@for(nodes(i) | i #ne# 1 #and# i #ne# @size(nodes):@sum(nodes(j): p(i,j)*f(i,j)) = @sum(nodes(j):p(j,i)*f(j,i)) ); @sum(nodes(i):p(1,i)* f(1,i)) = flow;@for(arcs:@bnd(0, f, c));程序二十三:sets:nodes/s,1,2,3,4,t/:d;arcs(nodes, nodes)/s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/: c, u, f;endsetsdata:d = 14 0 0 0 0 -14;c = 2 8 5 2 3 1 6 4 7;u = 8 7 5 9 9 2 5 6 10;enddatamin=@sum(arcs:c*f);@for(nodes(i) | i #ne# 1 #and# i #ne# @size(nodes):@sum(arcs(i,j):f(i,j)) - @sum(arcs(j,i):f(j,i))=d(i));@sum(arcs(i,j)|i #eq# 1 : f(i,j))=d(1);@for(arcs:@bnd(0,f,u));程序二十四:sets:cities/1..10/:level; !level(i)= the level of city;link(cities, cities):distance, !The distance matrix;x; ! x(i,j)=1 if we use link i,j;endsetsdata: !Distance matrix, it need not be symmetirc; distance = 0 8 5 9 12 14 12 16 17 228 0 9 15 16 8 11 18 14 225 9 0 7 9 11 7 12 12 179 15 7 0 3 17 10 7 15 1512 16 9 3 0 8 10 6 15 1514 8 11 17 8 0 9 14 8 1612 11 7 10 10 9 0 8 6 1116 18 12 7 6 14 8 0 11 1117 14 12 15 15 8 6 11 0 1022 22 17 15 15 16 11 11 10 0;enddatan=@size(cities); !The model size;! Minimize total distance of the links;min=@sum(link(i,j)|i #ne# j: distance(i,j)*x(i,j));!There must be an arc out of city 1;@sum(cities(i)|i #gt# 1: x(1,i))>=1;!For city i, except the base (city 1);@for(cities(i) | i #gt# 1 :! It must be entered;@sum(cities(j)| j #ne# i: x(j,i))=1;! level(j)=levle(i)+1, if we link j and i;@for(cities(j)| j #gt# 1 #and# j #ne# i :level(j) >= level(i) + x(i,j)- (n-2)*(1-x(i,j)) + (n-3)*x(j,i););! The level of city is at least 1 but no more n-1,and is 1 if it links to base (city 1);@bnd(1,level(i),999999);level(i)<=n-1-(n-2)*x(1,i););! Make the x's 0/1;@for(link : @bin(x));程序二十五:sets:cities/1..10/:level; !level(i)= the level of city;link(cities, cities):distance, !The distance matrix;x; ! x(i,j)=1 if we use link i,j;endsetsdata: !Distance matrix, it need not be symmetirc; distance = 0 8 5 9 12 14 12 16 17 228 0 9 15 16 8 11 18 14 225 9 0 7 9 11 7 12 12 179 15 7 0 3 17 10 7 15 1512 16 9 3 0 8 10 6 15 1514 8 11 17 8 0 9 14 8 1612 11 7 10 10 9 0 8 6 1116 18 12 7 6 14 8 0 11 1117 14 12 15 15 8 6 11 0 1022 22 17 15 15 16 11 11 10 0;enddatan=@size(cities); !The model size;! Minimize total distance of the links;min=@sum(link(i,j)|i #ne# j: distance(i,j)*x(i,j));!There must be an arc out of city 1;@sum(cities(i)|i #gt# 1: x(1,i))>=1;!For city i, except the base (city 1);@for(cities(i) | i #gt# 1 :! It must be entered;@sum(cities(j)| j #ne# i: x(j,i))=1;! level(j)=levle(i)+1, if we link j and i;@for(cities(j)| j #gt# 1 #and# j #ne# i :level(j) >= level(i) + x(i,j)- (n-2)*(1-x(i,j)) + (n-3)*x(j,i););! The level of city is at least 1 but no more n-1,and is 1 if it links to base (city 1);@bnd(1,level(i),999999);level(i)<=n-1-(n-2)*x(1,i););! Make the x's 0/1;@for(link : @bin(x));程序二十六:sets:cities/1..10/:level; !level(i)= the level of city;link(cities, cities):distance, !The distance matrix;x; ! x(i,j)=1 if we use link i,j;endsetsdata: !Distance matrix, it need not be symmetirc; distance = 0 8 5 9 12 14 12 16 17 228 0 9 15 16 8 11 18 14 225 9 0 7 9 11 7 12 12 179 15 7 0 3 17 10 7 15 1512 16 9 3 0 8 10 6 15 1514 8 11 17 8 0 9 14 8 1612 11 7 10 10 9 0 8 6 1116 18 12 7 6 14 8 0 11 1117 14 12 15 15 8 6 11 0 1022 22 17 15 15 16 11 11 10 0;enddatan=@size(cities); !The model size;! Minimize total distance of the links;min=@sum(link(i,j)|i #ne# j: distance(i,j)*x(i,j));!For city i;@for(cities(i) :! It must be entered;@sum(cities(j)| j #ne# i: x(j,i))=1;! It must be departed;@sum(cities(j)| j #ne# i: x(i,j))=1;! level(j)=levle(i)+1, if we link j and i;@for(cities(j)| j #gt# 1 #and# j #ne# i :level(j) >= level(i) + x(i,j)- (n-2)*(1-x(i,j)) + (n-3)*x(j,i);););! Make the x's 0/1;@for(link : @bin(x));! For the first and last stop;@for(cities(i) | i #gt# 1 :level(i)<=n-1-(n-2)*x(1,i);level(i)>=1+(n-2)*x(i,1););程序二十九:sets:events/1..8/: d;operate(events, events)/! A B C D E 0 F G H I 0 J K;1,2 1,3 1,4 3,4 2,5 3,5 4,6 5,6 5,8 5,7 6,7 7,8 6,8 /: a, m, b, et, dt, x;endsetsdata:a = 3 8 8 2 3 0 8 18 26 18 0 12 11;m = 5 9 11 4 4 0 16 20 33 25 0 15 21;b = 7 16 14 6 5 0 18 28 52 32 0 18 25;d = 1 0 0 0 0 0 0 -1;limit = 52;enddata@for(operate:et = (a+4*m+b)/6;dt = (b-a)^2/36;);max = Tbar;Tbar = @sum(operate: et*x);@for(events(i):@sum(operate(i,j): x(i,j)) - @sum(operate(j,i): x(j,i)) =d(i););S^2=@sum(operate: dt*x);p=@psn((limit-Tbar)/S);@psn((days-Tbar)/S) = 0.95;程序三十:sets:Level/1..3/: P, z, Goal;Variable/1..2/: x;H_Con_Num/1..1/: b;S_Con_Num/1..4/: g, dplus, dminus;H_Cons(H_Con_Num, Variable): A;S_Cons(S_Con_Num, Variable): C;Obj(Level, S_Con_Num): Wplus, Wminus; endsetsdata:P= ? ? ?;Goal = ? ? 0;b = 12;g= 1500 0 16 15;A = 2 2;C = 200 300 2 -1 4 0 0 5;Wplus = 0 0 0 00 1 0 00 0 3 1;Wminus = 1 0 0 00 1 0 00 0 3 0;enddatamin=@sum(Level: P * z);@for(Level(i):z(i)=@sum(S_Con_Num(j): Wplus(i,j)*dplus(j))+@sum(S_Con_Num(j): Wminus(i,j)*dminus(j))); @for(H_Con_Num(i):@sum(Variable(j): A(i,j) * x(j)) <= b(i));@for(S_Con_Num(i):@sum(Variable(j): C(i,j)*x(j))+ dminus(i) - dplus(i) = g(i););@for(Level(i) | i #lt# @size(Level):@bnd(0, z(i), Goal(i)););程序三十一:sets:Level/1..4/: P, z, Goal;Variable/1..2/: x;S_Con_Num/1..4/: g, dplus, dminus;S_Cons(S_Con_Num, Variable): C;Obj(Level, S_Con_Num): Wplus, Wminus; endsetsdata:P= ? ? ? ?;Goal = ?, ?, ?, 0;g= 27500 800 320 900;C = 25 10 1 0 0 1 1 0;Wplus = 0 0 0 00 0 0 10 0 0 00 1 3 0;Wminus = 1 0 0 00 0 0 00 2 1 00 0 0 0;enddatamin=@sum(Level: P * z);@for(Level(i):z(i)=@sum(S_Con_Num(j): Wplus(i,j)*dplus(j))+@sum(S_Con_Num(j): Wminus(i,j)*dminus(j))); @for(S_Con_Num(i):@sum(Variable(j): C(i,j)*x(j))+ dminus(i) - dplus(i) = g(i););@for(Level(i) | i #lt# @size(Level):);程序三十二:sets:Level/1..5/: P, z, Goal;Variable/1..3/: x;S_Con_Num/1..8/: g, dplus, dminus;S_Cons(S_Con_Num, Variable): C;Obj(Level, S_Con_Num): Wplus, Wminus; endsetsdata:P= ? ? ? ? ?;Goal = ?, ?, ?, ?, 0;g= 1700 50 50 80 100 120 100 1900;C = 5 8 12 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 5 8 12; Wplus = 0 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0;Wminus = 1 0 0 0 0 0 0 00 20 18 21 0 0 0 00 0 0 0 0 0 0 00 0 0 0 20 18 21 00 0 0 0 0 0 0 0;enddatamin=@sum(Level: P * z);@for(Level(i):z(i)=@sum(S_Con_Num(j): Wplus(i,j)*dplus(j))+@sum(S_Con_Num(j): Wminus(i,j)*dminus(j))); @for(S_Con_Num(i):@sum(Variable(j): C(i,j)*x(j))+ dminus(i) - dplus(i) = g(i););@for(Level(i) | i #lt# @size(Level):);程序三十二:sets:Level/1..8/: P, z, Goal;S_Con_Num/1..13/: dplus, dminus;Plant /1..3/: a;Customer /1..4/: b;Routes(Plant, Customer): c, x;endsetsdata:P= ? ? ? ? ? ? ? ?;Goal = ? ? ? ? ? ? ? 0;a = 300 200 400;b = 200 100 450 250;c = 5 2 6 73 54 64 5 2 3;enddatamin=@sum(Level: P * z);z(1) = dminus(9);z(2) = dminus(1);z(3) = dminus(2)+dminus(3)+dminus(4)+dminus(5);z(4) = dminus(6)+dminus(7)+dminus(8)+dminus(9);z(5) = dplus(10);z(6) = dplus(11);z(7) = dminus(12)+dplus(12);z(8) = dplus(13);@for(Plant(i):@sum(Customer(j): x(i,j)) <= a(i));x(3,1)+dminus(1)-dplus(1)=100;@for(Customer(j):@sum(Plant(i): x(i,j))+dminus(1+j)-dplus(1+j)=0.8*b(j);@sum(Plant(i): x(i,j))+dminus(5+j)-dplus(5+j)=b(j); );@sum(Routes: c*x)+dminus(10)-dplus(10)=3245; x(2,4)+dminus(11)-dplus(11)=0;@sum(Plant(i): x(i,1))-20/45*@sum(Plant(i): x(i,3)) +dminus(12)-dplus(12)=0;@sum(Routes: c*x)+dminus(13)-dplus(13)=2950; @for(Level(i)|i #lt# @size(Level):@bnd(0,z(i),Goal(i)););程序三十三:sets:optA/1..3/: x;optB/1..3/: y;AXB(optA,optB) : Ca, Cb;endsetsdata:Ca = 14 13 1213 12 1212 12 13;Cb = 13 14 1514 15 1515 15 14;enddataVa=@sum(AXB(i,j): Ca(i,j)*x(i)*y(j));Vb=@sum(AXB(i,j): Cb(i,j)*x(i)*y(j));@for(optA(i):@sum(optB(j) : Ca(i,j)*y(j))<=Va);@for(optB(j):@sum(optA(i) : Cb(i,j)*x(i))<=Vb);@sum(optA : x)=1; @sum(optB : y)=1;@free(Va); @free(Vb);程序三十四:sets:order/1..99/: TC, EOQ;endsets@for(order(i):EOQ(i)=D/i;TC(i)=0.5*C_P*EOQ(i)+C_D*D/EOQ(i););TC_min=@min(order: TC);Q=@sum(order(i): EOQ(i)*(TC_min #eq# TC(i)));N=D/Q;data:C_D = 12000;D = 96000;C_P = 3.6;enddata程序三十五:sets:order/1..99/: TC, EOQ, EOS;endsets@for(order(i):EOQ(i)=D/i;EOS(i)=C_P/(C_p+C_S)*EOQ(i);TC(i)=0.5*C_P*(EOQ(i)-EOS(i))^2/EOQ(i)+C_D*D/EOQ(i) +0.5*C_S*EOS(i)^2/EOQ(i););TC_min=@min(order: TC);Q=@sum(order(i): EOQ(i)*(TC_min #eq# TC(i)));S=@sum(order(i): EOS(i)*(TC_min #eq# TC(i)));N=D/Q;data:C_D = 12000;D = 96000;C_P = 3.6;C_S = 13.2;Enddata程序三十六:sets:range/1..4/: B, C, C_P, EOQ, Q, TC;endsetsdata:D = 40000;C_D = 9000;R = .2;B = 10000, 20000, 30000, 40000;C = 35.225, 34.525, 34.175, 33.825;enddata@for(range:C_P = R*C;EOQ = ( 2*C_D*D/C_P)^0.5;);Q(1) = EOQ(1)-(EOQ(1)-B(1)+1)*(EOQ(1) #ge# B(1));@for(range(i) | i #gt# 1:Q(i)=EOQ(i)+(B(i-1)-EOQ(i))*(EOQ(i) #lt# B(i-1))-(EOQ(i)- B(i)+1)*(EOQ(i) #ge# B(i)););@for(range(i):TC(i)=0.5*C_P(i)*Q(i)+C_D*D/Q(i)+C(i)*D);TC_min = @min(range: TC);Q_star = @sum(range: Q*( TC #eq# TC_min));T_star = Q_star/D;程序三十七:MODEL:TITLE 飞行管理问题的非线性规划模型;SETS:Plane/1..6/: x0, y0, cita0, cita1, d_cita;! cita0表示初始角度,cita1为调整后的角度,d_cita为调整的角度;link(plane, plane)|&1 #LT# &2: b,c;ENDSETSDATA:x0 y0 cita0 =1501402438585236150155220.5145501591301502300052;max_cita = 30;T_max = 0.283;V=800;ENDDATAINIT:d_cita = 0 0 0 0 0 0;ENDINIT@for(plane: cita1 - cita0 = d_cita);@for(link(i,j):b(i,j) = -2*(x0(i) -x0(j))*@sin ((cita1(i)+cita1(j))*3.14159265/360)+2*(y0(i) -y0(j))*@cos ((cita1(i)+cita1(j))*3.14159265/360);c(i,j) = (x0(i) -x0(j)) ^2 + (y0(i) -y0(j)) ^2 - 64;);! 避免碰撞的条件;! 右端点非负;@for(link(i,j): [Right](2*V*T_max*@sin((cita1(i)-cita1(j))*3.14159265/360))^2+ b(i,j)*(2*V*T_max*@sin((cita1(i)-cita1(j))*3.14159265/360))+ c(i,j) > 0);! 最小点非负;@for(link(i,j): [Minimum] @if(-b(i,j)/4/V/@sin((cita1(i)-cita1(j))*3.14159265/360) #gt#0 #and# -b(i,j)/4/V/@sin((cita1(i)-cita1(j))*3.14159265/360) #lt#T_max , b(i,j)^2-4*c(i,j),-1) < 0);@for(link: @free(b));!调整角度上下限,单位为角度;@for(plane: @bnd( - max_cita, d_cita, max_cita));[obj] MIN = @SUM(plane: (d_cita)^2);END程序三十九:model:!铁路运输网的运费计算;SETS:! NOTES表示节点集合;NODES /S1,S2,S3,S4,S5,S6,S7,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16,B17/; ! 派生集合ROADS表示的是网络中的直接连接的道路(弧),由于并非所有节点间都有道路直接连接,所以将弧具体列出,这是稀疏集合;ROADS(NODES, NODES)/! 要铺设的管道;A1,A2 A2,A3 A3,A4 A4,A5 A5,A6 A6,A7 A7,A8 A8,A9 A9,A10 A10,A11A11,A12 A12,A13 A13,A14 A14,A15! 公路网;B1,A2 B2,A3 B5,A4 B4,A5 B6,A6 B7,A7 S1,A7 B8,A8 B9,A9,B10,A10,B11,A11 B13,A12 B15,A13 S6,A14 B16,A14 B17,A15 S7,A15! 铁路网;B1,B3 B2,B3 B3,B5 B4,B6 B6,B7 B7,S1 B5,B8 B8,S1 B8,S2 B8,B9B9,S3 B9,B10 B10,B12 B12,B11 B11,S5 B12,S4 B12,B14 B14,B13B14,B15 B15,B16 B16,S6 B16,B17 B17,S7! 距离W0( i, j) 是节点i到j的直接距离(已知);/: W0;! 属性W表示基本的权矩阵(直接距离),D1(i,j)表示节点i到j的最优行驶路线的路长,C1(i,j)表示节点i到j铁路运输的最小单位运价(万元);LINK(NODES, NODES): W, D1, C1;! 属性U表示迭代过程的权矩阵(临时标号);NNN(Nodes,nodes,nodes):U;ENDSETSDATA:! 针对铁路网计算时,将公路网的距离定为充分大(BIG=20000);BIG=20000;W0 = 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 2000020000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000450 80 1150 306 195 20 1100 202 1200 720690 520 170 88 462 690 160 70320 160 70 290 30;! 输出费用C1到文本文件中,以备后用;@TEXT(TrainCost.txt)=@writefor(nodes(i): @writefor(nodes(j):@format(c1(i,j),'5.0f')), @newline(1) );ENDDATACALC:! 无向网络,根据给定的直接距离具有对称性,得到初始距离矩阵;@FOR(LINK(i,j)|@IN(ROADS,i,j): W(i,j) = W0(i, j); W(j,i) = W0(i,j); );@FOR(LINK(i,j)|i#eq#j: W(i,j) = 0 );! 所有无直接连接的节点间的距离定为充分大;@FOR(LINK(i,j)|i#ne#j #and# #not#@IN(ROADS,i,j) #and##not#@IN(ROADS,j,i): W(i,j) = BIG;W(j,i) = BIG; );!以下三个循环语句就是最短路计算公式(Floyd-Warshall算法);! k=1的初值;@FOR(NNN(i,j,k)|k#eq#1: U(i,j,k) = W(i,j) );!迭代过程;@For(nodes(k)|k#lt#@size(nodes): @FOR(LINK(i,j): U(i,j,k+1) =@if(U(i,j,k) #le# U(i,k,k)+U(k,j,k),U(i,j,k), U(i,k,k)+U(k,j,k))));! 最后一次迭代得到D1;@FOR(NNN(i,j,k)|k#eq#@size(nodes): D1(i,j) =@if(U(i,j,k) #le# U(i,k,k)+U(k,j,k),U(i,j,k), U(i,k,k)+U(k,j,k)) );!以下就是按最短路D1查找相应运费C1的计算公式;@FOR(LINK|D1#eq#0: C1=0);@FOR(LINK|D1#gt#0 #and# D1#le#300: C1=20);@FOR(LINK|D1#gt#300 #and# D1#le#350: C1=23);@FOR(LINK|D1#gt#350 #and# D1#le#400: C1=26);@FOR(LINK|D1#gt#400 #and# D1#le#450: C1=29);@FOR(LINK|D1#gt#450 #and# D1#le#500: C1=32);@FOR(LINK|D1#gt#500 #and# D1#le#600: C1=37);@FOR(LINK|D1#gt#600 #and# D1#le#700: C1=44);@FOR(LINK|D1#gt#700 #and# D1#le#800: C1=50);@FOR(LINK|D1#gt#800 #and# D1#le#900: C1=55);@FOR(LINK|D1#gt#900 #and# D1#le#1000: C1=60);@FOR(LINK|D1#gt#1000: C1 = 60 + 5*@floor(D1/100-10)+@if(@mod(D1,100)#eq#0,0,5) );ENDCALCEnd程序四十:model:!公路运输网的运费计算;SETS:! NOTES表示节点集合;NODES /S1,S2,S3,S4,S5,S6,S7,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16,B17/; ! 派生集合ROADS表示的是网络中的直接连接的道路(弧),由于并非所有节点间都有道路直接连接,所以将弧具体列出,这是稀疏集合;ROADS(NODES, NODES)/! 要铺设的管道;A1,A2 A2,A3 A3,A4 A4,A5 A5,A6 A6,A7 A7,A8 A8,A9 A9,A10 A10,A11A11,A12 A12,A13 A13,A14 A14,A15! 公路网;B1,A2 B2,A3 B5,A4 B4,A5 B6,A6 B7,A7 S1,A7 B8,A8 B9,A9,B10,A10,B11,A11 B13,A12 B15,A13 S6,A14 B16,A14 B17,A15 S7,A15! 铁路网;B1,B3 B2,B3 B3,B5 B4,B6 B6,B7 B7,S1 B5,B8 B8,S1 B8,S2 B8,B9B9,S3 B9,B10 B10,B12 B12,B11 B11,S5 B12,S4 B12,B14 B14,B13。
Lingo软件应用举例

Lingo 软件应用举例1. 简单的优化问题---- Lingo 软件的体验1.1 线性规划及线性整数规划例1. 在LINGO 中求解如下问题(线性规划):0,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x %----------------------------------------------------------其LINGO 代码如下:min =2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;说明:(1) 在这里之所以没有对x1和x2进行非负的限制,是由于在默认情况下,Lingo 规定变量取非负实数(即非负要求,取值连续)(2) 若要求取整数,则函数@gin(x)限定x 取值为整数;(3) 若要求无约束,则函数@free(x)取消x 默认下界为0的限制,使x 可以取任意实数;(4) 若要求取非正数,则函数@bnd(L,x,U)可以限定L ≤x ≤U 。
%----------------------------------------------------------计算结果:Global optimal solution found at iteration: 2Objective value: 800.0000Variable Value Reduced CostX1 250.0000 0.000000X2 100.0000 0.000000Row Slack or Surplus Dual Price1 800.0000 -1.0000002 0.000000 -4.0000003 150.0000 0.0000004 0.000000 1.000000结果的解释:(1) “Global optimal solution found at iteration: 2”表示2次迭代后得到全局最优解。
Lingo的典型应用举例

x 用0-1变量 xij 表示分配情况,ij = 1 表示指派第i个人 x 完成第j项任务,ij = 0 表示不分配,则上述问题可 以表示为如下0-1线性规划:
min z = ∑∑ cij xij
i =1 j =1 n n
n ∑ xij = 1, j = 1, 2,L , n i =1 s.t. n ∑ x = 1, i = 1, 2,L , n, x = 0或1 ij j =1 ij
模型的推广
一维下料问题:需要m种材料(部件) A1 , A2 L Am ,数 量分别为 ,对一件长的原料可得出k种不同 bj nij 的切割方法, 表示第i种方法得到 部件的数 Aj 量.用 表示按第i种截法的原材料数量,则 xi 该问题的模型为:
min z = ∑ xi
i =1 k
k ∑ nij xi ≥ b j , j = 1, 2,L , m s.t. i =1 x ≥ 0, i = 1, 2,L , k i
其中第一个约束条件表示每项工作只能指派给一 个人做,第二个约束条件表示每个人只能做一项 工作.
例5:分配甲,乙,丙,丁,戊去完成ABCDE 五项任务,每人完成一项,每项任务只能 由一个人去完成,五个人分别完成各项任 务所需时间如下表,试作出任务分配使总 时间最少.
各人完成各项任务所需时间 任务 人员 甲 乙 丙 丁 戊 A 8 9 7 9 4 B 6 12 4 5 6 C 10 7 3 8 7 D 9 11 5 11 5 E 12 9 8 8 11
px 对于问题(2), j , py j 是未知数,与 cij 一样是决策 变量(内含未知变量的总数共16个).对问题(1) 的程序中取消了px,py的赋值.
计算结果为:目标函数最优值为:85.26604, 新建料场的位置为A(3.254883,5.652332), B(7.25,7.75),运输方案见下表:
LINGO模型实例及求解

钢管下料问题2
目标函数(总根数) Mix1 nx2x3
约束 条件 满足需求
模式合理:每根 余料不超过3米
r1x11r1x22r1x33501 6 4 r 1 15 r2 16 r3 18 r4 119
r2x 11r2x 22r2x 33101 6 4 r1 25 r2 26 r3 28 r4 219
j 1
6
cij e j , j 1,2
i 1
决策变量: ci j,(xj,yj)~16维
非线性规划模型
LINGO模型的构成:4个段
集合段(SETS ENDSETS)
数据段(DATA ENDDATA)
LP:移到数据段
初始段(INIT ENDINIT) 目标与 约束段
局部最优:89.8835(吨公里 )
1)现有 2 料场,位于 A (5, 1), B (2, 7), 记(xj,yj),j=1,2, 日储量 ej 各有 20 吨。
目标:制定每天的供应计划,即从 A, B 两料场分别向
各工地运送多少吨水泥,使总的吨公里数最小。
决策变量:ci j min (料场j到工地i的
运量)~12维 s.t.
26
钢管下料
切割模式
按照客户需要在一根原料钢管上安排切割的一种组合。
4米1根 6米1根
8米1根
余料1米
4米1根 6米1根
6米1根
余料3米
8米1根
8米1根
余料3米
合理切割模式的余料应小于客户需要钢管的最小尺寸
钢管下料问题1 合理切割模式
模式 1 2 3 4 5 6 7
4米钢管根数 4 3 2 1 1 0 0
X3 8.000000
1.000000
LINGO简单程序编写

例2.怎样表示:
100
程序: !集合段;
∑ ������������������ 150, ������ = 1,2, ,200
������ 1
sets:
a/1..100/:;
b/1..200/:; c(a,b):x;!派生集合;
endsets !目标与约束段; @for(b(j):@sum(a(i):x(i,j))>150.001);!集合元素的循环函数;
一维数组操作: 例1.怎样表示:
1
∑ ������ ≤ 90
1
程序: !集合段; sets: s/1..100/:x;!基本集合,集合名与属性变量; endsets !目标与约束段; @sum(s(i):x(i))<90!循环求和函数,要指明在哪个集合里做循环,把后面的xi相加;
例2.怎样赋值: b1=1,b2=0,b3=1,b4=2,b5=3,b6=5,b7=2,b8=6,b9=1,b10=2;
������ 1000
f = @if(X#LE#500,4*X,@IF(X#LE#1000,500+3*X,1500+2*X));
例 6.怎样表示:
������1 + 2������2 + 3������3 + ������4 ≥ 4
2������1 + 5������2 + ������3 + 2������4 ≥ 5
LINGO 逻辑运算符 #AND#(与) #OR# (或) #NOT#(非) #EQ# (等于) #NE# (不等于) #GT# (大于) #GE# (大于等于) #LT# (小于) #LE# (小于等于) 例如:2#gt#3#and#4#gt#2 结果:0(假)
Lingo案例分析【范本模板】

最小费用运输问题i.e:model:!6发点8收点运输问题;sets:warehouses/wh1.。
wh6/: capacity;vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume;endsets!目标函数;min=@sum(links: cost*volume);!需求约束;@for(vendors(J):@sum(warehouses(I): volume(I,J))=demand(J)); !产量约束;@for(warehouses(I):@sum(vendors(J): volume(I,J))<=capacity(I));!这里是数据;data:capacity=60 55 51 43 41 52;demand=35 37 22 32 41 32 43 38;cost=6 2 6 7 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddata1 LINGO中的集1。
1 The Sets Section of a ModelSets are defined in an optional section of a LINGO model, called the sets section. Before you use sets in a LINGO model, you have to define them in the sets section of the model. The sets section begins with the keyword SETS:(including the colon), and ends with the keyword ENDSETS。
A model may have no sets section, a single sets section, or multiple sets sections。
lingo解决线性规划问题的程序(经典)

Lingo12软件培训教案Lingo 主要用于求解线性规划,整数规划,非线性规划,V10以上版本可编程。
例1 一个简单的线性规划问题0 ,600 2100350 st.3 2max >=<=+=<<=++=y x y x x y x y x z !exam_1.lg4 源程序max = 2*x+3*y;[st_1] x+y<350;[st_2] x<100;2*x+y<600; !决策变量黙认为非负; <相当于<=; 大小写不区分当规划问题的规模很大时,需要定义数组(或称为矩阵),以及下标集(set) 下面定义下标集和对应数组的三种方法,效果相同::r1 = r2 = r3, a = b = c. sets :r1/1..3/:a;r2 : b;r3 : c;link2(r1,r2): x;link3(r1,r2,r3): y;endsetsdata :ALPHA = 0.7;a=11 12 13 ;r2 = 1..3;b = 11 12 13;c = 11 12 13;enddata例2 运输问题解: 设决策变量ij x = 第i 个发点到第j 个售点的运货量,i =1,2,…m; j =1,2,…n; 记为ij c =第i 个发点到第j 个售点的运输单价,i =1,2,…m; j =1,2,…n 记i s =第i 个发点的产量, i =1,2,…m; 记j d =第j 个售点的需求量, j =1,2,…n. 其中,m = 6; n = 8.设目标函数为总成本,约束条件为(1)产量约束;(2)需求约束。
于是形成如下规划问题:nj m i x n j d xm i s x x c ij j n i ij i mj ij m i nj ij ij ,...,2,1,,...,2,1,0 ,...,2,1,,...,2,1, st.z min 1111==>=<==<==∑∑∑∑====把上述程序翻译成LINGO 语言,编制程序如下:!exam_2.lg4 源程序model : !6发点8收点运输问题;sets :rows/1..6/: s; !发点的产量限制;cols/1..8/: d; !售点的需求限制;links(rows,cols): c, x; !运输单价,决策运输量;endsets!-------------------------------------;data:s = 60,55,51,43,41,52;d = 35 37 22 32 41 32 43 38;c = 6 2 6 7 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddata!------------------------------------;min = @sum(links: c*x); !目标函数=运输总成本;@for(rows(i):@sum(cols(j): x(i,j))<=s(i) ); ! 产量约束;@for(cols(j):@sum(rows(i): x(i,j))=d(j) ); !需求约束;end例3把上述程序进行改进,引进运行子模块和打印运算结果的语句:!exam_3.lg4 源程序model: !6发点8收点运输问题;sets:rows/1..6/: s; !发点的产量限制;cols/1..8/: d; !售点的需求限制;links(rows,cols): c, x; !运输单价,决策运输量; endsets!==================================;data:s = 60,55,51,43,41,52;d = 35 37 22 32 41 32 43 38;c = 6 2 6 7 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddata!==================================;submodel transfer:min = cost; ! 目标函数极小化;cost = @sum(links: c*x); !目标函数:运输总成本;@for(rows(i):@sum(cols(j): x(i,j)) < s(i) ); ! 产量约束;@for(cols(j):@sum(rows(i): x(i,j)) > d(j) ); !需求约束;endsubmodel!==================================;calc:@solve(transfer); !运行子模块(解线性规划);@divert('transfer_out.txt');!向.txt文件按自定格式输出数据;@write('最小运输成本=',cost,@newline(1),'最优运输方案x=');@for(rows(i):@write(@newline(1));@writefor(cols(j): ' ',@format(x(i,j),'3.0f') ) );@divert(); !关闭输出文件;endcalcend打开transfer_out.txt文件,内容为:最小运输成本=664最优运输方案x=0 19 0 0 41 0 0 01 0 0 32 0 0 0 00 11 0 0 0 0 40 00 0 0 0 0 5 0 3834 7 0 0 0 0 0 00 0 22 0 0 27 3 0例4data段的编写技巧(1):从txt文件中读取原始数据!exam_3.lg4 源程序中的data也可以写为:data:s = @file('transfer_data.txt');d = @file('transfer_data.txt');c = @file('transfer_data.txt');enddata其中,transfer_data.txt的内容为:!transfer.lg4程序的数据;!产量约束s= ;60,55,51,43,41,52 ~!需求约束d= ;35 37 22 32 41 32 43 38 ~!运输单价c= ;6 2 67 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3 ~!注:字符~是数据分割符,若无此符,视所有数据为一个数据块,只赋给一个变量;例5lingo程序的的3种输入和3种输出方法;!exam_5.lg4的源程序;sets:rows/1..3/: ;cols/1..4/: ;link(rows,cols): a, b, mat1, mat2;endsetsdata:b = 1,2,3,45,6,7,89,10,11,12; !程序内输入;a = @file('a.txt'); !外部txt文件输入;mat1 = @ole('d:\lingo12\data.xls',mat1); !EXcel文件输入;enddatacalc:@text('a_out.txt') = a; !列向量形式输出数据;@for(link: mat2 = 2*mat1);@ole('d:\lingo12\data.xls') = mat2 ;!把mat2输出到xls文件中的同名数据块;!向.txt文件按自定格式输出数据(参照前例);Endcalc例6程序段中的循环和选择结构举例!exam_6.lg4的源程序;sets:rows/1..5/:;cols/1..3/:;links(rows,cols):d;endsetsdata:d=0 2 34 3 21 3 24 7 22 1 6;enddatacalc:i=1;@while(i#le#5:a = d(i,1);b = d(i,2);c = d(i,3);@ifc(a#eq#0:@write('infeasible!',@newline(1));@elsedelta = b^2-4*a*c;sqrt = @sqrt(@if(delta#ge#0, delta,-delta));@ifc(delta#ge#0:@write('x1=',(-b+sqrt)/2/a,'x2=',(-b-sqrt)/2/a,@newline(1));@else@write('x1=',-b/2/a,'+',sqrt/2/a,'i','x2=',-b/2/a,'-',sqrt/2/a,'i',@newline(1));););i=i+1;);endcalc本程序中的循环结构也可以用@for(rows(i): 程序体);进行计算。
lingo处理实例(多目标问题)

2012年07月19日
常见的问题
1 分析题目以及选题 2 方法的选择
3 模型的体现
4 对问题求解和软件使用 5 论文写作和格式、排版 6 其他
1 分析题目以及选题
• 越熟悉的领域越好??X (学经济的就一定要选择*
题?)
• • • • •
觉得越简单越好??X(**题感觉太难。) 感兴趣很重要 挖掘内部的数学问题(A题中的数学) 抓住主要问题(不要跑题,减速带的设计、不是分析特定类型) 要有独到的见解和创新的思路(只要讨论量与量的 关系就回归、拟合) • 要能够根据问题合理安排时间(无法完成题目)
求解 器 (求 解程 序 )状 态框
Hale Waihona Puke 解的目标函数值目前为止的 迭代次数
• 运行状态窗口
使用的特殊求解程序 : B-and-B (分枝定界算法) Global (全局最优求解程序) Multistart(用多个初始点求解的程序)
目前为止找到的可行 解的最佳目标函数值 扩展 的求 解器 (求解 程序) 状态 框 目标函数值的界 特殊求解程序当前运行步数: 分枝数(对B-and-B程序); 子问题数(对Global程序); 初始点数(对Multistart程序)
•.MPS:示MPS(数学规划系统)格式的模型文件。
• 运行状态窗口
Variables(变量数量): 变量总数(Total)、 非线性变量数(Nonlinear)、 整数变量数(Integer)。 Constraints(约束数量): 约束总数(Total)、 非线性约束个数(Nonlinear)。 Nonzeros(非零系数数量): 总数(Total)、 非线性项系数个数(Nonlinear)。 Generator Memory Used (K) (内存使用 量) • Elapsed Runtime (hh:mm:ss) (求解花费的时间)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例1.2使用LINGO软件计算6个发点8个收点的最小费用运输问题。
产销model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/:capacity;vendors/v1..v8/:demand;links(warehouses,vendors):cost,volume;endsets!目标函数域;min=@sum(links:cost*volume);!需求约束域;@for(vendors(j):@sum(warehouses(i):volume(i,j))=demand(j));!产量约束;@for(warehouses(i):@sum(vendors(j):volume(i,j))<=capacity(i));!数据域;data:capacity=60 55 51 43 41 52;demand=;cost=;enddataendGlobal optimal solution found.Objective value: 664.0000Infeasibilities: 0.000000Total solver iterations: 15Model Class: LPTotal variables: 48Nonlinear variables: 0Integer variables: 0Total constraints: 15Nonlinear constraints: 0Total nonzeros: 144Nonlinear nonzeros: 0Variable Value Reduced Cost CAPACITY( WH1) 60.00000 0.000000 CAPACITY( WH2) 55.00000 0.000000 CAPACITY( WH3) 51.00000 0.000000 CAPACITY( WH4) 43.00000 0.000000 CAPACITY( WH5) 41.00000 0.000000 CAPACITY( WH6) 52.00000 0.000000 DEMAND( V1) 35.00000 0.000000 DEMAND( V2) 37.00000 0.000000 DEMAND( V3) 22.00000 0.000000 DEMAND( V4) 32.00000 0.000000 DEMAND( V5) 41.00000 0.000000 DEMAND( V6) 32.00000 0.000000 DEMAND( V7) 43.00000 0.000000 DEMAND( V8) 38.00000 0.000000COST( WH1, V2) 2.000000 0.000000 COST( WH1, V3) 6.000000 0.000000 COST( WH1, V4) 7.000000 0.000000 COST( WH1, V5) 4.000000 0.000000 COST( WH1, V6) 2.000000 0.000000 COST( WH1, V7) 5.000000 0.000000 COST( WH1, V8) 9.000000 0.000000 COST( WH2, V1) 4.000000 0.000000 COST( WH2, V2) 9.000000 0.000000 COST( WH2, V3) 5.000000 0.000000 COST( WH2, V4) 3.000000 0.000000 COST( WH2, V5) 8.000000 0.000000 COST( WH2, V6) 5.000000 0.000000 COST( WH2, V7) 8.000000 0.000000 COST( WH2, V8) 2.000000 0.000000 COST( WH3, V1) 5.000000 0.000000 COST( WH3, V2) 2.000000 0.000000 COST( WH3, V3) 1.000000 0.000000 COST( WH3, V4) 9.000000 0.000000 COST( WH3, V5) 7.000000 0.000000 COST( WH3, V6) 4.000000 0.000000 COST( WH3, V7) 3.000000 0.000000 COST( WH3, V8) 3.000000 0.000000 COST( WH4, V1) 7.000000 0.000000 COST( WH4, V2) 6.000000 0.000000 COST( WH4, V3) 7.000000 0.000000 COST( WH4, V4) 3.000000 0.000000 COST( WH4, V5) 9.000000 0.000000 COST( WH4, V6) 2.000000 0.000000 COST( WH4, V7) 7.000000 0.000000 COST( WH4, V8) 1.000000 0.000000 COST( WH5, V1) 2.000000 0.000000 COST( WH5, V2) 3.000000 0.000000 COST( WH5, V3) 9.000000 0.000000 COST( WH5, V4) 5.000000 0.000000 COST( WH5, V5) 7.000000 0.000000 COST( WH5, V6) 2.000000 0.000000 COST( WH5, V7) 6.000000 0.000000 COST( WH5, V8) 5.000000 0.000000 COST( WH6, V1) 5.000000 0.000000 COST( WH6, V2) 5.000000 0.000000 COST( WH6, V3) 2.000000 0.000000 COST( WH6, V4) 2.000000 0.000000COST( WH6, V6) 1.000000 0.000000 COST( WH6, V7) 4.000000 0.000000 COST( WH6, V8) 3.000000 0.000000 VOLUME( WH1, V1) 0.000000 5.000000 VOLUME( WH1, V2) 19.00000 0.000000 VOLUME( WH1, V3) 0.000000 5.000000 VOLUME( WH1, V4) 0.000000 7.000000 VOLUME( WH1, V5) 41.00000 0.000000 VOLUME( WH1, V6) 0.000000 2.000000 VOLUME( WH1, V7) 0.000000 2.000000 VOLUME( WH1, V8) 0.000000 10.00000 VOLUME( WH2, V1) 1.000000 0.000000 VOLUME( WH2, V2) 0.000000 4.000000 VOLUME( WH2, V3) 0.000000 1.000000 VOLUME( WH2, V4) 32.00000 0.000000 VOLUME( WH2, V5) 0.000000 1.000000 VOLUME( WH2, V6) 0.000000 2.000000 VOLUME( WH2, V7) 0.000000 2.000000 VOLUME( WH2, V8) 0.000000 0.000000 VOLUME( WH3, V1) 0.000000 4.000000 VOLUME( WH3, V2) 11.00000 0.000000 VOLUME( WH3, V3) 0.000000 0.000000 VOLUME( WH3, V4) 0.000000 9.000000 VOLUME( WH3, V5) 0.000000 3.000000 VOLUME( WH3, V6) 0.000000 4.000000 VOLUME( WH3, V7) 40.00000 0.000000 VOLUME( WH3, V8) 0.000000 4.000000 VOLUME( WH4, V1) 0.000000 4.000000 VOLUME( WH4, V2) 0.000000 2.000000 VOLUME( WH4, V3) 0.000000 4.000000 VOLUME( WH4, V4) 0.000000 1.000000 VOLUME( WH4, V5) 0.000000 3.000000 VOLUME( WH4, V6) 5.000000 0.000000 VOLUME( WH4, V7) 0.000000 2.000000 VOLUME( WH4, V8) 38.00000 0.000000 VOLUME( WH5, V1) 34.00000 0.000000 VOLUME( WH5, V2) 7.000000 0.000000 VOLUME( WH5, V3) 0.000000 7.000000 VOLUME( WH5, V4) 0.000000 4.000000 VOLUME( WH5, V5) 0.000000 2.000000 VOLUME( WH5, V6) 0.000000 1.000000 VOLUME( WH5, V7) 0.000000 2.000000 VOLUME( WH5, V8) 0.000000 5.000000VOLUME( WH6, V2) 0.000000 2.000000 VOLUME( WH6, V3) 22.00000 0.000000 VOLUME( WH6, V4) 0.000000 1.000000 VOLUME( WH6, V5) 0.000000 3.000000 VOLUME( WH6, V6) 27.00000 0.000000 VOLUME( WH6, V7) 3.000000 0.000000 VOLUME( WH6, V8) 0.000000 3.000000Row Slack or Surplus Dual Price1 664.0000 -1.0000002 0.000000 -4.0000003 0.000000 -5.0000004 0.000000 -4.0000005 0.000000 -3.0000006 0.000000 -7.0000007 0.000000 -3.0000008 0.000000 -6.0000009 0.000000 -2.00000010 0.000000 3.00000011 22.00000 0.00000012 0.000000 3.00000013 0.000000 1.00000014 0.000000 2.00000015 0.000000 2.000000。