文档库 最新最全的文档下载
当前位置:文档库 › Lingo软件在求解数学优化问题的使用技巧

Lingo软件在求解数学优化问题的使用技巧

Lingo软件在求解数学优化问题的使用技巧
Lingo软件在求解数学优化问题的使用技巧

Lingo软件在求解数学优化问题的使用技巧

LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到广泛应用。LINGO 主要用于求解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于求解一些线性和非线性方程组及代数方程求根等。

LINGO的最新版本为LINGO7.0,但解密版通常为4.0和5.0版本,本书就以LINGO5.0为参照而编写。

1.LINGO编写格式

LINGO模型以MODEL开始,以END结束。中间为语句,分为四大部分(SECTION):(1)集合部分(SETS):这部分以“SETS:”开始,以“ENDSETS”结束。这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计算,就象C语言在在程序的第一部分定义变量和数组一样。在LINGO中称为集合(SET)及其元素(MEMBER或ELEMENT,类似于数组的下标)和属性(A TTRIBUTE,类似于数组)。

LINGO中的集合有两类:一类是原始集合(PRIMITIVE SETS),其定义的格式为:SETNAME/member list(or 1..n)/:attribute,attribute,etc。

另一类是是导出集合(DERIVED SETS),即引用其它集合定义的集合,其定义的格式为:

SETNAME(set1,set2,etc。):attribute,attribute,etc。

如果要在程序中使用数组,就必须在该部分进行定义,否则可不需要该部分。(2)目标与约束:这部分定义了目标函数、约束条件等。一般要用到LINGO的内部函数,可在后面的具体应用中体会其功能与用法。求解优化问题时,该部分是必须的。(3)数据部分(DA TA):这部分以“DA TA:”开始,以“END DA TA”结束。其作用在于对集合的属性(数组)输入必要的数值。格式为:attribut=value_list。该部分主要是方便数据的输入。

(4)初始化部分(INIT):这部分以“INIT:”开始,以“END INIT”结束。作用在于对集合的属性(数组)定义初值。格式为:attribute=value_list。由于非线性规划求解时,通常得到的是局部最优解,而局部最优解受输入的初值影响。通常可改变初值来得到不同的解,从而发现更好的解。

编写LINGO程序要注意的几点:

1.所有的语句除SETS、ENDSETS、DA TA、ENDDA TA、INIT、ENDINIT和MODEL,END 之外必须以一个分号“;”结尾。

2.LINGO求解非线性规划时已约定各变量非负。

LINGO内部函数使用详解。

LINGO建立优化模型时可以引用大量的内部函数,这些函数以“@”符号打头。

(1)常用数学函数

@ABS(X) 返回变量X的绝对数值。

@COS( X)

返回X的余弦值,X的单位为弧度

@EXP( X)

返回x e 的值,其中e 为自然对数的底,即 71828.2

@FLOOR( X)

向0靠近返回X 的整数部分。如@FLOOR(3.7),则返回3;@FLOOR(-3.7),则返回-3。 @LGM( X)

返回Γ函数的自然对数值。

@LOG( X)

返回变量X 的自然对数值。 @SIGN( X)

返回变量X 的符号值,当X<0时为-1;当X>0时为1。 @SIN( X)

返回X 的正弦值,X 的单位为弧度 @SMAX( X1, X2,..., XN)

返回一列值X1, X2,..., XN 的最大值。 @SMIN( X1, X2,..., XN)

返回一列值X1, X2,..., XN 的最小值。 @TAN( X)

返回X 的正切值,X 的单位为弧度

(2)集合函数

集合函数的用法如下:

