LINGO软件的使用

LINGO软件的使用
LINGO软件的使用

第三章 LINGO软件使用入门

LINGO是美国LINDO系统公司开发的一套专门用于求解最优化问题的软件.它为求解最优化问题提供了一个平台,主要用于求解线性规划、非线性规划、整数规划、二次规划、线性及非线性方程组等问题.它是最优化问题的一种建模语言,包含有许多常用的函数供使用者编写程序时调用,并提供了与其他数据文件的接口,易于方便地输入,求解和分析大规模最优化问题,且执行速度快.由于它的功能较强,所以在教学、科研、工业、商业、服务等许多领域得到了广泛的应用.

§3.1 LINGO操作界面简介

在Windows操作系统下启动LINGO软件,屏幕上首先显示如图1.1所示的窗口.

图1.1

图1.1中最外层的窗口是LINGO软件的主窗口(LINGO软件的用户界面),所有其他窗口都在这个窗口之内.主窗口有:标题栏、菜单栏、工具栏和状态栏.目前,状态栏最左边显示的是“Ready”,表示准备就绪,右下角显示的是当前时间,时间前面是当前光标的位置“Ln 1,Col 1”(即1行1列).将来用户可以用选项命令(LINGO|Options|Interface菜单命令)决定是否需要显示工具栏和状态栏.

LINGO有5个主菜单:

●File(文件)

●Edit(编辑)

●LINGO(LINGO系统)

●Windows(窗口)

●Help(帮助)

这些菜单的用法与Windows下其他应用程序的标准用法类似,下面只对主菜单中LINGO

系统的主要命令进行简要介绍.

LINGO系统(LINGO)的主菜单

●LINGO|Solve(Ctrl-S)

LINGO|Solve(Ctrl-S)(求解)命令对当前模型进行编译并求解.如果当前模型输入有错误,编译时将报告错误.求解时会显示一个求解器运行状态窗口.

●LINGO|Solution(Ctrl-O)

LINGO|Solution(Ctrl-O)(解答)命令显示当前解.

●LINGO|Range(Ctrl-R)

LINGO|Range(Ctrl-R)(灵敏度分析)命令显示当前解的灵敏度分析结果.(你必须在此之前求解过当前模型)

●LINGO|Options(Ctrl-I)

LINGO|Options(Ctrl-I)(选项)命令将打开一个含有7个选项卡的对话框窗口,你可以通过它修改LINGO系统的各种控制参数和选项.修改完以后,你如果单击“应用”按钮,则新的设置马上生效;如果单击“OK”按钮,则新的设置马上生效,并且同时关闭该窗口;如果单击“Save”按钮,则将当前设置变为默认设置,下次启动LINGO时这些设置仍然有效;如果单击“Default”按钮,则恢复LINGO系统定义的原始默认设置;如果单击“Cancel”按钮将废弃本次操作,退出对话框;单击“Help”按钮将显示本对话框的帮助信息.

●LINGO|Generate和LINGO|Picture

LINGO|Generate和LINGO|Picture命令都是在模型窗口下才能使用,他们的功能是按照LINGO模型的完整形式分别以代数表达式形式和矩阵图形形式显示目标函数和约束.

●LINGO|Debug(Ctrl+D)

LINGO|Debug(Ctrl+D)命令分析线性规划无解或无界的原因,建议如何修改

●LINGO|Model Statistics(Ctrl+E)

LINGO|Model Statistics(Ctrl+E)命令显示当前模型的统计信息.

●LINGO|Look(Ctrl+L)

LINGO|Look(Ctrl+L)命令显示当前模型的文本形式,显示时对所有行按顺序编号.图1.2给出了工具栏的简要功能说明.

图1.2

当前光标所在的窗口(窗口标题栏上标有“LINGO Model-LINGO1”),就是模型窗口(model windows),也就是用于输入LINGO优化模型(即LINGO程序)的窗口.

§3.2 LINGO模型的基本特征

LINGO模型(程序)从LINGO模型窗口输入,它以语句“MODEL:”开始,以语句“END”结束.它是由一系列语句组成,每个语句都是以分号“;”结束,语句是组成LINGO模型的基本单位.每行可以写多个语句,为了保持模型的可读性,最好一行只写一个语句,并且按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感.以感叹号“!”开始的语句是注释语句(注释语句也需要以分号“;”结束).

LINGO模型(程序)一般由5个部分(或称5段)组成:

(1)集合段(SETS):这部分要以“SETS:”开始,以“ENDSETS”结束,作用在于定义必要的集合变量(SET)及其元素(member,含义类似于数组的下标)和属性(attribute,含义类似于数组).格式有基本集和派生集两种.

基本集:

Setname(集合变量名)[/member_list(元素列表)/][:attribute_list(属性列表)];

元素列表可以全部一一列出,也可以用格式“/元素1..元素N/”列出,例如

SETS:

STUDENTS/1,2,3,4,5/:NAME,AGE;

ENDSETS

SETS:

STUDENTS/1..5/:NAME,AGE;

ENDSETS

派生集:

Setname(parent_set_list(源集列表))[/member_list/][:attribute_list];

例如

SETS:

PRODUCT/A B/;

MACHINE/M N/;

WEEK/1..2/;

ALLOWED( PRODUCT,MACHINE,WEEK);

ENDSETS

列表可以用逗号“,”分开,也可以用空格分开.

(2)数据段(DATA):这部分要以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性(数组)输入必要的常数数据.格式为:

attribute_list(属性列表)=value_list(常数列表);

例如

SETS:

SET1 /A, B, C/: X, Y;

ENDSETS

DATA:

X = 1 2 3;

Y = 4 5 6;

ENDDATA

(3)初始化段(INIT):这部分要以“INIT:”开始,以“ENDINIT”结束,作用在于对集合的属性(数组)给出初值.格式为:

attribute_list(属性列表)=value_list(常数列表);

与数据段的用法类似.

(4)计算段(CALC):这部分要以“CALC:”开始,以“ENDCALC”结束,作用在于对一些原始数据进行计算处理.因为在实际问题中,输入的数据往往是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据.在计算段中语句是顺序执行的.

