学习LINGO语言课件_第1页
学习LINGO语言课件_第2页
学习LINGO语言课件_第3页
学习LINGO语言课件_第4页
学习LINGO语言课件_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

LINGO

*一.优化模型与优化软件简介二.LINGO软件的基本使用方法Outline三.LINGO程序流程控制和子模型

*一.优化模型与优化软件简介*约束条件决策变量优化问题的一般形式目标函数无约束优化:只有目标函数,没有约束条件有约束优化:目标函数和约束条件都有普通方程组:没有(1)(3),只有(2)不等式方程组:没有(1)(2),只有(3)*优化类型连续优化:全部决策变量取值均为连续数值(实数)离散优化:部分或全部决策变量只取离散数值*连续优化

线性规划(LP)

目标和约束均为线性函数非线性规划(NLP)

目标或约束中有非线性函数二次规划(QP)

目标为二次函数、约束为线性*离散优化

整数规划(IP)

决策变量(全部或部分)为整数

整数线性规划(ILP),整数非线性规划(INLP)

纯整数规划(PIP),混合整数规划(MIP)

一般整数规划,0-1(整数)规划*常用优化软件

LINDO/LINGO软件MATLAB优化工具箱/mathematica优化程序包EXCEL软件的优化功能SAS(统计分析)软件的优化功能*建模时需要注意的几个基本问题

1、尽量使用实数优化,减少整数约束和整数变量2、尽量使用光滑优化,减少非光滑约束的个数如:尽量少使用绝对值、符号函数、多个变量求最大/最小值、四舍五入、取整函数等*建模时需要注意的几个基本问题

3、尽量使用线性模型,减少非线性约束和非线性变量的个数(如x/y<5

改为x<5y)4、合理设定变量上下界,尽可能给出变量初始值5、模型中使用的参数数量级要适当(如小于103)*二.LINGO软件的基本使用方法*§1LINGO入门*max2x1+3x2

St.4x1+3x2<=103x1+5x2<=12x1≥0x2≥0目标函数约束条件决策变量设有数学模型如下:*第一步:启动Lingo屏幕显示如下:标记LINGO的外窗口是主框架窗口,主框架窗口的上面包含所有的命令菜单和命令工具栏;标记LINGOMODEL-LINGO1的子窗口是一个新的、空白的模型窗口。*第二步:在模型窗口中输入模型model:max=2*x1+3*x2;4*x1+3*x2<10;3*x1+5*x2<12;endMax2x1+3x2St.4x1+3x2<=103x1+5x2<=12x1≥0x2≥0*第三步:求解模型1)选择菜单

LINGO|Solve

或者按工具栏的

*2)LINGO开始编译模型,如有语法错误将返回一个错误的消息并指明错误出现的位置;如果通过编译,LINGO将激活Solver运算器

寻求模型的最优解;*3)首先出现solverstatus窗口,其作用是监控solver的进展和显示模型的维数等信息;*SolverStatus窗口*4)计算完成后出现SolutionReport窗口显示模型解的详细信息;*SolutionReport窗口Globaloptimalsolutionfoundatiteration:2Objectivevalue:7.454545VariableValueReducedCost

x11.2727270.000000

x21.6363640.000000RowSlackorSurplusDualPrice17.4545451.00000020.0000000.9090909E-0130.0000000.5454545*ReducedCost:在max模型中:

相应变量的

reducedcost值表示当该变量每增加一个单位时目标函数减少的量。本例中此值均为0*ReducedCost:ReducedCost值列出最优单纯形表中判别数所在行的变量的系数,表示当变量有微小变动时,目标函数的变化率。其中基变量的reducedcost值应为0,对于非基变量Xj,相应的reducedcost值表示当某个变量Xj增加一个单位时目标函数减少的量(max型问题)。本例中此值均为0。*SLACKORSURPLUS:

给出约束条件的松驰变量或剩余变量的值;小于等于约束为松驰变量(SLACK);+

大于等于约束为剩余变量(SURPLUS);-*DUALPRICES:对偶价格或影子价格