set_operator (set_name|condition:expression) 其中set_oprator 部分是集合函数名(见下),set_name 是数据集合名,expression 部分是表达式,|condition 部分是条件,用逻辑表达式描述(无条件时可省略)。逻辑表达式中可以三种逻辑算符(#AND#(与),#OR#(或),#NOT#(非))和六种关系酸符(#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于))。

常见的集合函数如下: @FOR (set_name :constraint_expressions)对集合(set_name)的每个元素独立地生成约束,约束由约束表达式(constraint_expressions )描述。

@MAX (set_name :expression )返回集合上的表达式(expression )的最大值。

@MIN (set_name :expression )返回集合上的表达式(expression )的最小值。 @SUM (set_name :expression )返回集合上的表达式(expression )的和。

@SIZE (set_name )返回数据集set_name 中包含元素的个数。

@IN (set_name ,set_element )如果数据集set_name 中包含元素set_element 则返回1,否则返回0。

(3)变量界定函数

变量函数对变量的取值范围附加限制,共有四种。 @BND (L,X,U )限制U X L ≤≤ @BIN (X )限制X 为0或1。

@FREE (X )取消对X 的符号限制(即可取任意实数值)。 @GIN (X )限制X 为整数值。 (4)财务函数

),(@N I FPA 返回如下情形下的净现值:单位时段利率为I ,连续N 个时段支付,每个

时段支付费用,即:

),(@N I FPA =I I

I N

N

n n

/))11(

1()

1(11

+-=+∑

=

),(@N I FPL 返回如下情形下的净现值:单位时段利率为I ,第N 个时段支付单位费用,

即:

),(@N I FPL =N

I

)11(

+

(5)概率函数

@PSN(X)标准正态分布的分布函数。

@PSL(X)单位正态线性损失函数(即返回),0(X Z MAX -的期望值,其中Z 为标准正态随机变量)

@PPS(A ,X)均值为A 的Possion 分布的分布函数(当X 不是整数时,采用线性插值进行计算)。

@PPL(X)Possion 分布的线性损失函数(即返回),0(X Z MAX -的期望值,其中Z 为Possion 分布随机变量)

@PBN(P ,N ,X)二项分布的分布函数当N 或X 不是整数时,采用线性插值进行计算)。 @PHG(POP ,G ,N ,X)超几何分布的分布函数(当POP ,G ,N 或X 不是整数时,采用线性插值进行计算)。

@PFD(N,D,X)自由度为N 和D 的F 分布的分布函数。 @PCX(N,X) 自由度为N 的2χ分布的分布函数。 @PTD(N,X) 自由度为N 的t 分布的分布函数。

@RAND(X)返回0与1之间的伪随机数(X 为种子数,典型用法为U(I)=@RAND(U(I+1)))。

1.某昼夜服务的公交路线每天各时间区段内需司机和乘务人员如下:

设司机和乘务人员分别在各时间区段一开始上班,并连续工作八小时,问该公交线路至少配

备多少名司机和乘务人员?从第一班开始排,试建立线性模型。 分析与求解:

注意在每一时间段里上班的司机和乘务人员中,既包括在该时间段内开始时报到的人员,还包括在上一时间段工作的人员。因为每一时间段只有四个小时,而每个司乘人员却要连续工作八个小时。因此每班的人员应理解为该班次相应时间段开始时报到的人员。

设i x 为第i 班应报到的人员(6,,2,1 =i ),则应配备人员总数为:

∑==

6

1

i i

x

Z

按所需人数最少的要求,可得到线性模型如下:

==

6

1

min i i x Z

??????????

?

?

?≥≥≥+≥+≥+≥+≥+≥+0

,,,60302050607060.

.621165544

3322181x x x x x x x x x x x x x x x x t s LINGO 程序如下:

MODEL:

min=x1+x2+x3+x4+x5+x6; x1+x6>=60; x1+x2>=70; x2+x3>=60; x3+x4>=50; x4+x5>=20; x5+x6>=30; x1>=60; END

得到的解为:

x1=60,x2=10,x3=50,x4=0,x5=30,x6=0;

配备的司机和乘务人员最少为150人。

2 某地区有三个农场共用一条灌渠,每个农场的可灌溉地及分配到的最大用水量如下表:

各农场均可种植甜菜、棉花和高粱三种作物,各种作物的用水量、净收益及国家规定

的该地区各种作物种植总面积最高限额如下表:

三个农场达成协议,他们的播种面积与其可灌溉面积相等,而各种农场种何种作物并无限制。问如何制定各农场种植计划才能在上述限制条件下,使本地区的三个农场的总净收益最大。

分析与求解:

设农场1种植的甜菜、棉花和高粱分别为131211,,x x x 亩,农场2种植的甜菜、棉花和高粱分别为232221,,x x x 亩,农场3种植的甜菜、棉花和高粱分别为333231,,x x x 亩。

设农场可耕地为300,600,400321===a a a ,最大用水量为,6001=b ,8002=b

3753=b ,甜菜、棉花和高粱的种植限额为325,500,600321===c c c ,耗水量为

31=d ,22=d ,13=d ,净收益为100,300,400321===e e e ,根据题目条件,可建立如

下线性模型:

∑∑===

3

1

31

)(max j i ij

j

x

e Z

?????

????=≤=≤=≤∑∑∑===3

1

313

1

3

,2,13,2,13,2,1.

.j i ij j j i ij i j ij i b x d i a x j c x t s

LINGO 编程如下: MODEL: SETS:

place/1..3/:a,b; kind/1..3/:c,d,e; plan(place,kind):x; ENDSETS DATA:

a=400,600,300; b=600,800,375; c=600,500,325; d=3,2,1;

e=400,300,100; ENDDATA

max=@sum(kind(j):e(j)*@sum(place(i):x(i,j))); @for(kind(j):@sum(place(i):x(i,j))<=c(j)); @for(place(i):@sum(kind(j):x(i,j))<=a(i)); @for(place(i):@sum(kind(j):d(j)*x(i,j))<=b(i)); END

得到结果如下:

X(1,1)=0,X(1,2)=300,X(1,3)=0 X(2,1)=258.3333,X(2,2)=12.5,X(2,3)=0 X(3,1)=0,X(3,2)=187.5,X(3,3)=0 最大总净收益为253333.3元。

对本题来说,由于数据少,可以不采用数组形式,可直接采用变量,则建立模型如下:

设农场1种植的甜菜、棉花和高粱分别为111,,z y x 亩,农场2种植的甜菜、棉花和高粱

分别为222,,z y x 亩,农场3种植的甜菜、棉花和高粱分别为333,,z y x 亩。

根据题目条件,可建立如下线性模型:

)(100)(300)(400max 321321321z z z y y y x x x Z ++++++++=

?

?

?

???

??

?

?

???

?

?

≥≤++≤++≤++≤++≤++≤++≤++≤++≤++0

,,,,,,,,375238002360023300600400325500

600.

.321321321333222111333222111321321321z z z y y y x x x z y x z y x z y x z y x z y x z y x z z z y y y x x x t s

LINGO 程序如下:

MODEL:

max=400*(x1+x2+x3)+300*(y1+y2+y3)+100*(z1+z2+z3); x1+x2+x3<=600; y1+y2+y3<=500; z1+z2+z3<=325; x1+y1+z1<=400; x2+y2+z2<=600; x3+y3+z3<=300; 3*x1+2*y1+z1<=600;

3*x2+2*y2+z2<=800; 3*x3+2*y3+z3<=375; END

得到的解如下:

X1=200,Y1=0,Z1=0;

X2=58.33333, Y2=312.5,Z2=0; X3=0,Y3=187.5,Z3=0; 最大总净收益为253333.3元。

3. 公司在各地有4项业务,选定了4位业务员去处理。由于业务能力、经验和其它情况不同,4业务员去处理4项业务的费用(单位:元)各不相同,见下表:

应当怎样分派任务,才能使总的费用最小?

问题分析与求解:

这是一个最优指派问题。引入如下变量: ??

?=项业务

个人做第若不分派第项业务个人做第若分派第j i j i x ij 0

1

设矩阵a(4,4)为指派矩阵,其中a(i,j)为第i 个业务员做第j 项业务的业务费。 则可以建立如下模型:

∑∑===

4

1

4

1

min i j ij ij

x a

Z

????

?

????======∑∑==4

,3,2,1,104,3,2,114,3,2,11.

.41

4

1j i x i x j x t s ij j ij i ij 或 LINGO 程序如下: MODEL: SETS:

person/1..4/;

task/1..4/;

assign(person,task):a,x; ENDSETS DATA:

a=1100,800,1000,700, 600,500,300,800, 400,800,1000,900, 1100,1000,500,700; ENDDATA

min=@sum(assign:a*x);

@for(person(i):@sum(task(j):x(i,j))=1); @for(task(j):@sum(person(i):x(i,j))=1); @for(assign(i,j):@bin(x(i,j))); END

得到的结果如下:

x(1,1)=0,x(1,2)=0,x(1,3)=0,x(1,4)=1; x(2,1)=0,x(2,2)=1,x(2,3)=0,x(2,4)=0; x(3,1)=1,x(3,2)=0,x(3,3)=0,x(3,4)=0; x(4,1)=0,x(4,2)=0,x(4,3)=1,x(4,4)=0;

最小费用为2100元。

即第1个业余员做第4项业务,第2个业余员做第2项业务,即第3个业余员做第1项业务,第4业余员做第3项业务。总费用达到最小,为2100元。

4 篮球对选队员问题

篮球队要选择5名队员上场组成出场阵容参加比赛。8名篮球队员的身高及擅长位置如下表:

出场阵容满足如下条件: (1)只能有一名中锋上场;

(2)至少有一名后卫上场;

(3)如1号和4号均上场,则6号不出场;

(4)2号和8号至少有1个不出场;

问应当选择哪5名队员上场,才能使出场队员平均身高最高。

分析与求解:

这是一个0-1整数规划问题。 设0-1变量i x 如下:

??

?=名队员被选上

第名队员未选上第i i x i 1

设各队员的身高分别为常数i a )8,,2,1( =i 来表示,则目标函数很容易给出:

∑==

8

1

5

1

max i i i

x a Z 。

问题较为复杂的是如何根据题目给出的条件给出线性约束条件,下面对每一个条件给出约

束条件:

所选队员为5人,则∑==8

1

5i i x 。

只能有一名中锋上场,则121=+x x ,这样保证两名中锋恰好有一名上场。 至少有一名后卫,则1876≥++x x x 。

如1号和4号均上场,则6号不出场。则可用如下一个约束来表达:2641≤++x x x 。当

1,121==x x 时,则06=x ,满足条件;当0,121==x x 或1,021==x x ,6x 可为0或1,也满

足条件;当0,021==x x ,6x 可为0或1,满足条件。因此用该约束条件完全可代表该条件。

2号和8号至少有1个不出场,即2号和8号至多出场1个。用约束条件来表达就是:

182≤+x x 。

因此对该问题建立的数学模型如下:

∑==

8

1

5

1max i i i

x a

Z

???

???

??

?

??

=≤+≤++≥++=+=∑

=1

0,,,12

115.

.821826

41876218

1或x x x x x x x x x x x x x x t s i i 用LINGO 编程如下: MODEL: SETS:

team/1..8/:a,x; ENDSETS DATA:

a=1.92,1.90,1.88,1.86,1.85,1.83,1.80,1.78;!给出身高数据; ENDDATA

max=@sum(team(i):a(i)*x(i))/5.0; @SUM(team(i):x(i))=5; !所选队员为5人;

x(1)+x(2)=1; !只能有一名中锋上场; x(6)+x(7)+x(8)>=1; !至少有一名后卫上场;

x(1)+x(4)+x(6)<=2; !如果1号和4号上场,则6号不上场;

x(2)+x(8)<=1; !2号和8号至少有一个不出场.即出场人数至多为1个; @FOR(team(i):@bin(x(i))); !所有变量为0-1变量; END

所得到的解为:

x(1)=0,x(2)=1,x(3)=1,x(4)=1,x(5)=1,x(6)=1,x(7)=0,x(8)=0 即第2,3,4,5,6名队员被选上。 最大平均身高为Z=1.864米

5.有五项设计任务可供选择。各项设计任务的预期完成时间分别为3,8,5,4,10(周)设计报酬分别为7,17,11,9,21(万元)。设计任务只能一项一项地进行,总的期限为20周。选择任务时必须满足下面要求:

(1) 至少完成3项设计任务。

(2) 若选择任务1,必须同时选择任务2。 (3) 任务3和任务4不能同时选择。

应当选择哪些任务,才能使总的设计报酬最大? 分析与求解:

这是一个0-1整数规划问题。 设0-1变量i x 如下:

??

?=项设计任务被选上

第项设计任务未选上第i i x i 1

设各项设计任务的完成时间为i t (5,,2,1 =i )表示,设计报酬为i m (5,,2,1 =i )表示。则

容易得到目标函数:∑==

5

1

max i i i

x m

Z

根据题目要求分别列出约束条件如下:

总期限为避免20周,则约束条件为 ∑=≤5

1

20i i i x t

至少完成3项设计任务,则∑=≥5

1

3i i x

若选择任务1,必须同时选择任务2,则12x x ≥。

任务3和任务4不能同时选择,则143≤+x x ,该约束表达式表明任务3和任务4至多只能选择1个。

因此对该问题建立的数学模型如下:

∑==

5

1

max i i i

x m

Z

??

?

???

?

?

?

??

=≤+≥≥≤∑

==10,,,1320.

.4

32143125

1

5

1或x x x x x x x x x x t t s i i i i i LINGO 程序如下:

MODEL: SETS:

mat/1..5/:m,t,x; ENDSETS DATA:

m=7,17,11,9,21; !定义报酬数组; t=3,8,5,4,10; !定义完成时间; ENDDATA

max=@SUM(mat(i):m(i)*x(i)); !定义目标函数; @SUM(mat(i):t(i)*x(i))<=20; !期限约束 ; @SUM(mat(i):x(i))>=3; !至少完成3项任务;

x(2)>=x(1); !若选择任务1,必须同时选择任务2。; x(3)+x(4)<=1; !任务3和任务4不能同时选择。; @FOR(mat(i):@BIN(x(i))); !使各变量为0-1变量; END

得到的解为x(1)=1,x(2)=1,x(3)=1,x(4)=0,x(5)=0。最大报酬为35万元。 即在满足各种约束条件下,选择设计任务1,2,3,可使总报酬达到最大为35万元。

6 固定费用

有四种资源被用于生产三种产品,资源量、产品单件可变费用、单件售价、资源单耗量及组织三种商品生产的固定费用见下表。现要求制定一个生产计划,使总收益最大。

分析与求解:

总收益等于销售收入减去生产产品的固定费用与可变费用之和。问题的困难之处在于事先不知道某种产品是否生产,因而不能确定是否有相应的固定费用。可引入用0-1变量来解决是否需要固定费用问题。

设j x 是第j 种产品的产量,3,2,1=j ;再设

????

?=>=)