(5)目标与约束段:这部分没有段的开始和结束标记,作用在于给定目标函数与约束条件.可见除这一段外,其他4个段都有明确的段标记.这一段是模型的主要部分,其他段是为这一段服务的.其他四段可以没有,这一段必须要有.否则不称其为模型.这一段一般要用到LINGO的运算符和各种函数.

§3.3 LINGO的运算符和函数

LINGO包含有大量的运算符和函数,供程序(建立优化模型)调用,其功能很强.充分利用这些函数,对解决问题将是非常方便的.下面给出部分函数及简要功能介绍,全部函数及详细功能说明可进一步参考LINGO的使用手册.

一、运算符及其优先级

LINGO的运算符有三类:算数运算符、逻辑运算符和关系运算符.

1.算术运算符:LINGO中的算术运算符有以下5种:

+(加法),-(减法或负号),*(乘法),/(除法),∧(求幂).

算术运算是数与数之间的运算,运算结果仍是数.

2.逻辑运算符:LINGO中的逻辑运算符有以下9种,可以分成两类:

(1)#AND#(与),#OR#(或),#NOT#(非):这三个运算是逻辑值之间的运算,也就是

它们操作的对象本身必须已经是逻辑值或逻辑表达式,计算结果也是逻辑值.(2)#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于):这6个操作实际上是“数与数之间”的比较,也就是它们操作的对象本身必须是两个数,而逻辑表达式计算的结果是逻辑值.

3.关系运算符:LINGO中的关系运算符有以下3种:

<(即<=,小于等于),=(等于),>(即>=,大于等于)

这三个运算符虽然也是“数与数之间”的比较,但在LINGO中只用来表示优化模型的约束条件,所以不是真正意义上的运算.

这些运算符的优先级如表3.1所示(同一优先级按左到右的顺序执行;如果有括号“()”,则括号内的表达式优先进行计算)

表3.1

二、基本的数学函数

在LINGO中写程序时可以调用大量的内部函数,这些函数以“@”符号打头(类似调用命令).LINGO中数学函数的用法与其它语言中的数学函数的用法类似,主要有以下函数:@ABS(X):绝对值函数,返回X的绝对值.

@COS(X):余弦函数,返回X的余弦值(X的单位是弧度).

@EXP(X):指数函数,返回e x的值.

@FLOOR(X):取整函数,返回X的整数部分(向最靠近0的方向取整).

@LGM(X):返回X的伽马(Gamma)函数的自然对数值.

@LOG(X):自然对数函数,返回X的自然对数值.

@MOD(X,Y):模函数,返回X对Y取模的结果.

@POW(X,Y):指数函数,返回X Y的值.

@SIGN(X):符号函数,返回X的符号值(X<0时返回-1,X>=0返回1).

@SIN(X):正弦函数,返回X的正弦值.

@SMAX(list):最大值函数,返回列表(list)中的最大值.

@SMIN(list):最小值函数,返回列表(list)中的最小值.

@SQR(X):平方函数,返回X的平方值.

@SQRT(X):平方根函数,返回X的正的平方根的值.

@TAN(X):正切函数,返回X的正切值.

三、集合循环函数

集合循环函数是指对集合上的元素(下标)进行循环操作的函数,主要有@FOR,@MAX,@MIN,@SUM,@PROD五种,其用法如下:

@function(setname[(set_index_list)[|conditional_qualifier]]:expression_list);其中:

Function是集合函数名;

Setname是集合名;

set_index_list是集合索引列表(不需要使用索引时可以省略);

|conditional_qualifier是用逻辑表达式给出的过滤条件(无条件时可以省略);

:expression_list是一个表达式(对@FOR函数,可以是一组表达式).

下面简要介绍其作用.