DUALPRICES表示当对应约束有微小变动时,目标函数的变化率,即约束条件右端的常数项每增加一个单位,目标函数相应获得的改变量。显然,如果在最优解处约束正好取等号(紧约束),该值才可能不是0;对于非紧约束对该值必为0,表示对应约束中不等式右端项的微小扰动不影响目标函数。*§2Lingo的基本用法注意事项*1)每一个模型都以

model:

开始,又以

end

结束,也可省略此结构;*2)目标函数必须由

min=

max=

开头。*3)可以用<表示<=;

用>表示>=;Lingo无严格小于,欲使a<b,可以适当选取小的正常数e

表示成a+e<b,*4)LINGO的每一语句以

;

结束;5)注释以!开始,以;

结束;*变量名:

.不区分大小写

.由字母数字下划线组成

.第一个字符必须是字母

.变量名最长为32个字符*LINGO编辑器用蓝色显示LINGO关键字

绿色显示注释其他文本用黑色

匹配的括号用红色高亮度显示*8)变量和数字放在约束条件的左、右端均可;

但最好变量在左,数字在右。9)Lingo变量默认域为非负实数,可以改变默认域.*10)行名[name]

例:

[Objective]max=2*x+3*y;

[Con1]4*x+3*y<10;

[Con2]3*x+5*y<12;

线性规划(行名).lg4

默认为[1],[2],[3]*Globaloptimalsolutionfound.Objectivevalue:7.454545Totalsolveriterations:2VariableValueReducedCostX1.2727270.000000Y1.6363640.000000RowSlackorSurplusDualPrice

OBJECTIVE7.4545451.000000

CON10.0000000.9090909E-01

CON2

0.0000000.5454545*§3LINGO的建模语言*以运输实例逐步分析6个仓库向8个小贩供应同一种货物,如何运,总运输费用最小?注:每个仓库可以向每个小贩供货,一共48个可能运货路线。仓库货存量、小贩需求量、每条路线的单位运输费用三个表如下:*仓库货存量:capacity*小贩需求量:demand*每单位货物运输费用表:cost*demand_j表示第j个小贩的需求量capacity_i

表示第i个仓库的库存量cost_i_j表示从第i个仓库到第j个小贩的单位运输费用已知数量决策变量volume_i_j

表示从第i个仓库到第j个小贩的运输量*数学模型可表示如下:*当然目标函数可以如下输入:min=6*volume_1_1+

2*volume_1_2+

6*volume_1_3+...

1*volume_6_6+

4*volume_6_7+

3*volume_6_8;*

但是较大模型如果像上面那样输入又费时,又容易出错!这就需要LINGO的建模语言*LINGO的建模语言优点:1)可以用类似于标准数学符号的方式表示你的模型;2)可以用一个紧凑的语句表示一系列约束。3)数据可独立于模型:LINGO可以从文本文件、电子数据表、数据库中读取数据。*LINGO模型的构成:5个段

目标函数与约束条件段集合段(sets:endsets)数据段(data:enddata)初始段(init:endinit)计算段(calc:endcalc)Lingo建模语言的重点和难点是:对集合概念的理解和正确使用*为什么使用集合

集合是LINGO建模语言的基础,是LINGO程序设计最强有力的基本构件。借助于集合,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。*什么是集合

集合是一群相联系的对象,比如仓库、小贩、运输路线,这些对象也称为集合的成员。每个集合成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于LINGO求解。*从我们的数学模型看需要三个集合:(1)仓库-6个成员-货存量(2)小贩-8个成员-需求量(3)运输路线-48个成员

-单位运费和运货量*LINGO有两种类型的集合原始集合(primitiveset):由一些最基本的对象组成的。

派生集(derivedset):用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。***下面我们学习集合定义部分**1.以sets:开始,以endsets结束;

sets:…endsets*2.原始集合定义法:setname[/member_list/][:attribute_list];。setname是集合的名字;。member_list是成员列表,各成员之间可用空格或逗号分隔;。attribute_list是集合成员所具有的属性列表,多个属性之间用逗号分隔;。原始集合的member_list,attribute_list是可选项;**仓库和小贩的集合可如下定义*sets:

warehouses