0(0

)0(1j j j x j x j y 种产品若不生产第种产品若生产第 3,2,1=j

第I 种产品销售一件可收入7-4=3元,第II 种产品销售一件可收入10-6=4元,第III 种产品销售一件可收入20-12=8元。

则问题的整数规划模型为:

321321200150100843m ax y y y x x x Z ---++=

??

??

?

??

?

????

?

?

?===≥≤≤≤≤++≤++≤++≤++3,2,1,103,2,1,0700

75310032300432500842.

.3

332221113

21321321321j y j x y M x y M x y M x x x x x x x x x x x x x t s j j 或且为整数

其中j M 为j x 的某个上界。如根据第2个约束条件,可取100,15021==M M ,

753=M 。也可统一取其最大值150=M 。

如果生产第j 种产品,则起产量0>j x 。由约束条件j j j y M x ≤知1=j y ,此时相应

的生产第j 种产品的固定费用在目标函数被考虑。如果不生产第j 种产品,则起产量0=j x 。由约束条件j j j y M x ≤知j y 可为0也可为1。但显然只有0=j y 有利于目标函数最大,从而相应的生产第j 种产品的固定费用在目标函数将不被考虑。因此引入j y 是合理的。

下面是LINGO 程序。

MODEL: DATA: M=150; ENDDATA

max=3*x1+4*x2+8*x3-100*y1-150*y2-200*y3;!目标函数; 2*x1+4*x2+8*x3<=500; 2*x1+3*x2+4*x3<=300; x1+2*x2+3*x3<=100; 3*x1+5*x2+7*x3<=700; x1<=M*y1; x2<=M*y2; x3<=M*y3;

@GIN(x1);@GIN(x2);@GIN(x3); !指定产品件数为整数; @BIN(y1);@BIN(y2);@BIN(y3); !指定0-1变量; end

得到的解为x1=100,x2=0,x3=0,y1=1,y2=0,y3=0。最大值为Z=200元。

7 某公司生产A ,B 和C3种产品,售价分别是12元、7元和6元。生产每件A 产品需要1小时

技术服务、10小时直接劳动、3千克材料;生产每件B 产品需要2小时技术服务、4小时直

接劳动、2千克材料;生产每件C 产品需要1小时技术服务、5小时直接劳动、1千克材料。现在最多能提供100小时技术服务、700小时直接劳动、400千克材料。生产成本是非线性函数,如下表。要求建立一个总利润最大的数学模型。

分析与求解:

设生产产品A 1x 件,生产产品B 2x 件,生产产品C 3x 件。问题的难点是产品的成本是一个分段函数,难以用线性函数表达,因此可采用动态库编写一个专门的函数来计算成本。

设产品A 每件的成本为a 元,产品B 每件的成本为b 元,产品C 每件的成本为c 元,a 、b 、c 随1x 、2x 、3x 而改变。

目标函数为:)(6712m ax 321321cx bx ax x x x Z ++-++=

??

???

?

?≥≤++≤++≤++且为整数0,,40023700

54101002.

.3

21321321321x x x x x x x x x x x x t s 其中???

??

??≤≤≤≤≤≤=以上1507150101810041940010

21

1x x x a ,?????≤≤≤≤=以上

1003

100514

50

0622x x b ,??

?≤≤=以上

1004

100

05

3x c

由于目标函数是非线性的,且难以用一个式子表达,因此采用自己编写用户函数的方式来实现。这里先介绍@USER 函数

该函数允许用户自己编写函数,该函数应当用C 或FORTRAN 语言编写,返回值为用户计算的结果。从编程角度来看,@USER 函数包含两个参数:第一个用于指定参数的个数,第二个用于指定参数向量(类似于C 语言中的main(argc,argv)的编写格式)。在LINGO 中调用@USER 时则直接指定对应的参数(类似C 语言中的main(argc,argv)的执行格式)。该函数采用动态库编写。这里的例子采用VC 编写动态库。注意动态库中该函数名固定为MYUSER ,在LINGO 中调用时则固定外部函数名为USER 。

下面是VC 中该动态库的编写过程:

1.启动VC6.0,选择File->New 。启动New 属性单,选择Projects 页面。再选择WIN32 Dynamic-Link Library 。在右边Project name 标签下的编辑框中任意输入一个工程名。如CALC 。点击OK 命令按钮后就建立了一个新的空的工程。

2.选择Project->Add to Project->New 。在New 属性单中选择File 页面。在下面空白框中选择C++ Source File 。在右边File 标签下的编辑框中输入一个文件名。如CB 。 3.编辑C++程序CB.CPP 如下: #include #include #include #include #include #define N 3

#define DllExport extern "C" __declspec(dllexport)

//该函数计算成本

DllExport void MYUSER(int* NumArgs,double *x,double *dResult) {

double sum;

if(*NumArgs

{ MessageBox(NULL,"输入变量不足","输入错误",MB_OK);

*dResult=-1;

exit(0);

}

sum=0;

//产品A的成本计算

if(x[0]>=0&&x[0]<=40) sum+=10*x[0];

else if(x[0]>=41&&x[1]<=100) sum+=9*x[0];

else if(x[0]>=101&&x[1]<=150) sum+=8*x[0];

else sum+=7*x[0];

//产品B的成本计算

if(x[1]>=0&&x[1]<=50) sum+=6*x[1];

else if(x[1]>=51&&x[1]<=100) sum+=4*x[1];

else sum+=3*x[1];

//产品C的成本计算

if(x[2]>=0&&x[2]<=100) sum+=5*x[2];

else sum+=4*x[2];

*dResult=sum; //返回成本总值

}

注意在程序中MYUSER函数的第一个整型变量NumArgs代表输入的变量个数。根据LINGO调用时输入的变量个数,可以在C++程序内部得到输入变量的总数。第二个输入为向量x,就是外部输入的变量。第三个变量dResult用于返回最后的计算结果。用LINGO调用时只需要输入各变量就行了,自然会返回C++程序计算的结果dResult。

变好程序后,按F7运行后生成动态库CALC.DLL。将其拷贝到LINGO目录下,并将文件名改名为MYUSER.DLL。启动LINGO,就可以通过外部函数@USER调用动态库中自己编写的函数。

LINGO程序:

!采用动态库编写自己的函数;

MODEL:

max=12*x1+7*x2+6*x3-@USER(x1,x2,x3);!目标函数;

x1+2*x2+x3<=100; !技术服务的约束;

10*x1+4*x2+5*x3<=700; !直接劳动的约束;

3*x1+2*x2+x3<=400; !材料的约束;

@GIN(x1);

@GIN(x2);

@GIN(x3);

end

迭代6步得到局部最优解为x1=70,x2=0,x3=0。总利润最大为210元。容易验证,该局部最优解也是全局最优解。

8.某企业和用户签定了设备交货合同,已知该企业各季度的生产能力、每台设备的生产

成本和每季度末的交货量见下表,若生产出的设备当季度不交货,每台设备每季度需要支付保管费0.1万元,试问在遵守合同的条件下,企业应如何安排生产计划,才能使年消耗费用最低?

分析与求解: 方法1:

设第i 季度生产i x 台,库存i y 台,4,3,2,1=i 。第i 季度生产能力用i p 表示,交货量用i

d 表示,每台设备生产成本用i c 表示。则建立目标函数为:

∑=+=

4

1

)1.0(min i i i i

y x c

Z

?????

?

?≥≥-==-+==≤-0

,04

,3,24,3,2,1..1111i i

i i i i i i y x d x y i d x y y i p x t s

LINGO 程序如下:

MODEL: SETS:

QUART/1..4/:x,y,p,d,c; ENDSETS

DATA:!指定数据; p=25,35,30,20; d=15,20,25,20;

c=12.0,11.0,11.5,12.5; ENDDATA

min=@sum(QUART(i):c(i)*x(i)+0.1*y(i));!目标函数; @FOR(QUART(i):x(i)<=p(i)); !生产能力限制; @FOR(QUART(i)|i#GT#1:y(i)=y(i-1)+x(i)-d(i)); y(1)=x(1)-d(1); end

得到的结果如下:

x1=15,x2=35,x3=30,x4=0;y1=0,y2=15,y3=20,y4=0。 年消耗最小费用为913.5万元。 方法1:

设ij x 第i 季度生产第j 季度交货的台数,第i 季度生产能力用i p 表示,交货量用i d 表示,

每台设备生产成本用i c 表示。由于生产能力的限制,需要满足下面条件:

∑=≤4

i

j i ij

p x

4,3,2,1=i

根据交货量的规定,应满足如下条件:

j j

i ij

d x

=∑=1

4,3,2,1=j

第i 季度生产第j 季度交货的每台设备所消耗的费用ij c ,应等于生产成本加上保管维护费用之和,其值如下表:

则该模型表示如下:

∑∑===

4

1

4

min i i

j xj ij

x c

Z

??

???

?

?????≥===≤∑

==04,3,2,14,3,2,1.

.14

ij j j i ij i

j i ij x j d x i p x t s

LINGO 程序如下: MODEL:

SETS:

QUART/1..4/:p,d;

LINK(QUART,QUART)|&1#LE#&2:x,c; !只取上三角阵; ENDSETS

DATA:!指定数据; p=25,35,30,20; d=15,20,25,20;

c=12.0 12.1 12.2 12.3 11.0 11.1 11.2 11.5 11.6 12.5;

ENDDATA

MIN=@SUM(LINK:c*x);!目标函数;

@FOR(QUART(i):@SUM(QUART(j)|j#GE#i:x(i,j))<=p(i)); !生产能力限制; @FOR(QUART(j):@SUM(QUART(i)|i#LE#j:x(i,j))=d(j)); !交货合同限制; end

得到的结果如下:

X(1,1)=15,X(1,2)=0,X(1,3)=0,X(1,4)=0;X(2,2)=20,X(2,3)=0,X(2,4)=15。 X(3,3)=25, X(3,4)=5;X(4,4)=0。 年消耗最小费用为913.5万元。

可以看出,第1季度生产量为15台,第2季度生产量为35台,第3季度生产量为30台,第4季度生产量为0台,与前面方法得到的结果一样。其最小费用也一样。 9 (TSP 问题)

设有一个售货员从10个城市中的某一个城市出发,去其它9个城市推销产品。10个城市相互距离如下表。要求每个城市到达一次仅一次后,回到原出发城市。问他应如何选择旅行路线,使总路程最短。

问题分析与建模:

设城市之间距离用矩阵d 来表示,其中d 为下三角矩阵,ij d 表示城市i 与城市j 之间的距离。设0--1矩阵s 用来表示经过的各城市之间的路线。设 ??

?=j

i j i s ij 到城市若从城市到城市若不从城市1

则该TSP 问题转化为如下线性模型:

∑∑=-==

n

i i j ij ij

d s

Z 2

1

1

min

112..2

2,3,,01j j ik ji k i

j i ij

s s t s s i n s ><>?=??

+==???=?∑∑∑ 或

LINGO程序如下:

!TSP quesion;

MODEL:

SETS:

city/1..10/;

link(city,city)|&1#GT#&2:d,s;

ENDSETS

DATA:

d= 7

4 3

5 10 5

8 9 9 14

6 14 10 9 7

12 5 21 10 8 13

13 14 8 9 7 5 23

11 17 27 23 20 25 21 18

18 17 12 16 19 13 18 12 16;

ENDDATA

MIN=@SUM(link:d*s);

@SUM(city(j)|j#GT#1:S(j,1))=2; !与第1个城市相连的有两个城市;

!与第i个城市相连有两个城市;

@FOR(city(i)|i#GT#1:@SUM(city(j)|j#GT#i:s(j,i))+

@SUM(city(k)|k#LT#i:s(i,k))=2);

@FOR(link:@BIN(s));

得到的结果如下:

S(3,2)=1,S(4,1)=1,S(4,3)=1,S(6,5)=1,S(7,2)=1,S(7,5)=1,S(8,6)=1,S(9,1)=1,S(10,8)=1,S(10,9)=1。其它全为0。

其最短路线为1—4—3—2—7—5—6—8—10—9—1,最短距离为77公里。

10. 某公司有资金4万元,可向A,B,C三个项目投资。已知各项目不同投资额的相应效益如下表。问如何分配资金可使总效益最大。

模型分析与建立:

设项目有m个,每个项目有n种投资方式。第i个项目的第j种投资方式效益为

C万元。

ij

则投资可有效益矩阵为n m C ?来表示。每个项目的投资方式的资金分配用向量A 来表示。本题)4,3,2,1,0(=A 。 设??

?=种投资方式

个项目采用第

第种投资方式个项目不采用第

第j i j i S ij 1

则可建立如下模型:

∑∑===

m

i n

j ij ij

C S

Z 1

1

max

?????

?

???

?

?=≤=∑

∑∑===1014.

.111

或ij n j ij m i n

j j ij S S A S t s LINGO 程序如下:

MODEL: SETS: item/1..3/; kind/1..5/:A;

link(item,kind):S,C; ENDSETS DATA:

A=0,1,2,3,4; !投资钱的情况; C=0,41,48,60,66, 0,42,50,60,66,

0,64,68,78,76; !投资矩阵; ENDDATA

MAX=@SUM(link:S*C);

@SUM(item(i):@SUM(kind(j):S(i,j)*A(j)))=4; !总共投资的钱为4万元; @FOR(item(i):@SUM(kind(j):S(i,j))<=1);!每个项目最多投资一次; @FOR(LINK:@BIN(S));!限制S(i,j)只能取0,1; END

结果如下:

S(1,2)=1,S(2,3)=1,S(3,2)=1。即项目A 投资1万元,项目B 投资2万元,项目C 投资1万元。总收益最大为Z=41+50+64=155万元。

lingo教程 和MATLAB入门教程

LINGO 使用教程 LINGO 是用来求解线性和非线性优化问题的简易工具。LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。 §1 LINGO 快速入门 当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO 中求解如下的LP 问题: ,6002100 350. .32min 21211 212 1≥≤+≥≥++x x x x x x x t s x x 在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例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=35 37 22 32 41 32 43 38; cost=6 2 6 7 4 2 9 5 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 end 然后点击工具条上的按钮即可。 为了能够使用LINGO的强大功能,接着第二节的学习吧。 §2 LINGO中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。

优化模型讲解 附LINGO程序

数学建模培训讲义 ——优化模型与LINGO软件 二○一一年七 目录 1 静态优化模型 (1) 1.1 最优生产计划问题 (1) 1.2 存贮模型 (2) 2 线性规划模型 (2) 2.1 LINGO简介 (2) 2.2 配料问题 (3) 2.3 练习:运输问题 (4) 3 整数规划模型 (4) 3.1 电影院广告问题 (4) 3.2 练习:生产计划问题 (5) 4 0-1规划 (5) 4.1 背包问题 (5) 4.2 矿井选址问题 (6) 4.3 练习:混合泳接力队的选拔问题 (7) 5 LINGO应用 (8) 5.1 变量定界函数 (8) 5.2 集合 (8) 5.3 帆船生产问题 (9)

5.4 派生集合 (11) 5.5 通过电子表格(Excel)文件传递数据 (12) 5.6 旅游问题 (13)

优化模型与LINGO 软件 优化问题是计划管理工作中经常要碰到的问题,比如,出门旅行就要考虑选择什么样的路线和交通工具,才能使旅行费用最省或使所花费的时间最少。在工厂技术、经济管理和科学研究等领域中,最优化问题就更多,一个工厂要怎样安排产品的生产,才能获得最大利润?一个设计部门要考虑在满足结构强度的要求下怎样使得所用的材料的总重量最轻? 比较有效的求解优化问题的一个方法使数学规划,它包括:线性规划、非线性规划、整数规划、动态规划和多目标规划等等。 用数学建模的方法来处理一个优化问题的时候,首先要确定优化的目标是什么,寻求的决策是什么,决策受到哪些条件的限制(如果有限制的话),然后用数学工具(变量、函数等)表示它们。 1 静态优化模型 静态优化模型,归结为微积分中的函数极值问题,可以直接用微分法求解。 1.1 最优生产计划问题 一计算机公司引进A 、B 两种类型的芯片技术,总耗资400000元,准备生产这两种类型的芯片出售。生产一片A 芯片的成本为1950元,而市场售价为3390元,生产一片B 芯片的成本为2250元,而市场售价3990元。由于市场存在竞争,每售出一片A 芯片,A 芯片就会降价0.1元,并且令B 芯片降低0.04元,每售出一片B 芯片,B 芯片就会降价0.1元,并且令A 芯片降价0.03元。假设生产的芯片都能卖出,求一生产计划,以获得最大利润。 模型分析: 假设A 、B 两种芯片的数量分别是1x 和2x ,市场价格分别是1p 和2p ,用R 表示出售芯片的总收入,用C 表示生存芯片的总费用,用P 表示总利润。 根据题意,上述变量有如下关系: 11233900.10.03p x x =-- 21239900.040.1p x x =-- 1122R p x p x =+ 1240000019502250C x x =++ P R C =- 模型建立: 根据上述分析,可得优化模型

lingo编程练习题

一、编写lingo 程序求解下列方程(组) 1、4 x sin x cos x += 2、x x 24-= 3、求方程()074223=---=x x x x f 在[]43,中的根的近似值. 4、0432=--x x 5、12341234123420,3230,4350. x x x x x x x x x x x x +-+=?? -+-=??+-+=? 6、??? ??=+-=++--=++. x x x ,x x x , x x x 3103220241225321 321321 二、编写lingo 程序求解下列最优化问题 1、43215243x x x x z min +-+-= ?? ??? ??≥≥-++-≤+-+-=-+-. x ,x ,x ,x ,x x x x ,x x x x , x x x x .t .s 无约束43 214321432143210232142224 2、32132-2x x x z min += ??? ??≥≤≤-+-=++-. x ,x ,x ,x x x , x x x .t .s 无约束321 32142100624 3、213x x z max -= ????? ??≥≤+≥+≤-.x ,x ,x x ,x x , x x .t .s 为整数05210453232 121 2121 4、32152-3x x x z max +=

????? ?? ??=≤+≤+≤++≤-+. x ,x ,x , x x ,x x ,x x x ,x x x .t .s 1064344223213 221321321或 5、432173x x x x z min +-+= ????? ??=≥++≥++-≥-+-.x ,x ,x ,x ,x x x ,x x x x ,x x x x .t .s 10535846124 321421 43214321或 6、求图中点1v 到各点的最短路(不可逆行). 三、先建立问题的数学模型,再编写lingo 程序求解 1、某厂每日8小时的产量不低于1800件.为了进行质量控制,计划聘请两种不同水平的检验员.一级检验员的标准为:速度25件/小时,正确率98%,计时工资4元/小时;二级检验员的标准为:速度15小时/件,正确率95%,计时工资3元/小时.检验员每错检一次,工厂要损失2元.为使总检验费用最省,该工厂应聘一级、二级检验员各几名? 2、某饲料场饲养动物出售,设每头动物每天至少需700克蛋白质、30克矿物质、100毫克维生素.现有5种饲料可供选用,各种饲料每公斤营养成分含量及单价如表所示

LINGO11教程

LINGO 是用来求解线性和非线性优化问题的简易工具。LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。 §1 LINGO 快速入门 当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO 中求解如下的LP 问题: ,6002100 350. .32min 21211 212 1≥≤+≥≥++x x x x x x x t s x x 在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例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=35 37 22 32 41 32 43 38; cost=6 2 6 7 4 2 9 5 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 end 然后点击工具条上的按钮即可。 为了能够使用LINGO的强大功能,接着第二节的学习吧。 §2 LINGO中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。 2.1 为什么使用集 集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个

Lingo软件在求解数学优化问题的使用技巧

Lingo软件在求解数学优化问题的使用技巧 LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到广泛应用。LINGO 主要用于求解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于求解一些线性和非线性方程组及代数方程求根等。 LINGO的最新版本为LINGO7.0,但解密版通常为4.0和5.0版本,本书就以LINGO5.0为参照而编写。 1.LINGO编写格式 LINGO模型以MODEL开始,以END结束。中间为语句,分为四大部分(SECTION):(1)集合部分(SETS):这部分以“SETS:”开始,以“ENDSETS”结束。这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计算,就象C语言在在程序的第一部分定义变量和数组一样。在LINGO中称为集合(SET)及其元素(MEMBER或ELEMENT,类似于数组的下标)和属性(A TTRIBUTE,类似于数组)。 LINGO中的集合有两类:一类是原始集合(PRIMITIVE SETS),其定义的格式为:SETNAME/member list(or 1..n)/:attribute,attribute,etc。 另一类是是导出集合(DERIVED SETS),即引用其它集合定义的集合,其定义的格式为: SETNAME(set1,set2,etc。):attribute,attribute,etc。 如果要在程序中使用数组,就必须在该部分进行定义,否则可不需要该部分。(2)目标与约束:这部分定义了目标函数、约束条件等。一般要用到LINGO的内部函数,可在后面的具体应用中体会其功能与用法。求解优化问题时,该部分是必须的。(3)数据部分(DA TA):这部分以“DA TA:”开始,以“END DA TA”结束。其作用在于对集合的属性(数组)输入必要的数值。格式为:attribut=value_list。该部分主要是方便数据的输入。 (4)初始化部分(INIT):这部分以“INIT:”开始,以“END INIT”结束。作用在于对集合的属性(数组)定义初值。格式为:attribute=value_list。由于非线性规划求解时,通常得到的是局部最优解,而局部最优解受输入的初值影响。通常可改变初值来得到不同的解,从而发现更好的解。 编写LINGO程序要注意的几点: 1.所有的语句除SETS、ENDSETS、DA TA、ENDDA TA、INIT、ENDINIT和MODEL,END 之外必须以一个分号“;”结尾。 2.LINGO求解非线性规划时已约定各变量非负。 LINGO内部函数使用详解。 LINGO建立优化模型时可以引用大量的内部函数,这些函数以“@”符号打头。 (1)常用数学函数 @ABS(X) 返回变量X的绝对数值。 @COS( X) 返回X的余弦值,X的单位为弧度 @EXP( X)

lingo优化练习即详解

Lingo 作业解题过程 1.某储蓄所每天的营业时间是上午9时到下午5时。根据经验,每天不同时间段所需要的服务 员数量如下表示。储蓄所可以雇佣全时和半时两类服务员。全时服务员每天报酬100元,从上午9时到下午5时工作,但中午12时到下午2时之间必须安排1h 的午餐时间。储蓄所每天可以雇佣不超过3名的半时服务员,每个半时服务员必须连续工作4h,报酬40元,问储蓄所应如何雇用全时和半时服务员。如果不能雇佣半时服务员,每天至少增加多少费用。如果雇佣半时服务员的数量没有限制,每天可以减少多少费用。 时间段/h 9~10 10~11 11~12 12~1 1~2 2~3 3~4 4~5 服务员数 4 3 4 6 5 6 8 8 解:(1)设1x 为雇佣的全职人数,2x 为12-1小时休息的人数,1y -5y 分别为1-5时段开始雇佣的半时人员的人数。表1为各时间段的工作人数。每个时间段的工作人数要满足题目中的要求。 表1 各时间段在工作的服务员 时间段/h 服务员 9-10 11x y + 10-11 112x y y ++ 11-12 3 11 i i x y =+? 12-1 4 121 i i x y x =+ -? 1-2 5 22 i i x y =+ ? 2-3 5 13 i i x y =+? 3-4 5 14 i i x y =+ ? 4-5 15x y + 根据每个时段满足的要求,建立模型如下:

()5 1 23 1111 1 1 4 5 5 122 11 2 3 5 1154 5 1 min 100*x 140 : (1)x y 4; (2) x 3; (3) x 4 ; (4)x x 6;(5)x 5;(6)x 6 (7)x 8;(8)x 8 3 i i i i i i i i i i y st y y y y y y y y =========++>+ >+ >-+>+ >+ >+ >+>4; !第一阶段要满足的服务员人数; x(1)+y(1)+y(2)>3; !第二阶段要满足的服务员人数; x(1)+y(1)+y(2)+y(3)>4; !第三阶段要满足的服务员人数; x(1)-x(2)+y(1)+y(2)+y(3)+y(4)>6; !第四阶段要满足的服务员人数; x(2)+y(2)+y(3)+y(4)+y(5)>5; !第五阶段要满足的服务员人数; x(1)+y(3)+y(4)+y(5)>6; !第六阶段要满足的服务员人数; x(1)+y(4)+y(5)>8; !第七阶段要满足的服务员人数; x(1)+y(5)>8; !第八阶段要满足的服务员人数; 程序运行的结果为最少花费820元,雇佣全时员工7人,半时员工3人,半时员工分别在第二时段雇佣2人,第五时段雇佣1人,12-1时去吃饭的全是员工为2人,剩下5人在1-2时吃饭。 (2)第二问直接可以看出答案,编程也可以。 min =100*x1; x1-x2>6; x2>5; 运行程序得出答案1100元,与第一问的820元,要增加费用280元。 (3)第三问直接将第一问的程序中@sum (banshi:y)<3; 删除(即对雇佣的半时服务员的个数没有限制),可得出结果本题的结果。 最少花费560元,第一时段雇佣半时员工6人,第五时段雇佣半时人员8人,就可以满足每个时段所需要的员工要求。节省费用820-560=260元。 2.某银行经理计划用一笔资金进行有价证券的投资,可供购进的证券以及其信用等级、到期

如何在lingo中使用集合1

例题1. 在lingo 中输入下列线性规划模型,并求解 ∑∈?=A j i j i x j i d z ),(),(),( min s.t. 1),1(≥∑∈V j j x , , },10,,2,1{,0),(x ,),(, 1,1),(V V A V V i i i j i x j j i x V i ?==∈=>=∑∈ 为非负实数 所有 的数值如下表:d d=0 8 5 9 12 14 12 16 17 22 8 0 9 15 16 8 11 18 14 22 5 9 0 7 9 11 7 12 12 17 9 15 7 0 3 17 10 7 15 15 12 16 9 3 0 8 10 6 15 15 14 8 11 17 8 0 9 14 8 16 12 11 7 10 10 9 0 8 6 11 16 18 12 7 6 14 8 0 11 11 17 14 12 15 15 8 6 11 0 10 22 22 17 15 15 16 11 11 10 0; 分析:这个模型输入的难点,在于变量的数量太多,足足有100个。约束条件也比较多,有没有什么方便的输入方法?下面介绍lingo 中集合的建立 新建lingo 文件 输入下面内容 model : sets : V/1..10/;!创建集合V; A(V,V):d,x;!创建集合A 是V 乘V.而d,x 是与A 同结构的,即d ,x 分别是10*10矩阵; endsets min =@sum (A(i,j):d(i,j)*x(i,j));!创建目标函数; @sum (V(j):x(1,j))>=1; !第一个约束条件; @for (V(j)|j#gt#1: !i#gt#1为逻辑判断语句表示i>1是返回真值,但这里不能直接写i>1,因为">"是关系运算符不是逻辑运算符; @sum (V(i):x(i,j))=1;); !利用循环函数表达:当i>1(即i 从2到10)时, {x(i,j):j=1..10}的和等于1;

优化建模与lingo软件

问题一:LP 问题在lindo 和lingo 中不同的输入形式 (1)将目标函数的表示方式从“MAX ”变成了“MAX=” (2)“ST ”在LINGO 模型中不再需要,所以被删除了 (3)每个系数与变量间增加了运算符“*”(即乘号不能省略) (4)每行(目标、约束和说明语句)后面均增加了一个分号“;”(英文状态下) (5)模型结束标志“END ”也被删除了(LINGO 中只有当模型以“MODEL :”开始时才能以“END ”结束)。 (6)英文状态下!后面的文字为说明文字,不参与模型的求解。 问题二:状态窗口的参数解释 variable adj 异变的,变量的 n 变量

问题三优化建模的实例: 1. 线性规划模型 2. 二次规划模型 3. 非线性规划模型 目标函数:()()∑∑--==+= 2161 22min j i bi yi ai xi cij f 约束条件:6,5,4,3,2,1,21 ∑===j i di cij ∑==<=6 1 2,1,i j ej cij 4. 整数规划模型(线性0-1规划模型是特殊的线性整数规划) 1) 目标函数:7654321min x x x x x x x z ++++++= 2) 约束条件: ???????????>=++++>=++++>=++++>=++++>=++++>=++++>=++++. 5076543,5065432,5054321,5074321,5076321,5076521,5076541x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x )7,,2,1(0 =>=i xi

运用LINGO进行优化模型求解,并与EXCEL进行连接

实验报告(二) 课程名称数学实验 实验项目运用LINGO进行优化模型求解,并与EXCEL进行连接实验环境PC机、LINGO 班级/学号/姓名 指导教师 实验日期2013-11-5 成绩

一、实验名称:运用LINGO 进行优化模型求解,并与EXCEL 进行连接 二、实验目的: 1、掌握Lingo 求解线性规划模型的方法及回看求解结果报告; 2、掌握Lingo 进行灵敏度分析的方法; 3、掌握Lingo 求解整数规划和0-1规划的方法; 4、掌握Lingo 中集合的定义方法; 5、掌握Lingo 与Excel 之间的链接方法; 三、实验内容: 习题四: 1.用LINGO 求解下列线性规划问题 (1)?????? ?=≥≤++≤++≤++++=. 4,...,1,0x 103x x 2x -4x 258x 2x 3x -3x 204x -4x -6x 5x ..8x 10x 2x 6x z max i 4321432143214 321i t s 程序: model : max =6*x1+2*x2+10*x3+8*x4; 5*x1+6*x2-4*x3-4*x4<=20; 3*x1-3*x2+2*x3+8*x4<=25; 4*x1-2*x2+x3+3*x4<=10; end 结果:

(2) ??? ??≥≤++≤++++=0,,x 9010x 4x 12x 20 3x x x -s.t.13x 5x -5x z max 3 213213213 21x x 程序: model : max =-5*x1+5*x2+13*x3; -1*x1+x2+3*x3<=20; 12*x1+4*x2+10*x3<=90; end 结果: (3)?? ???>=++<=+<=+=010y 4x 011-7y x 0 23-5y -7x ..y 2x z min t s 程序: model : min =2*x+y; 7*x-5*y-23<=0; x+7*y-11<=0; 4*x+y+10>=0; @free (x); @free (y); end 结果:

lingo软件使用教程

lingo软件使用教程 一般来说,一个优化模型将由以下三部分组成: 1. 目标函数(Objective Function):要达到的目标。 2. 决策变量(Decision variables):每组决策变量的值代表一种方案。在优化模型中需要确定决策变量的最优值,优化的目标就是找到决策变量的最优值使得目标函数取得最优。 3. 约束条件(Constraints):对于决策变量的一些约束,它限定决策变量可以取的值。 在写数学模型时,一般第一行是目标函数,接下来是约束条件,再接着是一些非负限制等。在模型窗口输入如下代码: Max = 2*x1+3*x2; X1+2*x2<=8; 4*x1<16; 4*x2<12; 注意:1.每一个lingo表达式最后要跟一个分号; 2.多数电脑中没有符号,lingo中<=代替;为了方便可以用<代替小于等于,用>代替大于等于。 3.我们可以添加一些注释,增加程序的可读性。注释以一个!(叹号必须在英文状态下输入,它会自动变为绿色)开始,以;(分号)结束。 4.Lingo中不区分变量名的大小写。变量名必须以字母(A-Z)开头,后面的字符可以是字母、数字、下划线。变量名不能超过32个字符。 Lingo程序的一些规则: 1. 在Lingo中最开始都是“MAX=”或者“MIN=”开始表示求目标函数的最大或者最小值。 2. 变量和它前面的系数之间要用“*”连接,中间可以有空格。 3. 变量名不区分大小写,但必须以字母开始,不超过32个字符。 4. 数学表达式结束时要用分号“;”表示结束。表达式可以写在多行上,但是表达式中间不能用分号。 5. 在电脑系统中一般没有“小于等于”符号,在Lingo采用“<=”来表示“小于等于”,用“>=”表示“大于等于”。小于等于也可以用更简单的“<”表示,大于等于用“>”表示。 集合段: 在我们已经得到的程序里有一些量没有定义,如WAREHOUSES( I),DEMAND( J), LINKS( I, J)。这些量将在Lingo中的集合段定义。 集合段以SETS:表示开始,以ENDSETS表示结束。 如果一个集合的元素都已经定义过,就可以用一些循环函数(如@for). 注:1. 集合的属性相当于以集合的元素为下标的数组。Lingo中没有数组的概念,只有定义在集合上的属性的概念。 2 集合的定义语法: set_name[/set_member/:][attribute_list]; 集合的名称在左边,右边是这个集合上的属性,他们之间用冒号“:”分割开,最后由分号表示结束。如果在同一个集合上有多个属性时,不同的属性之间用逗号“,”隔开,如本例的cost和volume属性。如果要特别列出集合的元素时,在集合的名称后把元素写在两条斜线之间,如本例中的仓库可以写为 WAREHOUSES/WH1, WH2, WH3, WH4, WH5, WH6/: CAPACITY;

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

用lingo编程解决运输问题大全

LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。 当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model –LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例如何在LINGO中求解如下的LP问题:

,6002100 350. .32min 21211 2121≥≤+≥≥++x x x x x x x t s x x 在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例 使用LINGO 软件计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。 销地 产地 B 1 B 2 B 3 B 4 B 5 B 6 B 7 B 8 产量 A 1 6 2 6 7 4 2 5 9 60 A 2 4 9 5 3 8 5 8 2 55 A 3 5 2 1 9 7 4 3 3 51 A 4 7 6 7 3 9 2 7 1 43 A 5 2 3 9 5 7 2 6 5 41 A 6 5 5 2 2 8 1 4 3 52 销量 35 37 22 32 41 32 43 38

使用LINGO软件,编制程序如下: 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 5 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

第1讲 Lingo软件入门(2014)

第1讲Lingo软件入门 司守奎 烟台市,海军航空工程学院数学教研室 Email:sishoukui@https://www.wendangku.net/doc/0f19144785.html, 1 Lingo软件的基本语法 1.1 集合 集合部分的语法为 sets: 集合名称1/成员列表1/:属性1_1,属性1_2,…,属性1_n1; 集合名称2/成员列表2/:属性2_1,属性2_2,…,属性2_n2; 派生集合名称(集合名称1,集合名称2):属性3_1,…,属性3_n3; endsets 例26 sets: product/A B/; machine/M N/; week/1..2/; allowed(product,machine,week):x; endsets 1.2 数据 数据部分的语法为 data: 属性1=数据列表; 属性2=数据列表; enddata 1.3 计算 计算段部分不能含有变量,必须是已知数据的运算。 calc: b=0; a=a+1; endcalc 1.4 模型的目标函数和约束条件 这里就不具体给出了,下面通过具体例子给出。 1.5 子模型 在LINGO 9.0 及更早的版本中,在每个LINGO 模型窗口中只允许有一个优化模型,可以称为主模型(MAIN MODEL)。在LINGO 10.0 中,每个LINGO 模型窗口中除了主模型外,用户还可以定义子模型(SUBMODEL)。子模型可以在主模型的计算段中被调用,这就进一步增强了LINGO 的编程能力。 子模型必须包含在主模型之内,即必须位于以“MODEL:”开头、以“END”结束的模块内。同一个主模型中,允许定义多个子模型,所以每个子模型本身必须命名,其基本语法是: SUBMODEL mymodel: 可执行语句(约束+目标函数); ENDSUBMODEL 其中mymodel 是该子模型的名字,可执行语句一般是一些约束语句,也可能包含目标函数,但不可以有自身单独的集合段、数据段、初始段和计算段。也就是说,同一个主模型内的变量都是全局变量,这些变量对主模型和所有子模型同样有效。 如果已经定义了子模型mymodel,则在计算段中可以用语句“@SOLVE( mymodel);”求解这个子模型。 2 Lingo函数 2.1 算术运算符

lingo教程

LINGO是Linear Interactive and General Optimizer的缩写,中文名称为“交互式的线性和通用优化求解器”,是由美国LINDO系统公司(Lindo System Inc.)开发的一套专门用于求解最优化问题的软件包,用于求解线性规划和二次规划问题,LINGO可以求解非线性规划问题,也可以用于一些线性和非线性方程(组)的求解等。此外,LINGO还允许优化模型中的决策变量为整数(即整数规划),其执行速度很快,是求解优化模型的最佳选择。 1软件介绍 其特色在于内置建模语言,提供十几个内部函数,可以允许决策变量是整数(即整数规划,包括0-1整数规划),方便灵活,而且执行速度非常快。能方便与EXCEL,数据库等其他软件交换数据。最新版本LINGO14.0已经发布。 2操作步骤 一般地,使用LINGO求解运筹学问题可以分为以下两个步骤来完成:1)根据实际问题,建立数学模型,即使用数学建模的方法建立优化模型; 2)根据优化模型,利用LINGO来求解模型。主要是根据LINGO软件,把数学模型转译成计算机语言,借助于计算机来求解。 例题:在线性规划中的应用maxZ=5X1+3X2+6X3, s.t.X1+2X2+X3≤18 2X1+X2+3X3=16 X1+X2+X3=10

X1,X2≥0,X3为自由变量 应用LINGO来求解该模型,只需要在lingo窗口中输入以下信息即可: max=5*x1+3*x2+6*x3; x1+2*x2+x3<=18; 2*x1+x2+3*x3=16; x1+x2+x3=10; @free(x3); 然后按运行按钮,得到模型最优解,具体如下:Objectivevalue:46.00000 VariableValueReducedCost x114.000000.000000 x20.0000001.000000 x3-4.0000000.000000 由此可知,当x1=14,x2=0,x3=-4时,模型得到最优值,且最优值为46。 说明:在利用LINGO求解线性规划时,如自变量都为非负的话,在LINGO中输入的信息和模型基本相同;如自变量为自由变量,可以使用函数@free来把系统默认的非负变量定义自由变量,如实例一中的x3。 3软件详述 LINGO全称是LinearINteractiveandGeneralOptimizer的缩写---

LINGO的使用方法说明大全

LINGO的使用简介 LINGO软件是美国的LINGO系统公司开发的一套专门用于求解最优化问题的软件包.LINGO除了能够用于求解线性规划和二次规划外,还可以用于非线性规划求解、以及一些线性和非线性方程(组)的求解等.LINGO软件的最大特色在于它允许优化模型中的决策变量为整数,即可以求解整数规划,而且执行速度快.LINGO是用来求解线性和非线性优化问题的简易工具.LINGO置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果.在这里仅简单介绍LINGO的使用方法. LINGO(Linear INteractive and General Optimizer )的基本含义是交互式的线性和通过优化求解器.它是美国芝加哥大学的 Linus Schrage 教授于1980年开发了一套用于求解最优化问题的工具包,后来经过完善成何扩充,并成立了LINDO系统公司.这套软件主要产品有:LINDO,LINGO,LINDO API和What’sBest.它们在求解最优化问题上,与同类软件相比有着绝对的优势.软件有演示版和正式版.正式版包括:求解包(solver suite)、高级版(super)、超级版(hyper)、工业版(industrial)、扩展版(extended).不同版本的LINGO对求解问题的规模有限制,如附表3-1所示. 附表3-1 不同版本LINGO对求解规模的限制 版本类型总变量数整数变量数非线性变量数约束数 演示版 300 30 30 150 求解包 500 50 50 250 高级版 2000 200 200 1000 超级版 8000 800 800 4000 工业版 32000 3200 32000 16000 扩展版无限无限无限无限 3.1 LINGO程序框架 LINGO可以求解线性规划、二次规划、非线性规划、整数规划、图论及网络最优化问题和最大最小求解问题,以及排队论模型中最优化等问题. 一个LINGO程序一般会包括以下几个部分: (1) 集合段:集部分是LINGO模型的一个可选部分.在LINGO模型中使用集之前,必须在集部分事先定义.集部分以关键字“sets:”开始,以“endsets”结束.一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分.一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须先定义. (2) 数据段:在处理模型的数据时,需要为集部分定义的某些元素在LINGO求解模型之前为其指定

LINGO软件的使用

第十八章LINGO软件的使用 18.1 LINGO入门 18.1.1 LINGO软件的安装过程 点击LINGO9.0 for Windows安装文件,出现 点击“Next”按钮,出现 此时需要接受安装协议。系统安装时默认的目录是C:\LINGO9。安装完成前,会出现下图所示的对话框:

这个对话框询问你希望采用的默认的建模(即编程)语言,系统推荐的是采用LINGO语法,也就是选项“LINGO(recommended)”;你也可以选择“LINDO”将LINDO语法作为默认的设置。当然,安装后你也可以通过“LINGO|Options|File Format命令来修改默认的建模(即编程)语言。在上图中按下“OK”按钮,系统就会完成LINGO的安装过程。 18.1.2 LINGO基础知识 LINGO有两种命令格式:一种是常用的Windows模式,通过下拉式菜单命令驱动LINGO 运行,界面是图形式的,使用起来也比较方便;另一种是命令行(Command-Line)模式,仅在命令窗口(Command Window)下操作,通过输入行命令驱动LINGO运行。由于其使用字符方式输入,初学者往往不太容易掌握。在这里,我们主要介绍在菜单驱动模式下LINGO的使用方法。 LINGO 9.0软件比以前的版本有了很大的改进,功能大大增强,性能更加稳定,计算的结果更加可靠。LINGO软件不仅可用于求解非线性规划问题,还可以用以求解非线性整数规划问题;LINGO包含了内置的建模语言,模型中所需的数据可以以一定格式保存在独立的文件中;LINGO允许以简练、直观的方式描述较大规模的优化问题。 注:LIGDO公司目前已将LINDO软件从其产品中删除了。事实上,LINDO软件的所有功能(包括LINDO语法格式)都在LINGO中得到了支持。 当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。状态行最左边显示的是“Ready”表示“准备就绪”;右下角显示的是当前时间,时间前面是当前光标的位置“Ln1,Col1”(即1行1列)。将来,用户可以用选项命令(LINGO|Options菜单命令)决定是否需要显示工具栏和状态行。在LINGO 模型窗口中,选择菜单命令“File|Open(F3)”,可以看到下图所示的标准的“打开文件”对话框,我们看到有各种不同的“文件类型”:

LINGO练习题答案

1、用LINGO 软件解方程组221212222359 x x x x ?+=??-=-??。 2、用LINGO 软件解方程组1211221222/64 x x x x x ??-=-??=?。 3、用LINGO 软件解线性规划问题 4、用LINGO 软件解二次规划问题 且12,x x 都是整数 5、用LINGO 软件解下列问题 (1)max 12z=x x + 12121212..26, 4520,,0, ,s t x x x x x x x x +≤+≤≥为整数 (2) min 22 12z=x -3-2x +()() 22121212..-50, 24, ,0s t x x x x x x +≤+≤≥。 (3) min 2212z=x ++x +(1)(1) max 23,..4310, 3512,,0.z x y s t x y x y x y =++≤+≤≥22121122121212max 982770.32,..100,2,,0,x x x x x x s t x x x x x x +---+≤≤≥

22122..-20,1s t x x x +≤≥。 6、用LINGO 软件分别产生序列 (1){1,3,5,7,9,11};(2){1,4,9,16,25,36};(3)1111{1,,,,}6122030 . 7、已知向量c={1,3,0.5,7,5,2},用LINGO 软件解答下列问题。 (1)求向量c 前5个数中的最大值;(2)求向量c 后4个数平方中的最小值;(3)求向量c 中所有数的和。 8、某学校游泳队要从5名队员中选4名参加4乘100米混合泳接力赛。 5名队员4种泳姿的百米成绩(单位:秒) ----------------------------------------------------------------------------------- 李 王 张 刘 赵 蝶泳 66.8 57.2 78 70 67.4 仰泳 75.6 66 67.8 74.2 71 蛙泳 87 66.4 84.6 69.6 83.8 自由泳 58.6 53 59.4 57.2 62.4 ----------------------------------------------------------------------------------- 如何选拔? (1)请建立“0----1规划”模型; (2)用Lingo 求解。

相关文档