@FOR(setname[(set_index_list)[|cond_qualifier]]:exp_list):对集合setname中的每个元素独立地生成由exp_list描述的表达式(通常是优化问题的约束).@MAX(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的最大值.

@MIN(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的最小值.

@SUM(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的和.

@PROD(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的积.

四、集合操作函数

集合操作函数是指对集合进行操作的函数,主要有@INDEX,@IN,@WRAP,@SIZE四种,下面简要介绍其作用.

@INDEX([set_name,]primitive_set_element):返回元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号).如果省略集合名set_name,LINGO按程序定义的集合顺序找到第一个含有元素primitive_set_element的集

合,并返回索引值.如果在所有集合中均没有找到该元素,会给出出错信息.

@IN(set_name,primitive_index_1[,primitive_index_2 ...]):判断一个集合中是否含有索引值.集合set_name 中包含由索引primitive_index_1[,primitive_index_2...]所表示的对应元素,则返回1(逻辑值“真”),否则返回0(逻辑值“假”).

@WRAP(INDEX,LIMIT):返回J=INDEX-K*LIMIT,其中J 位于区间[1,LIMIT],K 为整数.当INDEX 位于区间[1,LIMIT]内时直接返回INDEX .相当于数学上用INDEX 对LIMIT 取模函数的值+1,即@WRAP(INDEX,LIMIT)=@MOD(INDEX,LIMIT)+1.此函数对LIMIT <1无定义.可以想到,此函数的目得之一是防止集合的索引值越界.

@SIZE(set_name):返回集合set_name 的模,即元素的个数.

五、变量定界函数

变量定界函数是对变量的取值范围加以限制的函数.主要有@BIN, @BND, @FREE, @GIN 四种,下面简要介绍其作用.

@BIN(variable):限制变量variable 为0或1. @BND(lower_bound, variable, upper_bound):限制

lower_bound <=variable <=upper_bound

@FREE(variable):取消对变量variable 的符号限制(即可取负数、0或正数). @GIN(variable):限制变量variable 为整数.

六、财务会计函数

财务会计函数是用于计算净现值的函数.主要有@FPA, @FPL 两种,下面简要介绍其作用. @FPA(I,N):返回若干时段单位等额回收净现值.其中单位时段利率为I,时段N 个,即

∑=+=

N

n n

I N I FPA 1

)

1(1

),(@

@FPL(I,N):返回一个时段单位回收净现值.其中单位时段利率为I,时段N ,即

N

I N I FPL )

1(1),(@+=

七、概率中的相关函数

概率中的相关函数是涉及到概率论和随机过程中的一些函数.主要有以下函数: @PSN(X):返回标准正态分布的分布函数在X 点的取值.

@PSL(X):标准正态的线性损失函数,即返回MAX(0,Z-X)的期望值,其中Z 为均值为A

的Poisson随机变量.

@PPS(A,X):返回均值为A的Poisson分布的分布函数在X点的取值.

@PPL(A,X):Poisson分布的线性损失函数,即返回MAX(0,Z-X)的期望值,其中Z为标准正态随机变量.

@PBN(P,N,X):返回参数为(N,P)的二项分布的分布函数在X点的取值.

@PHG(POP,G,N,X):返回总共有POP个球,其中G个是白球,随机地从中取出N个球,白球不超过X的概率.

@PFD(N,D,X):返回自由度为N和D的F分布的分布函数在X点的取值.

@PCX(N,X):返回自由度为N的2

分布的分布函数在X点的取值.

@PTD(N,X):返回自由度为N的t分布的分布函数在X点的取值.

@PEB(A,X):返回当到达负荷(强度)为A,服务系统有X个服务器且允许无穷排队时的Erlang繁忙概率.

@PEL(A,X):返回当到达负荷(强度)为A,服务系统有X个服务器且不允许排队时的Erlang繁忙概率.

@PFS(A,X,C):返回当负荷上限为A,顾客数为C,并行服务器数量为X时,有限源的Poisson服务系统得等待顾客数的期望值.

@QRAND(SEED):返回0与1之间的多个拟均匀随机数,其中SEED为种子,默认时取当前计算机时间为种子.该函数只能用在数据段(DATA-ENDDATA).

@RAND(SEED):返回0与1之间的一个伪均匀随机数,其中SEED为种子.

八、文件输入输出函数

文件输入输出函数是指通过文件输入数据和输出结果的函数.主要有以下函数:

@FILE('filename'):这个函数提供LINGO与文本文件的接口,用于引用其它ASCII码或文本文件中的数据,其中filename为存放数据的文件名(包括路径,没有指定路径时表示当前目录),该文件中记录之间必须用符号“~”分开.主要用在集合段和数据段,通过文本文件输入数据.

@TEXT(['filename']):用于数据段中将解答结果送到文本文件filename中.

@ODBC(['data_source'[,'table_name'[,'col_1'[, 'col_2'...]]]]):这个函数提供LINGO与ODBC(open data base connection,开放式数据库连接)的接口,用于集合段和数据段中引用其它数据库数据或将解答结果送到数据库中.其中data_source是数据库名,table_name是数据表名,col_i是数据列名(数据域名).

@OLE('spreadsheet_file'[,range_name_list]):这个函数提供LINGO与OLE(object linking and embedding,对象链接与嵌入)的借口,用于集合段、数据段和初始段中输入和输出数据库.其中spreadsheet_file是文件名,range_name_list是文件中包含数据的

单元范围.

@POINTER(N):在Windows 下使用LINGO 的动态链接库(dynamic link library ,DLL ),直接从共享的内存中传送数据.

§3.4 LINGO 软件求解案例

一、生产管理问题

1.问题实例

某厂有5种设备A 1,A 2,…,A 5,用来加工7种零部件B 1,B 2,…,B 7,每种设备的数量、每种零部件的单位成本及所需各设备的加工工时(以小时计)见表1

表1

在其后的半年中,工厂有设备检修计划(停工检修时间一个月)见表2 表2

工厂在半年中有订单(必须按时交货)见表3 表3 每种零部件库存最多可到100件,现每种零部件有库存80件,库存费用每件每月为0.5元,,要求到六月底每种零部件有存货50件,每种零部件生产至少50件.

工厂每周工作5天,每天2班,每班8小时.

试回答如下问题:

(1) 工厂如何安排各月份各种零部件的加工数量? (2) 单位成本有10%的变化,对计划有什么影响? (3) 设备各增加1台对计划有什么的影响. 2.模型建立

设: ij a 为第j 种零部件在第i 种设备上的单位加工工时)7,,2,1,5,,2,1( ==j i ;

ik b 为第i 种设备在第k 月的数量)6,,2,1,5,,2,1( ==k i ; kj d 为第k 月第j 种零部件的顶单数量)7,,2,1,6,,2,1( ==j k ; j c 为第j 种零部件的单位收益)7,,2,1( =j ;

kj x 为第k 月第j 种零部件的生产数量)7,,2,1,6,,2,1( ==j k ; kj s 为第k 月末第j 种零部件的库存数量)7,,2,1,6,,2,1( ==j k ; 800=j s 为初始库存)7,,2,1( =j

假设每月以20天计,有以下模型:

?????????????==≥≥==≥=≤====-+===≤+-=====∑∑∑∑∑)

(7,,2,1,6,,2,1,0,07,,2,1,6,,2,1,50)(7,,2,1,100)(7,,2,1,50)(7,,2,1,6,,2,1,)(6,,2,1,5,,2,13205.0min

6(617

1

6

16

17

1

7

1

非负约束生产要求个月末的库存第种零部件的库存月第第种设备的有效工时月第第费用目标)

)(,库存约束 j k s x j k x j s j s j k d x s s k i b x a s

x c

kj kj kj kj

j

kj kj j k kj ik j kj ij k k j kj

j kj j

j k i k

3.模型求解

利用LINGO 软件计算,输入

model: sets:

cp/1..7/:c; yf/1..6/:; sb/1..5/:;

sl1(yf,cp):x,d,s; sl2(sb,cp):a;

sl3(sb,yf):b; endsets data:

a=0.5 0.7 0.0 0.0 0.3 0.2 0.5 0.1 0.2 0.0 0.3 0.0 0.6 0.0 0.2 0.0 0.8 0.0 0.0 0.0 0.6 0.05 0.03 0 0.07 0.1 0 0.08 0 0 0.01 0 0.05 0 0.05; b=3 4 4 4 3 4 2 2 1 1 1 2 3 1 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1;

d=250 500 150 150 400 100 100 300 250 100 0 200 150 100 150 300 0 0 250 200 100 100 150 200 250 100 0 100 0 100 250 100 500 150 0 250 250 100 300 550 250 100; c=100 60 80 40 110 90 30; enddata

min=@sum(sl1(k,j):c(j)*x(k,j)+0.5*s(k,j));

@for(yf(k):@for(sb(i):@sum(cp(j):a(i,j)*x(k,j))<=320*b(i,k))); @for(yf(k)|k#gt#1:@for(cp(j):s(k,j)=s(k-1,j)+x(k,j)-d(k,j))); @for(cp(j):s(1,j)=80+x(1,j)-d(1,j)); @for(cp(j):s(6,j)=50);

@for(sl1(k,j):s(k,j)<=100); @for(sl1(k,j):x(k,j)>=50); end

(1)计算结果有:

目标函数:590580 z

(2)目标的灵敏度分析:

Objective Coefficient Ranges(目标系数的灵敏度分析)

Current Allowable Allowable Variable Coefficient Increase Decrease 变量目前系数允许增加范围允许减少范围X( 1, 1) 100.0000 INFINITY 0.5000000 X( 1, 2) 60.00000 INFINITY 0.5000000

X( 1, 3) 80.00000 INFINITY 0.5000000

X( 1, 4) 40.00000 INFINITY 1.500000

X( 1, 5) 110.0000 INFINITY 0.5000000

X( 1, 6) 90.00000 INFINITY 0.5000000

X( 1, 7) 30.00000 INFINITY 0.5000000

X( 2, 1) 100.0000 0.5000000 0.5000000

X( 2, 2) 60.00000 0.5000000 0.5000000

X( 2, 3) 80.00000 0.5000000 1.000000

X( 2, 4) 40.00000 INFINITY 1.000000

X( 2, 5) 110.0000 0.5000000 0.5000000

X( 2, 6) 90.00000 0.5000000 0.5000000

X( 2, 7) 30.00000 0.5000000 0.5000000

X( 3, 1) 100.0000 0.5000000 0.5000000

X( 3, 2) 60.00000 0.5000000 0.5000000

X( 3, 3) 80.00000 INFINITY 0.5000000

X( 3, 4) 40.00000 INFINITY 0.5000000

X( 3, 5) 110.0000 0.5000000 0.5000000

X( 3, 6) 90.00000 0.5000000 1.000000

X( 3, 7) 30.00000 0.5000000 0.5000000

X( 4, 1) 100.0000 0.5000000 1.000000

X( 4, 2) 60.00000 0.5000000 0.5000000

X( 4, 3) 80.00000 0.5000000 0.5000000

X( 4, 4) 40.00000 0.5000000 0.5000000

X( 4, 5) 110.0000 0.5000000 0.5000000

X( 4, 6) 90.00000 INFINITY 0.5000000

X( 4, 7) 30.00000 0.5000000 1.000000

X( 5, 1) 100.0000 INFINITY 0.5000000

X( 5, 2) 60.00000 0.5000000 0.5000000

X( 5, 3) 80.00000 0.5000000 0.5000000

X( 5, 4) 40.00000 0.5000000 0.5000000

X( 5, 5) 110.0000 0.5000000 0.5000000

X( 5, 6) 90.00000 0.5000000 0.5000000

X( 5, 7) 30.00000 INFINITY 0.5000000

X( 6, 1) 100.0000 0.5000000 INFINITY

X( 6, 2) 60.00000 0.5000000 INFINITY

X( 6, 3) 80.00000 0.5000000 INFINITY

X( 6, 4) 40.00000 0.5000000 INFINITY

X( 6, 5) 110.0000 0.5000000 INFINITY

X( 6, 6) 90.00000 0.5000000 INFINITY

X( 6, 7) 30.00000 0.5000000 INFINITY 其中INFINITY是无穷.

从以上灵敏度分析可见,提高10%,有超出允许范围的,所以对计划有影响.

(3)约束条件的灵敏度分析:

Righthand Side Ranges(右边常数项的灵敏度分析)

Row Current Allowable Allowable

RHS Increase Decrease

行目前常数项允许增加范围允许减少范围

2 960.0000 INFINITY 450.0000

3 640.0000 INFINITY 488.0000

4 960.0000 INFINITY 840.0000

5 320.0000 INFINITY 258.0000

6 320.0000 INFINITY 300.8000

7 1280.000 INFINITY 836.0000

8 640.0000 INFINITY 473.0000

9 320.0000 INFINITY 138.0000

10 320.0000 INFINITY 268.4000

11 320.0000 INFINITY 305.5000

12 1280.000 INFINITY 830.0000

13 320.0000 INFINITY 110.0000

14 960.0000 INFINITY 830.0000

15 320.0000 INFINITY 267.0000

16 320.0000 INFINITY 302.0000

17 1280.000 INFINITY 1035.000

18 320.0000 INFINITY 205.0000

19 960.0000 INFINITY 760.0000

20 320.0000 INFINITY 282.0000

21 320.0000 INFINITY 308.5000

22 960.0000 INFINITY 670.0000

23 640.0000 INFINITY 525.0000

24 960.0000 INFINITY 720.0000

25 320.0000 INFINITY 253.5000

26 320.0000 INFINITY 290.0000

27 1280.000 INFINITY 655.0000

28 640.0000 INFINITY 270.0000

29 640.0000 INFINITY 410.0000

30 320.0000 INFINITY 206.0000

31 320.0000 INFINITY 283.5000 从以上灵敏度分析可见,提高1台,没有超出允许范围的,所以对计划没有影响.

也可以将数据与模型分离,先准备数据文件exam01.ldt:

!单耗;

0.5 0.7 0.0 0.0 0.3 0.2 0.5

0.1 0.2 0.0 0.3 0.0 0.6 0.0

0.2 0.0 0.8 0.0 0.0 0.0 0.6

0.05 0.03 0 0.07 0.1 0 0.08

0 0 0.01 0 0.05 0 0.05~

!设备数量;

3 4 4 4 3 4

2 2 1 1 1 2

3 1 3 3 3 2

1 1 1 1 1 1

1 1 1 1 1 1~

!需求;

250 500 150 150 400 100 100

300 250 100 0 200 150 100

150 300 0 0 250 200 100

100 150 200 250 100 0 100

0 100 250 100 500 150 0

250 250 100 300 550 250 100~

!单位成本;

100 60 80 40 110 90 30~

再写程序如下:

model:

sets:

cp/1..7/:c;

yf/1..6/:;

sb/1..5/:;

sl1(yf,cp):x,d,s;

sl2(sb,cp):a;

sl3(sb,yf):b;

endsets

data:

a=@file('exam01.ldt');

b=@file('exam01.ldt');

d=@file('exam01.ldt');

c=@file('exam01.ldt');

enddata

min=@sum(sl1(k,j):c(j)*x(k,j)+0.5*s(k,j));

@for(yf(k):@for(sb(i):@sum(cp(j):a(i,j)*x(k,j))<=320*b(i,k)));

@for (yf(k)|k#gt#1:@for (cp(j):s(k,j)=s(k-1,j)+x(k,j)-d(k,j))); @for (cp(j):s(1,j)=80+x(1,j)-d(1,j)); @for (cp(j):s(6,j)=50);

@for (sl1(k,j):s(k,j)<=100); @for (sl1(k,j):x(k,j)>=50); end

二、下料问题

1.问题实例

有某种材料一根长19米.现需用其切割4米长毛坯50根、5米长毛坯10根、6米长毛坯20根、8米长毛坯15根.如何切割使其用料最省?要求切割模式不能超过3种. 2.模型建立

设:4,3,2,1=i 分别表示4米长,5米长,6米长,8米长的毛坯;

i a 为第i 种毛坯的长度)4,3,2,1(=i ; i b 为第i 种毛坯的需要量)4,3,2,1(=i ;

j x 为第j 种切割模式所用的材料数量)3,2,1(=j ;

ij r 为第j 种切割模式切割第i 种毛坯的数量)3,2,1,4,3,2,1(==j i .

一种合理的切割模式应满足:其余料长度不应该大于或等于需要切割毛坯的最小长度.于是有模型如下

???????????==≥≥=≥=≤=≥=

∑∑∑∑====3

,2,1,4,3,2,1,0,0(3,2,1,16(3,2,1,19(4,3,2,1,(min 4

1

413

13

1

j i r x j r a j r a i b x r x

z ij j

i ij i i ij i i j j ij j j

且整数合理的下料模式所下毛坯的总长所下毛坯的需要量用料目标))))

3.模型求解

为了便于运算,我们先来缩小可行域.由于3种切割模式的排列顺序是无关紧要的,所以不妨增加以下约束:

321x x x ≥≥

又注意到用料的总量有明显的上界和下界.首先,无论如何,用料总量不可能少于

2619158206105504=??

?

????+?+?+?

其次,考虑一种特殊的下料计划:模式1:切割成4根4米钢管,需13根;模式2:切割成1根5米和2根6米钢管,需10根;模式3:切割成2根8米钢管,需8根.这样需要

13+10+8=31

于是可得到解的一个上界.所以又可增加约束:

3126321≤++≤x x x

利用LINGO 软件计算,输入 model: sets:

needs/1..4/:a,b; cuts/1..3/:x;

patterns(needs,cuts):r; endsets data: a=4 5 6 8; b=50 10 20 15; enddata

min=@sum(cuts(j):x(j));!用料目标;

@for(needs(i):@sum(cuts(j):x(j)*r(i,j))>b(i));!需要量要求; @for(cuts(j):@sum(needs(i):a(i)*r(i,j))<19);!材料总长; @for(cuts(j):@sum(needs(i):a(i)*r(i,j))>16);!合理模式; @sum(cuts(j):x(j))>26;!用料下限; @sum(cuts(j):x(j))<31;!用料上限;

@for(cuts(j)|j#lt#@size(cuts):x(j)>x(j+1));!人为约束; @for(cuts(j):@gin(x(j)));!整数约束;

@for(patterns(i,j):@gin(r(i,j)));!整数约束; end

经过LINGO 求解,得到输出如下:

Objective value: 28.00000 Variable Value Reduced Cost X( 1 ) 10.00000 0.000000

X( 2 ) 10.00000 2.000000

X( 3 ) 8.000000 1.000000

R( 1, 1) 3.000000 0.000000

R( 1, 2) 2.000000 0.000000

R( 1, 3) 0.000000 0.000000

R( 2, 1) 0.000000 0.000000

R( 2, 2) 1.000000 0.000000

R( 2, 3) 0.000000 0.000000

R( 3, 1) 1.000000 0.000000

R( 3, 2) 1.000000 0.000000

R( 3, 3) 0.000000 0.000000

R( 4, 1) 0.000000 0.000000

R( 4, 2) 0.000000 0.000000

R( 4, 3) 2.000000 0.000000

即按照模式1、2、3分别切割10、10、8根材料,使用材料总根数为28根.第一种切割模式下1根材料切割3根4米的和1根6米的;第二种切割模式下1根材料切割2根4米的、1根5米的和1根6米的;第三种切割模式下1根材料切割2根8米的.

三、投资组合问题

1.问题实例

有三种股票A,B,C,其前12年的价值每年的增长情况如表所示

表中还给出了相应年份的500种股票的价格指数的增长情况.假设目前你有一笔资金准备投资这三种股票,并期望年收益率达到15%,那么你应如何投资? 2.模型建立

设:3,2,1=i 分别表示表示A,B,C 三种股票;

i R 为第i 种股票的价值)3,2,1(=i ;

ij R 为第i 种股票第j 年的价值)12,,2,1,3,2,1( ==j i ; M 为指数;

j M 为第j 年的指数)12,,2,1( =j ;

i x 为投资第i 种股票比例)3,2,1(=i .

股票指数反映的是股票市场的大势信息,对每只股票的涨跌是有影响的.假设每只股票的收益与股票指数成线性关系.即

i i i i e M b a R ++=

12,,2,1,3,2,1, ==++=j i e M

b a R ij j

ij ij ij

其中ij ij b a ,是待定系数,ij e 是一个随机误差,其均值为0)(=ij e E ,方差为)(2

ij ij e D s =,此外假设随机误差ij e 与其他股票和股票指数都是独立的,所以0)()(==j ij kj ij M e E e e E .

先根据所给数据回归计算ij ij b a ,,即使误差的平方和最小:

3,2,1,||min

12

1

2

12

1

2

=-+=

∑∑==i R M

b a

e

j ij j

ij ij

j ij

可用Matlab 软件做该回归计算,也可用LINGO 软件分别来做每只股票的回归计算,输入 model: sets:

year/1..12/:M,R,a,b,e; endsets data:

R=1.300 1.103 1.216 0.954 0.929 1.056 1.038 1.089 1.090 1.083 1.035 1.176;

M=1.258997 1.197526 1.364361 0.919287 1.057080 1.055012 1.187925 1.317130 1.240164 1.183675 0.990108 1.526236; enddata

calc:

mean0=@sum(year(j):M(j))/@size(year);

s20=@sum(year(j):@sqr(M(j)-mean0))/(@size(year)-1); s0=@sqrt(s20); endcalc min=s2;

s2=@sum(year(j):@sqr(e(j)))/(@size(year)-2); s=@sqrt(s2);

@for(year(j):e(j)=R(j)-a-b*M(j)); @for(year(j):@free(e(j))); @free(a);@free(b);

End

对上面的程序,注意以下几点: (1)只给了一种股票的价值R ;

(2)在CALC 段直接计算了M 的均值mean0和方差s20以及标准差s0(为了使这个估计是无偏估计,分母是11而不是12);

(3)程序中用到平方函数@sqr 和平方根函数@sqrt ;

(4)除了计算回归系数外,同时估计了回归误差s2和标准差s ,为了使这个估计是无偏估计,分母是10而不是11和12,这是因为此时已经假设保持误差的均值为0,所以自由度又少了一个;

(5)@free(a),@free(b),@free(e)三个语句不能少,因为它们不一定是非负的; 运行这个LINGO 模型,结果为:

Objective value: 0.5748320E-02

Variable Value Reduced Cost MEAN0 1.191458 0.000000 S20 0.2873661E-01 0.000000 S0 0.1695188 0.000000 S2 0.5748320E-02 0.000000 S 0.7581767E-01 0.000000 A 0.5639761 0.000000 B 0.4407264 0.000000

也就是说:M 的均值191458.10=m ,方差02873661.020=s ,标准差1695188.00=s ,

对股票A ,回归系数5639761.01=a ,4407264.01=b ,误差的方差005748320.02

1=s ,

误差的标准差07581767.01=s .

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基本用法(精华版)20分钟学会ling↘.pdf

Lingo基本用法总结(除集函数部分)LINGO是用来求解线性和非线性优化问题的简易工具。Lingo免费版可以支持30个未知数,lingo破解版可以支持几万个未知数、几万个约束条件。 当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO中求解如下的LP问题: 在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮即可。 得到如下结果:

所以当x1为250,x2为100时目标函数得到最大值。 ?算术运算符 Lingo中变量不区分大小写,以字母开头不超过32个字符 算术运算符是针对数值进行操作的。LINGO提供了5种二元运算符: ^乘方﹡乘/除﹢加﹣减 LINGO唯一的一元算术运算符是取反函数“﹣”。 这些运算符的优先级由高到底为: 高﹣(取反) ^ ﹡/ 低﹢﹣ 运算符的运算次序为从左到右按优先级高低来执行。运算的次序可以用圆括号“()” 来改变。

例:在x1+x2>=350,x1>=100,2*x1+x2<=600的条件下求2*x1+3*x2的最小值 在代码窗口中编写 min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后单击上面菜单lingo菜单下solve键即可。 ?数学函数 标准数学函数: @abs(x) 返回x的绝对值 @sin(x) 返回x的正弦值,x采用弧度制 @cos(x) 返回x的余弦值 @tan(x) 返回x的正切值 @exp(x) 返回常数e的x次方 @log(x) 返回x的自然对数 @lgm(x) 返回x的gamma函数的自然对数 @sign(x) 如果x<0返回-1;否则,返回1 @floor(x) 返回x的整数部分。当x>=0时,返回不超过x的最大整数;当 x<0时,返回不低于x的最大整数。 最大最小函数: @smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值 @smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值 边界限定函数: @bin(x) 限制x为0或1 @bnd(L,x,U) 限制L≤x≤U @free(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数@gin(x) 限制x为整数 辅助函数 1.@if(logical_condition,true_result,false_result) @if函数将评价一个逻辑表达式logical_condition,如果为真,返回true_ result,否则返回false_result 在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。@free取消了默认的下界为0的限制,使变量也可以取负值。@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。 例:求x1^2+3*x2-x1*x2+e^x3在 x1+x2>=350;x1+x3<50;2*x1+x2+x3<=600;x1只能取0或1;x2为整数的条件下的最小值。 在代码窗口中编写 min=x1^2+3*x2-x1*x2+@exp(x3); x1+x2>=350; x1+x3<50; 2*x1+x2+x3<=600; @bin(x1);@gin(x2);

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 ingo对于一些线性或者非线性的规划,优化问题非常有效 首先介绍一下,在lingo中运行程序时出现的页面(在工具栏点击类似靶子一样的图标便可运行) Solver status:求解器(求解程序)状态框 Model Class:当前模型的类型:LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP(以I开头表示IP,以PI 开头表示PIP) State:当前解的状态:"Global Optimum", "LocalOptimum", "Feasible", "Infeasible“(不可行), "Unbounded “(无界), "Interrupted“(中断), "Undetermined“(未确定) Object:解的目标函数值 Infeasibility:当前约束不满足的总量(不是不满足的约束的个数):实数(即使该值=0,当前解也可能不可行,因为这个量中没有考虑用上下界命令形式给出的约束) Iteration:目前为止的迭代次数 Extend solverstatus:扩展的求解器(求解程序)状态框 Solver type:使用的特殊求解程序: Bestobj :目前为止找到的可行解的最佳目标函数值 Objbound:目标函数值的界 Steps:特殊求解程序当前运行步数: Active:有效步数 Variables(变量数量): 变量总数(Total)、 非线性变量数(Nonlinear)、 整数变量数(Integer)。 Constraints(约束数量): 约束总数(Total)、

非线性约束个数(Nonlinear)。 Nonzeros(非零系数数量): 总数(Total)、 非线性项系数个数(Nonlinear)。 GeneratorMemory Used (K) (内存使用量) ElapsedRuntime (hh:mm:ss)(求解花费的时间) 运行之后页面介绍(这里的运行界面并不是与上面的运行过程中出现界面一致,即并非来自于同一个程序运行出现) 第一行表示在经过457次迭代后得到局部最优解 第二行给出该局部最优解的具体值 下面给出取局部最优值时,x1 x2的具体取值 这里求解的是局部最优解,如果想求出全局最优解,可以进行页面设置:lingo --> option --> global solver --> 勾选use global solver 对于运行结果也可以另存为,格式一般为ldt,因为有时候对于求解一个问题,或许需要运行很久才可以得出结果,所以没必要每次为了看结果都运行,而是运行成功一次后便把结果保存下来 注意事项 LINGO总是根据“MAX=”或“MIN=”寻找目标函数;

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中使用集合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软件简介

LINGO 软件简介 LINGO 软件是一个处理优化问题的专门软件,它尤其擅长求解线性规划、非线性规划、整 数规划等问题。 一个简单示例 有如下一个混合非线性规划问题: ?????≥≤≤+++---+为整数 213 212 13213 2 2212121,;0,,210022..15023.027798max x x x x x x x x x x t s x x x x x x x 。 LINGO 程序(模型): max =98*x1+277*x2-x1^*x1*x2-2*x2^2+150*x3; x1+2*x2+2*x3<=100; x1<=2*x2; @gin (x1);@gin (x2);! Lingo 默认变量非负 (注意:@bin(x)表示x 是0-1变量;@gin(x)表示x 是整数变量;@bnd(L,x,U)表示 限制LxU ;@free(x)表示取消对x 的符号限制,即可正、可负。) 结果: Global optimal solution found. Objective value: Extended solver steps: 0 Total solver iterations: 45 Variable Value Reduced Cost X1 X2 X3 Row Slack or Surplus Dual Price 1 2 3 ———————— 非常简单! 在LINGO 中使用集合 为了方便地表示大规模的规划问题,减少模型、数据表示的复杂程度,LINGO 引进了“集合”的用法,实现了变量、系数的数组化(下标)表示。 例如:对?? ? ??? ? ==-++-==≤++∑=.,,;10)0(;4,3,2,1),()())()1()(;4,3,2,1,20)(..)} (20)(450)(400{min 4 ,3,2,1均非负INV OP RP INV I I DEM I OP I RP I INV I INV I I RP t s I INV I OP I RP I 求解程序: model : sets : mark/1,2,3,4/:dem,rp,op,inv;!也可以vmark/1..4/:dem,rp,op,inv;

LINGO软件及其应用

LINGO 软件及其应用 一、求解线性规划 例题1:目标函数:max z=2x1+3x2 约束条件:x1+2x2<=8 4x1<=17 4x2<=13 x1,x2>=0 输入语句: model: max=2*x1+3*x2; x1+2*x2<8; 4*x1<17; 4*x2<13; end 说明: 1)问题模型由MODEL:命令开始,END 结束,对简单模型可以省略。 2)目标函数必须由“min =”或“max =”开头。 3)分号是LINGO的分隔符。LINGO中的每一行都以分号结束,如果缺少,模型将无法求解。若一个命令或语句一行写不下,可以分多行写,但是,最后结束命令时,一定别忘了打个分号“;”,一行内也可写多个命令,只要每个用分号分开即可。 4)语句中乘号(*)不能省略,支持()的输入。 5)LINGO中<与<=均代表<=,>与>=也均代表>=。 6)LINGO中的注解必须用感叹号“!”开始,用分号结束。在感叹号和分号之间的所有内容都将被LINGO忽略。注释可以占据多行,也可以插入LINGO 表达式之中。 7)LINGO的命令从来不区分大小写,当你在LINGO中定义变量时,每个变量都要以26个字母开始,后面可跟数字或者下划线,最多可以是32个字符。 8)软件默认决策变量是非负的。如果需要一个变量取负数、整数或一定范