/w1w2w3w4w5w6/:

capacity;

vendors

/v1,v2,v3,v4,v5,v6,v7,v8/:demand;endsets**成员较多时,可使用隐式成员列表setname/member1..memberN/

[:attribute_list];*数字型字符数字型星期型月份型年份-月份型*隐式成员列表类别**(1)数字型1..n

例:1..5(1,2,3,4,5)(2)字符数字型stringM..stringN例:truck3..truck34*(3)星期型dayM..dayN例:mon..fri(Mon,Tue,Wed,Thu,Fri)(4)月份型MonthM..MonthN例:OCT..JAN(Oct,Nov,Dec,Jan)*(5)年份-月份型monthYearM..monthYearN例:OCT2001..JAN2002

(2001.102001.112001.122002.1)**仓库和小贩的集合也可如下定义*sets:

warehouses

/w1..w6/:

capacity;

vendors

/v1..v8/:

demand;endsets*3.派生集合定义法:setname(parent_set_list)[/member_list/][:attribute_list];parent_set_list是父集合名列表**48条运输路线集合定义*links(warehouses,vendors):cost,volume;**三个集合定义如下*sets:

warehouses/wh1..wh6/:capacity;

vendors/v1..v8/:demand;

links(warehouses,vendors):

cost,volume;endsets*运输问题的三个集合说明:这段代码定义了4个属性值,在接下来的模型中就可以使用属性值capacity(1),capacity(2),…,capacity(6);demand(1),demand(2),…,demand(8);cost(1,1),cost(1,2),…,cost(1,8),cost(2,1),cost(2,2),…,cost(2,8),…,cost(6,1),cost(6,2),…,cost(6,8);volume的引用同cost。*4.集合成员过滤:trucks/1..100/:capacity;heavy_duty(trucks)|capacity(&1)#gt#50000

:;&1是集合索引号放置器,如果有两个父集合,就是&1,&2***下面我们学习数据定义**以data:开始,以enddata结束;

data:..enddata*例如:设有如下集合sets:

set1/a,b,c/:x,y;endsets如果想赋值

x(1)=1,x(2)=2,x(3)=3,y(1)=4,y(2)=5,y(3)=6,则数据段可以为*data:x=1,2,3;y=456;enddatadata:x,y=142536;enddata

多个数据之间可用逗号或空格分隔

*若成员属性值相同,数据段定义如下:data:x=3;!(所有成员的x=3);y=6;!(所有成员的y=6);enddata

*也可以在运行时输入属性值:data:x=?;

!(运行时输入所有成员的x值);y=6;enddata**运输问题的数据部分*data:capacity=60,55,51,43,41,52;demand=3537223241324338;*cost=626742594953858252197433767392712395726555228143;enddata*sets:

sett:x,y;endsetsdata:sett,x,y=a14b25c36;enddata

sets:

sett/a,b,c/:x,y;endsetsdata:x=123;y=456;enddata

集合成员可以在数据段定义:*运输实例:sets:warehouses:capacity;endsetsdata:!可以写成warehouses=w1..w6;!也可以同时定义集合成员列表和属性值;

warehouses,capacity=w160,w255,w351,w443,w541,w652;enddata***初始化定义**

只在非线性规划中使用,指定初始值。

init:..endinit*

例:init:

x=0.999;y=0.002;

endinity<=@log(x);x^2+y^2<=1;给了恰当的初始值,会减少运算时间。***计算段定义**calc:...endcalc计算段的作用:在模型输入后,LINGO开始正式求解模型之前对原始数据进行一定的计算,得到我们模型中要使用的部分数据。*一个简单的计算段例子:model:data:x,y,z=1,2,3;enddatacalc:avg=(x+y+z)/3;endcalcend***目标函数和约束条件段**LINGO提供了集合循环函数和集合操作函数使得目标函数和约束条件的书写如同数学公式那样简单。四个集合循环函数FOR、SUM

