1、数学建模与运用,1 Lingo软件用法2 线性规划问题3 非线性规划问题4 整数规划问题5 目标规划问题及计算机解法,LINGO软件用法,2016年8月,目录,1 LINGO软件的安装与主界面2 LINGO软件的简单编程方法3 LINGO软件的求解结果4 LINGO软件的模型语言编程方法5 LINGO软件的函数与运算符6 LINGO软件的灵敏度分析,1 LINGO软件的安装与主界面,1.3 LINGO 11.0的安装在Internet上容易找到Lingo 11.0通常无须安装,双击执行程序Lingo11.exe,可直接启动。,1 LINGO软件的安装与主界面,四、LINGO 11.0的主界面,
2、多文档程序编辑窗口,求解(执行程序),2 LINGO软件的简单编程方法,2.1 简单编程法是指按数学模型的构成,对每一个数学表达式仅作少量符合计算机语言格式的变动,输入编辑窗口并运行的编程方法。,2 LINGO软件的简单编程方法,例1 某企业每月生产甲、乙两种产品,需要三种生产资源:技术服务、劳动力、行政管理,单位产品对三种资源的需求量、单位产品的利润以及三种资源的总量如下表所示。问:如何安排生产以使产品获利最大?,2 LINGO软件的简单编程方法,例1.1-LINGO程序,2 LINGO软件的简单编程方法,2.2 简单编程法的要点每个数学表达式对应一个语句,以分号结束以“max=”或“min
3、=”开头的是目标函数语句变量、运算符等必须符合计算机语言的格式特别地,乘号不能省略。以感叹号(!)开头、以分号结束的行是注释行英文字母或单词不区分大小写约束“xi0”不需输入,LINGO默认变量非负,3 LINGO软件的求解结果,3.1 “求解”按钮和菜单,3 LINGO软件的求解结果,3.2 求解结果:(1) 状态结果,模型类别LP: 线性规划,最优状态Global: 全局最优,目标值:600,变量情况总数:2非线性的: 0整型变量: 0,约束情况总数:4非线性的: 0,3 LINGO软件的求解结果,3.2 求解结果: (2) 数值结果,目标值:600,变量值,松弛或剩余变量值,4 LING
4、O的模型语言编程法,4.1 模型语言程序的基本框架MODEL:SETS:ENDSETSDATA:ENDDATAENDS,集合部分 (变量定义区),需在模型引用变量之前先定义. 可以有多个sets段.,模型部分:目标函数、约束条件,数据部分:模型所需的数据. 可以有多个DATA段.,4 LINGO的模型语言编程法,4.2 变量的定义4.2.1 定义变量的一些基本要求为提高编程效率,尽量为模型中的常数也定义变量来,然后在DATA部分为其赋值。相同类型的变量可以定义为数组,先定义一维数组,再由多个一维数组派生出二维或高维数组,4 LINGO的模型语言编程法,4.2.2 “例1”的常量和变量决策变量X
5、:x1,x2常量有:目标函数系数c:(10,4)约束条件的系数矩阵A: 1 1 10 5 2 6约束条件的右端常数b:(100,600,300)矩阵A32可看作是由(b,c)派生出来的,b,c 称为原始集,A称为派生集。,4 LINGO的模型语言编程法,4.2.3 原始集的定义格式:集名 /成员列表/: 属性列表例如:定义一个学生集(studs),有4个成员 Jhon,Jill,Rose,Mike成员属性有性别(Sex)和年龄(Age)。定义:studs /Jhon,Jill,Rose,Mike/: sex,age; (成员:显式罗列) 或 studs /1.4/: sex, age; (成员
6、:隐式罗列, 成员为1,2,3,4),2018年6月8日星期五9时29分4秒,*成员较多时,可使用隐式成员列表,setname /member1.memberN/ :attribute_list;,2018年6月8日星期五9时29分4秒,数字型字符数字型星期型月份型年份-月份型,*隐式成员列表类别*,2018年6月8日星期五9时29分4秒,(1)数字型,1.n 例:1.5 (1,2,3,4,5),(2)字符数字型,stringM.stringN例: truck3.truck34,2018年6月8日星期五9时29分4秒,(3)星期型,dayM.dayN例:mon.fri (Mon, Tue, W
7、ed, Thu, Fri),(4)月份型,MonthM.MonthN例:OCT.JAN (Oct, Nov, Dec, Jan),2018年6月8日星期五9时29分4秒,(5)年份-月份型,monthYearM.monthYearN例:OCT2001.JAN2002 (2001.10 2001.11 2001.12 2002.1),4 LINGO的模型语言编程法,原始集与C语言“结构体”的对应关系原始集 - C语言“结构体” 成名 - 结构体的成员(域) 属性 - 结构体的实例,4 LINGO的模型语言编程法,4.2.4 “例1”的原始集(1) 产品(Product)集:成员:2个,甲产品、乙
8、产品成员属性:2个,数量(X)、单价(c)定义:prod /p1,p2/: x,c;(2) 资源(Resource)集成员:3个,技术、劳动力、管理成员属性:1个,数量(b)定义:res /tech, worker, manage/: b,4 LINGO的模型语言编程法,4.2.5 派生集的定义格式:集名 (父集列表) /成员表列/: 属性列表父集:可以是原始集,也可以是派生集成员列表:如果省略,则以“父集”的全部组合为成员例如:为“例1”定义派生集生产耗用集(consum)定义:Consum (res,prod): A;成员: A(1,1)=(tech,p1) A(1,2)=(tech,p2
9、) A(2,1)=(worker,p1) A(2,2)=(worker,p2) A(3,1)=(manage, p1) A(3,2)=(manage,p2),4 LINGO的模型语言编程法,4.2.6 “例1”的常见定义sets: prod/1.2/:x,c; res/1.3/:b; cons(res,prod):a;endsets注:可将x,c,b看作一维数组,a看作二维数组. 其元素为x(1),x(2),; a(1,1),a(1,2),4 LINGO的模型语言编程法,4.3 变量(属性)的赋值“DATAENDDATA”的编写有三种赋值方法:A. 在DATAENDDATA段中直接赋值B. 从
10、TXT文件中导入C. 从EXCEL文件中导入,4 LINGO的模型语言编程法,4.3.1 直接赋值法格式:属性= ;值与值之间用空格分开,用分号结束对“例1”中属性的赋值:c=10 4;b=100 600 300;A=1 1 10 5 2 6;,对一维数组赋值时,不区分行向量或列向量; 对二维数组赋值时,分多行排列数据,只在最后一行加分号。,4 LINGO的模型语言编程法,4.3.2 从TXT文件导入(1) TXT文件中数据的排列格式,数据间以空格分开,每组数据以“”为结束符,表示一条数据记录,文件尾时可以不要结束符。,4 LINGO的模型语言编程法,(2)导入方法在“DATAENDDATA”
11、段中用file()函数,每读取一组数据,都要用一次file()函数(遇到符号“”终止读取)。 TXT文件与LINGO程序文件放在同一个文件夹中。,4 LINGO的模型语言编程法,4.3.3 从EXCEL文件导入(1) EXCEL文件中数据的排列格式,将数据组按行或矩阵形式存放在sheet1表的单元格中。 对每组数据所在的单元区域定义一个名称,方法是:A. 选中一个数据区域;B. 选择菜单“插入名称定义 例如,左图中三组数据区域的名称分别为“cost, res, consum”。,4 LINGO的模型语言编程法,(2) 从EXCEL文件导入数据的方法属性 = OLE(路径文件名.xls , 区域
12、名称 )例如:,文件所在的盘符及其路径不能省略。,4 LINGO的模型语言编程法,4.4 目标函数及约束条件的编写如果目标函数和约束条件比较简单,则仍然可以采用简单编程法的书写格式,但引用变量时应当使用数组格式。例如:,4 LINGO的模型语言编程法,容易看到上述程序中,目标函数和约束条件都有对应元素乘积后累加的特征,并且3个约束条件的结构是相同的。应当有更高效的编程方法为此,LINGO软件提供了两个重要函数:sum( )for( ),4 LINGO的模型语言编程法,4.1 改写数学模型,4 LINGO的模型语言编程法,4.2 对的编程方法(用sum( )函数)格式:sum ( 集名 |过滤条
13、件: 表达式)“|过滤条件”表示只对符合条件的表达式作累加,可省略。功能:按过滤条件遍历集,以对“表达式”作累加.例如:对上述模型的目标函数格式1:sum( prod(j): c(j)*x(j) );格式2:sum(prod: c*x);例:s=sum(number(j) | j #le# 5: x); 对j5以内的所有x作累加,4 LINGO的模型语言编程法,例如:对上述模型的3个约束条件sum( prod(j): a(1,j)*x(j) ) = b(1);sum( prod(j): a(2,j)*x(j) ) = b(2);sum( prod(j): a(3,j)*x(j) ) = b(3
14、);上述三个约束条件的结构是相同的,仅仅是数组a和b的下标发生变化,其下标变化的范围恰好是另外一个集“res”的成员个数.象这类结构相同、只是下标变化的语句组可用函数for( )来实现。,4 LINGO的模型语言编程法,4.3 对相同结构约束条件组的编程: for( )格式:for ( 集名 |过滤条件: 表达式)“|过滤条件”是由关系运算符构成的条件,可省略。功能:按条件遍历集,以产生结构相同、下标不同的一组“表达式”.例如:对上述模型的3个约束条件for( res(i): sum( prod(j): a(I,j)*x(j) ) =,1. 主要用于模型的约束条件语句中,表示约束条件的两端是否
15、相等。 2. LINGO软件并不支持严格大于或小于,“”和“=”等价。 3. 严格不等可构造为“A+e=30;end,5 LINGO的运算符和函数,5.2.9 判断函数warn(文本串, 条件)功能:当条件为真时产生一个内容为“文本”的信息框示例:model: x=1; warn(x是正数, x #gt# 0); end,6 LINGO的灵敏度分析,6.1 打开灵敏度分析为了保证求解速度,LINGO软件默认是关闭灵敏度分析功能的。打开方法:菜单:LINGOOption General Solver Tab 在Dual Computations列表框中, 选择Prices & Ranges选项,
16、6 LINGO的灵敏度分析,6.2 执行灵敏度分析1. 编辑模型的LINGO程序2. 选择菜单LINGORange (CTRL+R),6 LINGO的灵敏度分析,6.3 灵敏度分析的应用示例例2 某家具公司制造书桌、餐桌和椅子,所用的资源有三种:木料、木工和漆工。生产数据如下表所示。若要求餐桌的生产量不超过5件,如何安排三种产品的生产可使利润最大?,6 LINGO的灵敏度分析,1. 例2的数学模型,6 LINGO的灵敏度分析,2. 例2的LINGO程序,6 LINGO的灵敏度分析,3. 求解结果,最优目标值:280,生产方案:书桌x1=2, 餐桌x2=0, 椅子x3=8(x1,x3是基变量,
17、x2是非基变量),松弛或剩余变量值(Slack or Surplus):从第二行开始对应于每一个约束条件.,6 LINGO的灵敏度分析,3. 求解结果,Reduced Cost:列出最优单纯形表中判别数所在行的变量的系数,表示当变量有微小变动时, 目标函数的变化率。 基变量应为0. 对非基变量,表示当变量增加1个单位时(其他变量保持不变),目标函数减少的值 (max问题)。 例如:对x2: 01时,有目标值z=280-5=275.,Dual Prices(对偶价格): 表示当对应约束的右端项增加1个单位时, 目标函数的增加值 (max问题)。 例如:对第二个约束,若右端项b2: 2021, 则
18、目标函数值z=280+10=290。,6 LINGO的灵敏度分析,4. 灵敏度分析(菜单:LINGORange),目标函数系数C的允许变化范围 例如,对c1, 当在60+20,60-4范围内变化时,最优解不变,但z值要变。“INFINITY: 无穷大”,右端常数(RHS)的允许变化范围.,6 LINGO的灵敏度分析,5. 练习题(利用LINGO求解并分析)一奶制品加工厂用牛奶生产A1, A2两种奶制品,1桶牛奶可以在甲车间用12小时加工成3公斤A1,或者在乙车间用8小时加工成4公斤A2。根据市场需求,生产的A1, A2全部能售出,且每公斤A1获利24元,每公斤A2获利16元。现在加工厂每天能得
19、到50桶牛奶的供应,每天正式工人总的劳动时间480小时,并且甲车间每天至多能加工100公斤A1,乙车间的加工能力没有限制。试为该厂制订一个生产计划,使每天获利最大。,综合应用-线性规划问题,例 加工奶制品的生产计划,50桶牛奶,时间480小时,至多加工100公斤A1,制订生产计划,使每天获利最大,35元可买到1桶牛奶,买吗?若买,每天最多买多少?,可聘用临时工人,付出的工资最多是每小时几元?,A1的获利增加到 30元/公斤,应否改变生产计划?,每天:,x1桶牛奶生产A1,x2桶牛奶生产A2,获利 243x1,获利 164 x2,原料供应,劳动时间,加工能力,决策变量,目标函数,每天获利,约束条
20、件,非负约束,线性规划模型(LP),时间480小时,至多加工100公斤A1,模型求解,max 72x1+64x2st2)x1+x2503)12x1+8x24804)3x1100end,OBJECTIVE FUNCTION VALUE 1) 3360.000 VARIABLE VALUE REDUCED COST X1 20.000000 0.000000 X2 30.000000 0.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.000000 48.000000 3) 0.000000 2.000000 4) 40.000000 0.000000 N
21、O. ITERATIONS= 2,DO RANGE (SENSITIVITY) ANALYSIS?,No,20桶牛奶生产A1, 30桶生产A2,利润3360元。,模型求解,reduced cost值表示当该非基变量增加一个单位时(其他非基变量保持不变)目标函数减少的量(对max型问题),OBJECTIVE FUNCTION VALUE 1) 3360.000 VARIABLE VALUE REDUCED COST X1 20.000000 0.000000 X2 30.000000 0.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.000000 48
22、.000000 3) 0.000000 2.000000 4) 40.000000 0.000000 NO. ITERATIONS= 2,也可理解为:为了使该非基变量变成基变量,目标函数中对应系数应增加的量,OBJECTIVE FUNCTION VALUE 1) 3360.000 VARIABLE VALUE REDUCED COST X1 20.000000 0.000000 X2 30.000000 0.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.000000 48.000000 3) 0.000000 2.000000 4) 40.00000
23、0 0.000000,原料无剩余,时间无剩余,加工能力剩余40,max 72x1+64x2st2)x1+x2503)12x1+8x24804)3x1100end,三种资源,“资源” 剩余为零的约束为紧约束(有效约束),结果解释,OBJECTIVE FUNCTION VALUE 1) 3360.000 VARIABLE VALUE REDUCED COST X1 20.000000 0.000000 X2 30.000000 0.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.000000 48.000000 3) 0.000000 2.000000 4
24、) 40.000000 0.000000,结果解释,最优解下“资源”增加1单位时“效益”的增量,原料增1单位, 利润增48,时间加1单位, 利润增2,能力增减不影响利润,影子价格,35元可买到1桶牛奶,要买吗?,35 48, 应该买!,聘用临时工人付出的工资最多每小时几元?,2元!,RANGES IN WHICH THE BASIS IS UNCHANGED: OBJ COEFFICIENT RANGES VARIABLE CURRENT ALLOWABLE ALLOWABLE COEF INCREASE DECREASE X1 72.000000 24.000000 8.000000 X2
25、64.000000 8.000000 16.000000 RIGHTHAND SIDE RANGES ROW CURRENT ALLOWABLE ALLOWABLE RHS INCREASE DECREASE 2 50.000000 10.000000 6.666667 3 480.000000 53.333332 80.000000 4 100.000000 INFINITY 40.000000,最优解不变时目标系数允许变化范围,DO RANGE(SENSITIVITY) ANALYSIS?,Yes,x1系数范围(64,96),x2系数范围(48,72),A1获利增加到 30元/千克,应否改
26、变生产计划,x1系数由243= 72 增加为303= 90,在允许范围内,不变!,(约束条件不变),结果解释,结果解释,RANGES IN WHICH THE BASIS IS UNCHANGED: OBJ COEFFICIENT RANGES VARIABLE CURRENT ALLOWABLE ALLOWABLE COEF INCREASE DECREASE X1 72.000000 24.000000 8.000000 X2 64.000000 8.000000 16.000000 RIGHTHAND SIDE RANGES ROW CURRENT ALLOWABLE ALLOWABLE
27、 RHS INCREASE DECREASE 2 50.000000 10.000000 6.666667 3 480.000000 53.333332 80.000000 4 100.000000 INFINITY 40.000000,影子价格有意义时约束右端的允许变化范围,原料最多增加10,时间最多增加53,35元可买到1桶牛奶,每天最多买多少?,最多买10桶?,(目标函数不变),注意: 充分但可能不必要,在LINGO中使用LINDO模型, 打开“EXAM0201.LTX”文件 (如下图), 选择“LINGO|Solve (Ctrl+S)”来运行这个程序(运行状态窗口如右图), 运行程序的
28、LINGO报告窗口(如下图),在LINGO中使用LINDO模型,注:LINGO不询问是否进行敏感性分析,敏感性分析需要将来通过修改系统选项启动敏感性分析后,再调用“REPORT|RANGE”菜单命令来实现。现在同样可以把模型和结果报告保存在文件中。,运行状态窗口,Variables(变量数量): 变量总数(Total)、 非线性变量数(Nonlinear)、 整数变量数(Integer)。,Constraints(约束数量): 约束总数(Total)、 非线性约束个数(Nonlinear)。,Nonzeros(非零系数数量): 总数(Total)、 非线性项系数个数(Nonlinear)。,G
29、enerator Memory Used (K) (内存使用量),Elapsed Runtime (hh:mm:ss)(求解花费的时间),运行状态窗口,求解器(求解程序)状态框,当前模型的类型 :LP,QP,ILP,IQP,PILP, PIQP,NLP,INLP,PINLP (以I开头表示IP,以PI开头表示PIP),当前解的状态 : Global Optimum, Local Optimum, Feasible, Infeasible“(不可行), Unbounded“(无界), Interrupted“(中断), Undetermined“(未确定),解的目标函数值,当前约束不满足的总量(不是不满足的约束的个数):实数(即使该值=0,当前解也可能不可行,因为这个量中没有考虑用上下界命令形式给出的约束),目前为止的迭代次数,运行状态窗口,扩展的求解器(求解程序)状态框,使用的特殊求解程序 :B-and-B (分枝定界算法)Global (全局最优求解程序)Multistart(用多个初始点求解的程序),目前为止找到的可行解的最佳目标函数值,目标函数值的界,特殊求解程序当前运行步数:分枝数(对B-and-B程序);子问题数(对Global程序);初始点数(对Multistart程序),有效步数,