围内的值,可以通过变量限定函数加以限制。 @bin(x) 限制x为0或1 @bnd(L,x,U) 限制L≤x≤U @free(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数 @gin(x) 限制x为整数 在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。@free取消了默认的下界为0的限制,使变量也可以取负值。@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。 求解结果如下: Global optimal solution found. Objective value: 14.12500 Total solver iterations: 1 Variable Value Reduced Cost X1 4.250000 0.000000 X2 1.875000 0.000000 Row Slack or Surplus Dual Price 1 14.12500 1.000000 2 0.000000 1.500000 3 0.000000 0.1250000 4 5.500000 0.000000 例题2 一奶制品加工厂用牛奶生产A 1,A 2 两种奶制品,1桶牛奶可以在甲车 间用12小时加工成3公斤A 1,或者在乙车间用8小时加工成4公斤A 2 。根据市 场需求,生产的A 1,A 2 全部能售出,且每公斤A 1 获利24元,每公斤A 2 获利16元。 现在加工厂每天能得到50桶牛奶的供应,每天正式工人总的劳动时间480小时,并且甲车间每天至多能加工100公斤A 1 ,乙车间的加工能力没有限制。试为该厂制订一个生产计划,使每天获利最大,并进一步讨论以下3个附加问题:1)若用35元可以买到1桶牛奶,应否作这项投资?若投资,每天最多购买多少桶牛奶?