、MAX、MIN*@sum(

setname

[(set_index_list)[|condition]]

:expression);求和**运输问题的目标函数*min=@sum(links(i,j):

cost(i,j)*volume(i,j));min=@sum(links:

cost*volume);**运输问题实例中的求和*!从6个仓库发到第j个小贩的货物量总和;@sum(warehouses(i):

volume(i,j));*从第i个仓库发出到8个小贩的货物量总和;@sum(vendors(j):

volume(i,j))*@for

(setname

[(set_index_list)[|condition]]

:expression_list);

生成约束@for

对集合setname中的每个成员独立地生成约束,约束由约束表达式列表expression_list描述;多个表达式之间用分号相隔。**每个小贩的需求约束*!(要求6个仓库发给每个小贩的货物总量=小贩的需求量);@for(vendors(j):

@sum(warehouses(i):volume(i,j))

=demand(j));**每个仓库的供货约束*@for(warehouses(i):

@sum(vendors(j):volume(i,j))<capacity(i)

);!(要求每个仓库发给8个小贩的货物总量<仓库的货存量);*返回集合setname上的表达式expression的最大值@max

(setname

[(set_index_list)

[|condition]]

:expression);*@min

(

setname

[(set_index_list)

[|condition]]

:expression

);

返回集合setname上的表达式expression的最小值*

返回数据集setname中成员element的位置号(下标)*集合操作函数*@index([setname,]element)*model:sets:girls/debbie,sue,alice/:;boys/bob,joe,sue,fred/:;endsetscalc:x=@index(boys,sue);y=@index(sue);endcalcend*@in(set_name,

primitive_index_1

[,primitive_index_2…])

如果数据集set_name中包含成员primitive_index_1则返回1,否则返回0。*例:model:sets:plants/a,b,c,d/:;closed(plants)/b/:;open(plants)|#not#@in(closed,&1):x;endsetsdata:x=1,2,3;enddataend*

例2:model:sets:s1/abc/:;s2/xyz/:;s3(s1,s2)/a,xa,zb,yc,z/:;endsetscalc:x=@in(s3,@index(s1,b),@index(s2,y));endcalcend

本例要判断集合s3中是否包含元素(b,y),运行LINGO|SOLVE得到x=1,说明包含。*@wrap(index,limit)

当index位于区间[1,limit]时返回index,否则返回j=index-k*limit,其中j位于区间[1,limit]*职员时序安排模型