LINGO软件简介

LINGO 软件简介 LINGO 软件是一个处理优化问题的专门软件,它尤其擅长求解线性规划、非线性规划、整数规划等问题。 一个简单示例 有如下一个混合非线性规划问题: ?????≥≤≤+++---+为整数 213 212 13213 2 2212121,;0,,210022..15023.027798max x x x x x x x x x x t s x x x x x x x 。 LINGO 程序(模型): max =98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2+150*x3; x1+2*x2+2*x3<=100; x1<=2*x2; @gin (x1);@gin (x2);! Lingo 默认变量非负 (注意:@bin(x)表示x 是0-1变量;@gin(x)表示x 是整数变量;@bnd(L,x,U)表示 限制L ≤x ≤U ;@free(x)表示取消对x 的符号限制,即可正、可负。) 结果: Global optimal solution found. Objective value: 9561.200 Extended solver steps: 0 Total solver iterations: 45 Variable Value Reduced Cost X1 6.000000 -76.70000 X2 31.00000 -151.2000 X3 16.00000 -150.0000 Row Slack or Surplus Dual Price 1 9561.200 1.000000 2 0.000000 0.000000 3 56.00000 0.000000 ———————— 非常简单! 在LINGO 中使用集合 为了方便地表示大规模的规划问题,减少模型、数据表示的复杂程度,LINGO 引进了“集合”的用法,实现了变量、系数的数组化(下标)表示。

Lingo的基本用法

LINGO的基本用法 一.集合的基本用法 集合(set)及其属性(attribute)的概念 基本集合与派生集合 集合名[/元素列表/][:属性列表]; 集合名(父集合列表)[/元素列表/][:属性列表]; 稠密集合与稀疏集合 元素过滤法 基本集合的隐式列举法: 数字型 1..n 字符数字型Car101..Car208 日期型MON..FRI 月份型OCT..JAN 年月型OCT2007..JAN2008 二.模型结构 (1)集合段从“sets:”到“endsets” (2)数据输入段从“data:”到“enddata” 属性=常数列表 (3)目标和约束段 MIN=表达式 (4)计算段从“calc:”到“endcalc”,对原始数据的计算处理 (5)初始段从“init:”到“endinit”,定义迭代初值用 属性=常数列表 (6)注释从感叹号到分号 三.函数 基本数学函数 @ABS(X) @COS(X) @EXP(X) @FLOOR(X) @LGM(X) @LOG(X) @MOD(X,Y) @POW(X,Y) @SIGN(X) @SIN(X) @SMAX(list) @SMIN(list) @SQR(X) @SQRT(X) @TAN(X) 其中@LGM(X) =ln(X-1)! 集合循环函数 @FOR @MIX @MIN @PROD @SUM 用法:集合函数名(集合名(集合索引列表)|条件:表达式组) 集合操作函数 @IN @IN(集合名,集合元素名,…集合元素名) @INDEX @INDEX(集合名,集合元素名)