一项工作一周7天都需要有人(比如护士工作),每天(周一至周日)所需的最少职员数为20、16、13、16、19、14和12,并要求每个职员一周连续工作5天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。*sets:days/mon..sun/:required,start;endsetsdata:required=20161316191412;enddatamin=@sum(days:start);!最小化每周所需职员数;@for(days(j):@sum(days(i)|i#le#5:start(@wrap(j+i+2,7)))>=required(j));*@size(setname)

返回集合setname中所包含的成员个数。*第二章

LINGO与其它软件交换数据*拷贝、粘贴FromExelPastefromexel.lg4*

输入输出函数用来与外部数据源连接

@text()、@ole()、@file()、@odbc()、@dual()*@file(‘filename’)在模型的集合和数据部分使用,从文本文件输入数据.*sets:warehouses/@file(‘1.txt’)/:capacity;vendors/@file(‘1.txt’)/:demand;links(warehouses,vendors):cost,volume;endsets

运输实例的数据可以从文本文件输入:*data:capacity=@file('1.txt');demand=@file('1.txt');cost=@file('1.txt');enddata1.txt文件内容1.txt*@text(‘filename’)

在模型的数据部分使用,向文本文件输出数据.Outputtotext.lg4*@ole(‘spreadsheet_file’

[,range_name_list])

在模型的数据和集合部分使用,与excel交换数据*运输实例的数据可以从Excel输入:sets:

warehouses:capacity;vendors:demand;links(warehouses,vendors):cost,volume;endsets*data:

warehouses,vendors,capacity,demand,cost

=@ole(

‘2.xls’,

‘warehouses’,

‘vendors’,

‘capacity’,

‘demand’,

‘cost’);

enddata*在Excel中定义单元格范围名称的方法:①按鼠标左键拖曳选择单元格范围,②释放鼠标按钮,③选择“插入|名称|定义”,④输入希望的名字,⑤点击“确定”按钮。*2.xls

从Excel输入数据.lg4*@odbc(['data_source'[,'table_name'[,col_1'[,'col_2'...]]]]

)

在模型的数据部分使用,与数据库进行数据传输*运输实例的数据可以从数据库输入:sets:

warehouses:capacity;vendors:demand;links(warehouses,vendors):cost,volume;endsets*data:

warehouses,capacity=@odbc();

vendors,demand=@odbc();

links,cost=@odbc();

@odbc()=volume;

enddata*trans.mdb

与数据库的数据传递.lg4*第三章

LINGO的内部函数*1.标准运算符•算术运算符:

^*/+-•逻辑运算符:

#EQ##NE##GE##GT##LE##LT##NOT##AND##OR#*•关系运算符:

=<=>=

可以用<表示<=或<*运算符的优先级*lingo变量默认域为非负实数@free(variable)

取消默认域,使变量可以取任意实数@gin(variable)限制变量取整数值@bin(variable)限制变量取值为0,1@bnd(low,variable,up)

限制变量于一个有限的范围3.变量界定函数*练习1x1=2,

x2=3,Z*=-17练习1*练习2X1=1X2=0X3=1Z=8练习2*@abs(x)、@cos(x)、@sin(x)、@tan(x)、@exp(x)、@sign(x)@floor(x)(返回x的整数部分)@smax(x1,x2,…,xn)(返回x1,x2,…,xn的最大值)@smin(x1,x2,…,xn)4.数学函数*5.条件控制@if(logical_condition,true_result,false_result)计算logical_condition,若真返回true_result否则返回false_result.*7个选项卡(可设置80-90个控制参数)*范例

*整数规划整数规划.lg4*二次规划的例子(lingo).lg4*递规调用.lg4

已知,求a[7]

*

学习方法:(1)上课各位老师讲的每个有数据的规划模型上机用lingo语言实践;(2)LINGO的help下有一项AdditionalExamplesofLINGOModeling,可以仔细研究每个例子的模型。*某车间有甲、乙两台机床,可用于加工三种工件。假定这两台车床的可用台时数分别为800和900,三种工件的数量分别为400、600和500,且已知用三种不同车床加工单位数量不同工件所需的台时数和加工费用如下表。问怎样分配车床的加工任务,才能既满足加工工件的要求,又使加工费用最低?

练习3*

练习3*解1

设在甲车床上加工工件1、2、3的数量为x1、x2、x3,在乙车床上加工工件1、2、3的数量分别为x4、x5、x6。可建立以下线性规划模型:

*解2

设在甲车床上加工工件i的数量为x(i),单位工件所需加工台时数为timex(i),单位工件的加工费用为costx(i),在乙车床上加工工件i的数量为y(i),单位工件所需加工台时数为timey(i)单位工件的加工费用为costy(i)工件i的加工数量为demand(i)*数学模型*Lingo建模sets:Chechuang/1..3/:costx,costy,timex,timey,x,y,demand;endsets*Lingo建模min=@sum(chechuang:costx*x+costy*y)@sum(chechuang:timex*x)<800;@sum(chechuang:timey*y)<900;@for(chechuang:x+y=demand);@for(chechuang:@gin(x);@gin(y));*data:costx=13,9,10;costy=11,12,8;timex=0.4,1.1,1;timey=0.5,1.2,1.3;demand=400,600,500;enddata练习3*Lingo-Generate-DisplaymodelMODEL:[_1]MIN=13*X_1+11*Y_1+9*X_2+12*Y_2+10*X_3+8*Y_3;[_2]0.4*X_1+1.1*X_2+X_3<=800;[_3]0.5*Y_1+1.2*Y_2+1.3*Y_3<=900;[_4]X_1+Y_1=400;[_5]X_2+Y_2=600;[_6]X_3+Y_3=500;@GIN(X_1);@GIN(Y_1);@GIN(X_2);@GIN(Y_2);@GIN(X_3);@GIN(Y_3);END*练习4---求S到T的最短路56774968658336C1B1C2B2A1A2A3TS6*model:sets: cities/s,a1,a2,a3,b1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论