@WRAP @WRAP(i,N),循环计数 @SIZE @SIZE(集合名) 变量定界函数 @BND(L,X,U) @BIN(X) @FREE(X) @GIN(X) 分别对变量取值限制:上下界,0-1值,取消非负限制,整数 概率分布函数 @PNS(X) 标准正态分布@PSL(X) 正态线性损失 @PBN(P,N,X) 二项分布@PHG 超几何分布 @PTD(N,X) t分布@PFD(N,D,X) F分布 @PPS(A,X) 泊松分布@PPL(A,X) 泊松线性损失 @PCX(N,X) X平方分布@RAND(seed) 随机数 服务系统函数 @PEL(A,X) @PFS(A,X,C) @PEB(A,X) 文件输入输出函数 @FILE(fn) @TEXT(…fn?) @OLE 结果报告函数 @ITERS() 返回迭代次数 @NEWLINE(n) 输出n个新行 @STRLEN(string) 返回字符串的长度 @NAME(reference) 返回变量名或行名 @WRITE 用于数据段,输出变量,字符串或换行 @WRITEFOR 是@WRITE在循环情况下的推广 @FORMAT 以格式描述符方式输出数值 @DUAL(varname) 返回解答中变量的判别数或结束行的影子价格@STATUS() 返回求解后的最后状态 其他函数 @IF @IF(条件,true结果,false结果) @WARN @WARN(‘text’,条件) @USER @USER(用户编写的函数dll或obj文件) 四.文件传输 通过文本文件传输数据 @FILE和@TEXT 通过Excel文件传输数据 @OLE

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软件使用教程

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;

第1讲 Lingo软件入门(2014)

第1讲Lingo软件入门 司守奎 烟台市,海军航空工程学院数学教研室 Email:sishoukui@https://www.360docs.net/doc/869192064.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软件简介

L I N G O软件简介 Document number:BGCG-0857-BTDO-0089-2022

LINGO 软件简介 LINGO 软件是一个处理优化问题的专门软件,它尤其擅长求解线性 规划、非线性规划、整数规划等问题。 一个简单示例 有如下一个混合非线性规划问题: ?????≥≤≤+++---+为整数 213 212 13213 2 2212121,;0,,210022..15023.027798max x x x x x x x x x x t s x x x x x x x 。 LINGO 程序(模型): max =98*x1+277*x2-x1^2-0.3*x1*x2- 2*x2^2+150*x3; x1+2*x2+2*x3<=100; x1<=2*x2; @gin (x1);@gin (x2);! Lingo 默认变量非负 (注意:@bin(x)表示x 是0-1变量;@gin(x)表示x 是整数变量;@bnd(L,x,U)表示限制L?x?U ;@free(x)表示取消对x 的符号限制,即可正、可负。) 结果: Global optimal solution found. Objective value: 9561.200 Extended solver steps: 0 Total solver iterations: 45

Variable Value Reduced Cost X1 6.000000 -76.70000 X2 31.00000 -151.2000 X3 16.00000 -150.0000 Row Slack or Surplus Dual Price 1 9561.200 1.000000 2 0.000000 0.000000 3 56.00000 0.000000 ————————非常简单! 在LINGO中使用集合 为了方便地表示大规模的规划问题,减少模型、数据表示的复杂程度,LINGO引进了“集合”的用法,实现了变量、系数的数组化(下标)表示。

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求解模型之前为其指定

相关文档
最新文档