《学习LINGO语言课件》由会员分享,可在线阅读,更多相关《学习LINGO语言课件(151页珍藏版)》请在金锄头文库上搜索。
1、8/29/2024 8:14 AM8/29/2024 8:14 AMLINGO 数学科学与技术学院数学科学与技术学院 杨云峰杨云峰 密码:密码:6543218/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM一一. . 优化模型与优化软件简介优化模型与优化软件简介二二. LINGO. LINGO软件的基本使用方法软件的基本使用方法Outline三三. LINGO. LINGO程序流程控制和子模型程序流程控制和子模型 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM一一. . 优化模型与优化软件简介优化模型与优化软件简介8/
2、29/20248/29/2024 8:14 AM8/29/2024 8:14 AM约约束束条条件件决策变量决策变量优化问题的一般形式优化问题的一般形式目标函数目标函数无约束优化无约束优化无约束优化无约束优化: : : : 只有目标函数只有目标函数只有目标函数只有目标函数, , , , 没有约束条件没有约束条件没有约束条件没有约束条件有约束优化有约束优化有约束优化有约束优化: : : : 目标函数和约束条件都有目标函数和约束条件都有目标函数和约束条件都有目标函数和约束条件都有普通方程组:普通方程组:普通方程组:普通方程组:没有没有没有没有(1)(3), (1)(3), (1)(3), (1)(3
3、), 只有只有只有只有(2)(2)(2)(2)不等式方程组:不等式方程组:不等式方程组:不等式方程组:没有没有没有没有(1)(2), (1)(2), (1)(2), (1)(2), 只有只有只有只有(3)(3)(3)(3)8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM优化类型优化类型连续优化连续优化 : : 全部决策变量取值均全部决策变量取值均 为连续数值为连续数值 ( (实数实数) )离散优化离散优化 : : 部分或全部决策变量部分或全部决策变量 只取离散数值只取离散数值8/29/20248/29/2024 8:14 AM8/29/2024 8:14
4、AM连续优化连续优化 线性规划线性规划(LP)(LP) 目标和约束均为线性函数目标和约束均为线性函数 非线性规划非线性规划(NLP)(NLP) 目标或约束中有非线性函数目标或约束中有非线性函数 二次规划二次规划(QP)(QP) 目标为二次函数、目标为二次函数、 约束为线性约束为线性8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM离散优化离散优化 整数规划整数规划(IP)(IP) 决策变量决策变量( (全部或部分全部或部分) )为整数为整数 整数线性规划整数线性规划(ILP)(ILP),整数非线性规划整数非线性规划(INLP)(INLP) 纯整数规划纯整数规
5、划(PIP), (PIP), 混合整数规划混合整数规划(MIP) (MIP) 一般整数规划一般整数规划,0-10-1(整数)规划(整数)规划8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM常用优化软件常用优化软件 1.LINDO/LINGO软件软件2.MATLAB优化工具箱优化工具箱/mathematica优化程序包优化程序包3.EXCEL软件的优化功能软件的优化功能4.SAS(统计分析统计分析)软件的优化功能软件的优化功能8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM建模时需要注意的几个基本问题建模时需要注意的几个
6、基本问题 1 1、尽量使用尽量使用实数优化实数优化,减少整数约,减少整数约束和整数变量束和整数变量2 2、尽量使用尽量使用光滑优化光滑优化,减少非光滑,减少非光滑约束的个数约束的个数 如:尽量少使用绝对值、符号函数、如:尽量少使用绝对值、符号函数、多个变量求最大多个变量求最大/ /最小值、四舍五入、最小值、四舍五入、取整函数等取整函数等8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM建模时需要注意的几个基本问题建模时需要注意的几个基本问题 3 3、尽量使用尽量使用线性模型线性模型,减少非线性约,减少非线性约束和非线性变量的个数束和非线性变量的个数 (如(如
7、x/y 5 改为改为x5y)4 4、合理设定合理设定变量上下界变量上下界,尽可能给出,尽可能给出变量初始值变量初始值 5 5、模型中使用的模型中使用的参数数量级参数数量级要适当要适当( (如小于如小于10103 3) )8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM二二. . LINGO LINGO软件的基本使用方法软件的基本使用方法8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM1 LINGOLINGO入门入门8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMmax 2x1+3x
8、2 St. 4x1+3x2=10 3x1+5x2=12 x10 x20目标函数目标函数约约束束条条件件决策变量决策变量设有数学模型如下:设有数学模型如下:8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM第一步:启动第一步:启动LingoLingo屏幕显示如下:屏幕显示如下: 标记标记LINGOLINGO的外窗口是主框架的外窗口是主框架窗口,主框架窗口的上面包含所窗口,主框架窗口的上面包含所有的命令菜单和命令工具栏;有的命令菜单和命令工具栏; 标记标记LINGO MODEL-LINGO1LINGO MODEL-LINGO1的子的子窗口是一个新的、空白的模型窗
9、窗口是一个新的、空白的模型窗口。口。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM第二步:在模型窗口中输入模型第二步:在模型窗口中输入模型model:model:maxmax = = 2*x1+3*x2;2*x1+3*x2;4*x1+3*x210;4*x1+3*x210;3*x1+5*x212;3*x1+5*x212;endMax 2x1+3x2 St. 4x1+3x2=10 3x1+5x2=12 x10 x208/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM第三步:求解模型第三步:求解模型 1)1)选择菜单选择菜单
10、 LINGO|SolveLINGO|Solve 或者按工具栏的或者按工具栏的 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM 2)LINGO2)LINGO开始编译模型,如有语法错误开始编译模型,如有语法错误将返回一个错误的消息并指明错误出将返回一个错误的消息并指明错误出现的位置;如果通过编译现的位置;如果通过编译, LINGO, LINGO将将激活激活 SolverSolver运算器运算器 寻求模型的最优寻求模型的最优解;解;8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM3)3)首先出现首先出现solver sta
11、tus solver status 窗口窗口,其,其作用是监控作用是监控solversolver的进展和显示模的进展和显示模型的维数等信息;型的维数等信息;8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMSolver Status 窗口8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM4)4)计算完成后出现计算完成后出现Solution ReportSolution Report窗口窗口显示模型解的详细信息显示模型解的详细信息;8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMSolu
12、tion Report 窗口窗口Global optimal solution found at iteration: 2Objective value: 7.454545Variable Value Reduced Cost x1 1.272727 0.000000 x2 1.636364 0.000000Row Slack or Surplus Dual Price 1 7.454545 1.000000 2 0.000000 0.9090909E-01 3 0.000000 0.54545458/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMReduc
13、ed Cost:在在maxmax模型模型中中: 相应变量的相应变量的 reduced costreduced cost值表值表示示当该变量每增加一个单位时目标当该变量每增加一个单位时目标函数减少的量函数减少的量。 本例中此值均为本例中此值均为0 08/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMReduced Cost:Reduced Cost 值列出最优单纯形表中判别值列出最优单纯形表中判别数所在行的变量的系数,表示当变量有微数所在行的变量的系数,表示当变量有微小变动时,目标函数的变化率。其中基变小变动时,目标函数的变化率。其中基变量的量的reduced
14、 cost值应为值应为0, 对于非基变量对于非基变量 Xj, 相应的相应的reduced cost值表示当某个变值表示当某个变量量Xj 增加一个单位时目标函数减少的量增加一个单位时目标函数减少的量( max型问题型问题)。本例中此值均为。本例中此值均为0。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMSLACK OR SURPLUS: 给给出出约约束束条条件件的的松松驰驰变变量量或或剩剩余余变量的值;变量的值; 小小 于于 等等 于于 约约 束束 为为 松松 驰驰 变变 量量(SLACK)(SLACK); + + 大大 于于 等等 于于 约约 束束 为为
15、 剩剩 余余 变变 量量(SURPLUS); -(SURPLUS); -8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMDUAL PRICES:对偶价格或影子价格对偶价格或影子价格 DUAL PRICES表示当对应约束有微表示当对应约束有微小变动时,目标函数的变化率,即约束条小变动时,目标函数的变化率,即约束条件右端的常数项每增加一个单位,目标函件右端的常数项每增加一个单位,目标函数相应获得的改变量。数相应获得的改变量。 显然,显然,如果在最优解处约束正好取等号如果在最优解处约束正好取等号(紧约束),该值才可能不是(紧约束),该值才可能不是0;对于非紧;对
16、于非紧约束对该值必为约束对该值必为0,表示对应约束中不等式,表示对应约束中不等式右端项的微小扰动不影响目标函数。右端项的微小扰动不影响目标函数。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM2 LingoLingo的基本用法注意事项的基本用法注意事项8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM1)1)每一个模型都以每一个模型都以 model:model: 开始开始, , 又以又以 endend 结束结束, ,也可省略此结构也可省略此结构; ;8/29/20248/29/2024 8:14 AM8/29/2024
17、8:14 AM2)2)目标函数必须由目标函数必须由 min =min = 或或 max =max = 开头。开头。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM3)3)可以用可以用 表示表示= 表示表示=; LingoLingo无严格小于,欲使无严格小于,欲使abab, 可以适当选取小的正常数可以适当选取小的正常数e e 表示成表示成a+ea+ebb,8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM4) 4) LINGOLINGO的每一语句以的每一语句以 ; ; 结束;结束;5) 5) 注释注释 以以 ! 开始,开始
18、, 以以 ; ; 结束;结束;8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM6)6)变量名变量名: :. .不区分大小写不区分大小写. .由字母数字下划线组成由字母数字下划线组成. .第一个字符必须是字母第一个字符必须是字母. .变量名最长为变量名最长为3232个字符个字符8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM7)7) LINGOLINGO编辑器用编辑器用8)8) 蓝色蓝色显示显示LINGOLINGO关键字关键字9)9) 绿色绿色显示显示注释注释10)10) 其他文本用黑色其他文本用黑色11)11) 匹配的
19、括号匹配的括号用用红色红色高亮度显示高亮度显示8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM8) 8) 变量和数字放在约束条件的左、变量和数字放在约束条件的左、右端均可;右端均可;但最好变量在左,数字在右。但最好变量在左,数字在右。9) Lingo 9) Lingo 变量默认域为变量默认域为非负实数非负实数,可以改变默认域可以改变默认域. .8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM10)行名行名 name例:例:Objectivemax=2*x+3*y;Con1 4*x+3*y10;Con2 3*x+5*y1
20、2;线性规划线性规划(行名行名).lg4默认为默认为1,2,38/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMGlobal optimal solution found. Objective value: 7.454545 Total solver iterations: 2 Variable Value Reduced Cost X 1.272727 0.000000 Y 1.636364 0.000000 Row Slack or Surplus Dual Price OBJECTIVE 7.454545 1.000000 CON1 0.000000
21、0.9090909E-01 CON2 0.000000 0.54545458/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM3 LINGOLINGO的的建模语言建模语言8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM以以运输实例运输实例逐步分析逐步分析6 6个仓库向个仓库向8 8个小贩供应同一种货物,个小贩供应同一种货物,如何运如何运, ,总运输费用最小总运输费用最小?注:每个仓库可以向每个小贩供货注:每个仓库可以向每个小贩供货,一共,一共4848个可能运货路线。个可能运货路线。 仓库货存量、小贩需求量、每条路线仓库货存
22、量、小贩需求量、每条路线的单位运输费用三个表如下:的单位运输费用三个表如下:8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM仓库货存量:仓库货存量:capacitycapacity仓库号仓库号货存量货存量 w1w1 6060 w2w2 5555 w3w3 5151 w4w4 4343 w5w5 4141 w6w6 52528/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM小贩需求量:小贩需求量:demanddemand 小贩代号小贩代号 货物需求量货物需求量 v1v1 3535 v2v2 3737 v3v3 2222 v
23、4v4 3232 v5v5 4141 v6v6 3232 v7v7 4343 v8v8 38388/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM每单位货物运输费用表:每单位货物运输费用表:costcost 小小仓仓 贩贩 库库 v1v1 v2v2 v3v3 v4v4 v5 v5 v6v6 v7 v7 v8v8 w1 w1 6 62 26 67 74 42 25 59 9 w2 w2 4 49 95 53 38 85 58 82 2 w3 w3 5 52 21 19 97 74 43 33 3 w4 w4 7 76 67 73 39 92 27 71 1 w
24、5 w5 2 23 39 95 57 72 26 65 5 w6 w6 5 55 52 22 28 81 14 43 38/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMdemand_j 表示第表示第j个小贩个小贩的需求量的需求量capacity_i 表示第表示第i个仓库的个仓库的库存量库存量cost_i_j 表示从第表示从第i个仓个仓库到第库到第j个小贩的单位运输费用个小贩的单位运输费用已已知知数数量量决策变量决策变量volume_i_j 表示从第表示从第i个仓库到个仓库到第第j个小贩的运输量个小贩的运输量8/29/20248/29/2024 8:14 A
25、M8/29/2024 8:14 AM数学模型可表示如下:数学模型可表示如下:8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM当然目标函数可以如下输入当然目标函数可以如下输入: 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;8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM 但是较大模型如果像上面那样但是较大模型如果像上面那样输入又费时,又容易出错!输入又
26、费时,又容易出错! 这就需要这就需要LINGOLINGO的的建模语言建模语言8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMLINGOLINGO的的建模语言建模语言优点优点: :1)1)可以用可以用类似于标准数学符号类似于标准数学符号的方式的方式表示你的模型;表示你的模型;2)2)可以用可以用一个紧凑的语句一个紧凑的语句表示表示一系列一系列约束约束。3)3)数据可独立于模型数据可独立于模型:LINGOLINGO可以从可以从文本文件、电子数据表、数据库中读文本文件、电子数据表、数据库中读取数据。取数据。8/29/20248/29/2024 8:14 AM8/
27、29/2024 8:14 AMLINGOLINGO模型的构成:模型的构成:5 5个段个段 目标函数与约束条件段目标函数与约束条件段 集合段(集合段(sets: sets: endsetsendsets) 数据段(数据段(data: data: enddataenddata) 初始段(初始段(init: init: endinitendinit) 计算段(计算段(calccalc: endcalcendcalc)LingoLingo建模语言的重点和难点是:建模语言的重点和难点是:对对集合集合概念的理解和正确使用概念的理解和正确使用8/29/20248/29/2024 8:14 AM8/29/20
28、24 8:14 AM为什么使用为什么使用集合集合 集集合合是是L LI IN NG GO O建建模模语语言言的的基基础础,是是L LI IN NG GO O程程序序设设计计最最强强有有力力的的基基本本构构件件。借借助助于于集集合合,能能够够用用一一个个单单一一的的、长长的的、简简明明的的复复合合公公式式表表示示一一系系列列相相似似的的约约束束,从从而而可可以以快快速速方方便便 地地 表表 达达 规规 模模 较较 大大 的的 模模 型型 。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM什么是集合什么是集合 集合是一群相联系的对象,比如集合是一群相联系的对象
29、,比如仓库、小贩仓库、小贩、运输路线,运输路线,这些对象也这些对象也称为集合的称为集合的成员成员。每个集合成员可能。每个集合成员可能有一个或多个与之有关联的特征,我有一个或多个与之有关联的特征,我们把这些特征称为们把这些特征称为属性属性。 属性值可以预先给定,也可以是属性值可以预先给定,也可以是未知的,有待于未知的,有待于LINGOLINGO求解。求解。 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM从我们的数学模型看需要三个集合:从我们的数学模型看需要三个集合:(1 1)仓库仓库- -6 6个成员个成员- -货存量货存量(2 2)小贩小贩- -8 8个
30、成员个成员- -需求量需求量(3 3)运输路线运输路线- -4848个成员个成员 - -单位运费单位运费和和运货量运货量8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMLINGOLINGO有两种类型的集合有两种类型的集合原始集合原始集合(primitive set)(primitive set):由一些:由一些最基本的对象组成的。最基本的对象组成的。派生集派生集(derived set): (derived set): 用一个或多用一个或多个其它集来定义的,也就是说,它个其它集来定义的,也就是说,它的成员来自于其它已存在的集。的成员来自于其它已存在的集。8
31、/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM*下面我们学习集合定义部分下面我们学习集合定义部分*1. 以以sets:开始,以开始,以endsets结束;结束; sets: endsets8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM2. 2. 原始集合定义法:原始集合定义法:setname /member_list/ :attribute_list ;。setname是集合的名字;是集合的名字;。member_list是成员列表是成员列表,各成员之间可用各成员之间可用空格空格或或逗号逗号分隔;分隔;。attribu
32、te_list是集合成员所具有的属性列是集合成员所具有的属性列表,多个属性之间用表,多个属性之间用逗号逗号分隔;分隔;。原始集合的。原始集合的member_list, attribute_list是可选项;是可选项;8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM* *仓库和小贩的集合可如下定义仓库和小贩的集合可如下定义* *sets: warehouses / w1 w2 w3 w4 w5 w6 /: capacity; vendors / v1,v2,v3,v4,v5,v6, v7,v8 / : demand;endsets8/29/20248/29/
33、2024 8:14 AM8/29/2024 8:14 AM* *成员较多时,可使用成员较多时,可使用隐式成员隐式成员列表列表 setname /member1.memberN/ :attribute_list;8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM数字型数字型字符数字型字符数字型星期型星期型月份型月份型年份年份- -月份型月份型* *隐式成员列表类别隐式成员列表类别* *8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM(1)(1)数字型数字型 1.n 例:例:1.5 (1,2,3,4,5)(2)(2)字符数字
34、型字符数字型 stringM.stringN例例: truck3.truck348/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM(3)星期型星期型 dayM.dayN例:例:mon.fri (Mon, Tue, Wed, Thu, Fri)(4)月份型月份型 MonthM.MonthN例:例:OCT.JAN (Oct, Nov, Dec, Jan)8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM(5)(5)年份年份- -月份型月份型monthYearM.monthYearN例:例:OCT2001.JAN2002 (20
35、01.10 2001.11 2001.12 2002.1)8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM* *仓库和小贩的集合也可如下定义仓库和小贩的集合也可如下定义* *sets: warehouses / w1.w6/: capacity; vendors / v1.v8 /: demand;endsets8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM3. 派生集合定义法:派生集合定义法:setname (parent_set_list) /member_list/ :attribute_list;parent
36、_set_list是父集合名列表是父集合名列表8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM*48条运输路线集合定义条运输路线集合定义*links(warehouses,vendors) : cost, volume;8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM* *三个集合定义如下三个集合定义如下* *sets: warehouses / wh1.wh6 /: capacity; vendors / v1.v8 /: demand; links( warehouses, vendors): cost,volum
37、e;endsets8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM运输问题的三个集合说明:运输问题的三个集合说明:这段代码定义了这段代码定义了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
38、,8);volume的引用同的引用同cost。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM4.4.集合成员过滤:集合成员过滤:trucks/1.100/:capacity;heavy_duty (trucks) | capacity(&1) #gt# 50000 : ; &1是集合索引号放置器,是集合索引号放置器,如果有两个父集合,就是如果有两个父集合,就是&1,&28/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM*下面我们学习数据定义下面我们学习数据定义* * 以以data:开始,以开始,以enddata结束;结
39、束; data: . enddata8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM例如:设有如下集合例如:设有如下集合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,则数据段可以为则数据段可以为8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM data: x=1,2,3; y=4 5 6; enddatadata: x,y=1 4 2 5 3 6; enddata 多个数据之间可用多个数据之间可
40、用逗号逗号或或空格空格分隔分隔 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM若成员属性值相同,数据段定义如下:若成员属性值相同,数据段定义如下:data: x=3; !(所有成员的所有成员的x=3); y=6; !(所有成员的所有成员的y=6);enddata 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM也可以在运行时输入属性值:也可以在运行时输入属性值:data: x=?; !(运行时输入所有运行时输入所有成员的成员的x值值); y=6; enddata8/29/20248/29/2024 8:14 AM8/
41、29/2024 8:14 AM* *运输问题的数据部分运输问题的数据部分* *data:capacity=60,55,51,43,41,52;demand=35 37 22 32 41 32 43 38;8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMcost = 6 2 6 7 4 2 5 9 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;enddata8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMse
42、ts: sett : x, y ;endsetsdata: sett, x, y = a 1 4 b 2 5 c 3 6;enddata sets: sett/a,b,c/ : x, y ;endsetsdata: x =1 2 3; y=4 5 6; enddata 集合成员可以在数据段定义:集合成员可以在数据段定义:8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM运输实例:运输实例:sets: warehouses: capacity;endsetsdata: !可以写成可以写成warehouses =w1.w6; !也可以同时定义集合成员列表和属性值
43、也可以同时定义集合成员列表和属性值; warehouses, capacity= w1 60,w2 55, w3 51,w4 43, w5 41,w6 52;enddata8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM * * 初始化定义初始化定义* 只在只在非线性规划非线性规划中使用,指定初中使用,指定初始值。始值。 init: . endinit8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM 例例: init: x=0.999; y=0.002; endinit y=log(x); x2+y2=1;给了恰当的初
44、始值,会减少运算时间。给了恰当的初始值,会减少运算时间。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM*计算段定义计算段定义*calc: . . .endcalc计算段的作用计算段的作用: 在模型输入后,在模型输入后,LINGOLINGO开始正式求解模开始正式求解模型之前对原始数据进行一定的计算,得到型之前对原始数据进行一定的计算,得到我们模型中要使用的部分数据。我们模型中要使用的部分数据。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM一个简单的计算段例子一个简单的计算段例子:model:data: x,y,z =
45、 1, 2, 3;enddatacalc: avg = ( x + y + z) / 3;endcalcend8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM*目标函数和约束条件段目标函数和约束条件段* LINGOLINGO提供了提供了集合循环函数集合循环函数和和集合操作集合操作函数函数使得目标函数和约束条件的书写如同使得目标函数和约束条件的书写如同数学公式那样简单。数学公式那样简单。四个集合循环函数四个集合循环函数FOR、SUM 、 MAX、MIN8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMsum ( setna
46、me ( set_index_list) | condition : expression);求和求和8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM* *运输问题的目标函数运输问题的目标函数* *min = sum( links ( i, j) : cost( i, j) * volume( i, j) );min = sum( links : cost* volume );8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM* *运输问题实例中的求和运输问题实例中的求和* *!从!从6 6个仓库发到个仓库发到第第j j
47、个小贩的货物个小贩的货物量总和量总和;sum( warehouses(i) : volume(i, j) );8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM从从第第i i个仓库发出个仓库发出到到8 8个小贩个小贩的货物量总和的货物量总和;sum( vendors(j) : volume( i , j ) )8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMfor ( setname ( set_index_list) | condition : expression_list ); 生成约束生成约束for for 对集
48、合对集合setnamesetname中的每个成员独立地生中的每个成员独立地生成约束,约束由约束表达式列表成约束,约束由约束表达式列表expression_listexpression_list描述描述; ; 多个表达式之间用多个表达式之间用分号相隔。分号相隔。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM* *每个小贩的需求约束每个小贩的需求约束* *!(要求!(要求6个仓库发给个仓库发给每个小贩每个小贩的的货物总货物总量量=小贩的需求量小贩的需求量);for( vendors(j) : sum( warehouses( i): volume( i, j
49、) ) =demand( j) );8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM* *每个仓库的供货约束每个仓库的供货约束* *for( warehouses( i) : sum( vendors(j) : volume( i, j) ) capacity( i) );!(要求!(要求每个仓库发给每个仓库发给8 8个小贩的个小贩的货物总量货物总量 = required(j) );8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMsize(setname) 返回集合返回集合setname中所包含的成员中所包含的成员个数
50、。个数。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM第二章第二章 LINGO与其它软件交换数据与其它软件交换数据8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM拷贝、粘贴拷贝、粘贴From ExelPastefromexel.lg4Pastefromexel.lg48/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM 输入输出函数输入输出函数用来与外部数据源连接用来与外部数据源连接 text()、 ole()、 file()、odbc()、 dual()8/29/20248/29/
51、2024 8:14 AM8/29/2024 8:14 AMfile( filename )在模型的在模型的集合和数据部分集合和数据部分使用使用, 从文本从文本文件输入数据文件输入数据.8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMsets: warehouses / file( 1.txt) / : capacity; vendors / file( 1.txt ) / : demand; links( warehouses, vendors) : cost, volume;endsets 运输实例的数据可以从文本文件输入:运输实例的数据可以从文本文件输
52、入:8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMdata:capacity = file( 1.txt );demand = file( 1.txt );cost = file( 1.txt );enddata1.txt文件内容文件内容 1.txt8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMtext( filename ) 在模型的数据部分使用在模型的数据部分使用, , 向文本向文本文件输出数据文件输出数据. .Outputtotext.lg48/29/20248/29/2024 8:14 AM8/29/202
53、4 8:14 AMole( spreadsheet_file ,range_name_list ) 在模型的数据和集合部分使用在模型的数据和集合部分使用, ,与与excelexcel交换数据交换数据8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM运输实例的数据可以从运输实例的数据可以从ExcelExcel输入:输入:sets: warehouses: capacity; vendors : demand; links( warehouses, vendors) : cost, volume;endsets8/29/20248/29/2024 8:14 AM
54、8/29/2024 8:14 AMdata: warehouses, vendors, capacity, demand, cost = ole ( 2.xls, warehouses, vendors, capacity, demand, cost );enddata8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM在在Excel中定义单元格范围名称的方法:中定义单元格范围名称的方法: 按鼠标左键拖曳选择单元格范围,按鼠标左键拖曳选择单元格范围, 释放鼠标按钮,释放鼠标按钮, 选择选择“插入插入|名称名称|定义定义”, 输入希望的名字,输入希望的名字, 点
55、击点击“确定确定”按钮。按钮。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM2.xls从从Excel输入数据输入数据.lg48/29/20248/29/2024 8:14 AM8/29/2024 8:14 AModbc(data_source, table_name, col_1, col_2 . ) 在模型的数据部分使用在模型的数据部分使用, ,与数据库进与数据库进行数据传输行数据传输 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM运输实例的数据可以从数据库输入:运输实例的数据可以从数据库输入:sets: war
56、ehouses: capacity; vendors : demand; links( warehouses, vendors) : cost, volume;endsets8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMdata: warehouses, capacity= odbc(); vendors, demand= odbc(); links,cost = odbc(); odbc()=volume; enddata8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMtrans.mdb与数据库的数据传递与数据库的
57、数据传递.lg48/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM第三章第三章 LINGOLINGO的内部函数的内部函数8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM 1. 1. 标准运算符标准运算符算术运算符:算术运算符: * / + - * / + -逻辑运算符:逻辑运算符: #EQ# #NE# #GE# #GT# #LE# #LT# #NOT# #AND# #OR#8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM关系运算符:关系运算符: = = = 可以用可以用 表示表示=或
58、或 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM运算符的优先级运算符的优先级 优先级优先级 运算符运算符最高最高#NOT# #NOT# (负号)(负号) * * / /+ + (减法)(减法)#EQ# #NE# #GT# #GE# #LT# #EQ# #NE# #GT# #GE# #LT# #LE# #LE# #AND# #OR#AND# #OR#最低最低(=)(=)8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMlingolingo变量默认域为非负实数变量默认域为非负实数free(variable) 取消默认域,
59、使变量可以取任意实数取消默认域,使变量可以取任意实数取消默认域,使变量可以取任意实数取消默认域,使变量可以取任意实数gin(variable) 限制变量取整数值限制变量取整数值限制变量取整数值限制变量取整数值bin(variable) 限制变量取值为限制变量取值为限制变量取值为限制变量取值为0 0,1 1bnd(low,variable,up) 限制变量于限制变量于限制变量于限制变量于一个有限的范围一个有限的范围一个有限的范围一个有限的范围3. 3. 变量界定函数变量界定函数8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM练习练习1x1=2, x2 =3,
60、Z*17练习练习1 18/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM练习练习2X1=1X1=1X2=0X2=0X3=1X3=1Z=8Z=8练习练习2 28/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMabs(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. 数学函数数学函数8/29/20248/29/2024 8:14 AM
61、8/29/2024 8:14 AM5. 条件控制条件控制if ( logical_condition, true_result, false_result )计算计算logical_condition,若真若真返回返回true_result否则返回否则返回false_result.8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM7 7个选项卡个选项卡( (可设置可设置80-9080-90个控制参数个控制参数) )8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM范例范例 8/29/20248/29/2024 8:14 A
62、M8/29/2024 8:14 AM整数规划整数规划 整数规划整数规划.lg48/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM二次规划的例子(lingo).lg48/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM递规调用.lg4 已知已知 ,求,求a7 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM 学习方法:学习方法:(1)(1)上课各位老师讲的上课各位老师讲的每个有数据的规划每个有数据的规划模型模型上机用上机用lingolingo语言实践;语言实践;(2) LINGO (2)
63、LINGO 的的helphelp下有下有一项一项Additional Examples of LINGO Additional Examples of LINGO ModelingModeling,可以仔细研究每个例子的可以仔细研究每个例子的模型。模型。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM某车间有甲、乙两台机床,可用于加某车间有甲、乙两台机床,可用于加工三种工件。假定这两台车床的可用工三种工件。假定这两台车床的可用台时数分别为台时数分别为800800和和900900,三种工件的,三种工件的数量分别为数量分别为400400、600600和和500
64、500,且已知,且已知用三种不同车床加工单位数量不同工用三种不同车床加工单位数量不同工件所需的台时数和加工费用如下表。件所需的台时数和加工费用如下表。问问怎样分配车床的加工任务,才能既怎样分配车床的加工任务,才能既满足加工工件的要求,又使加工费用满足加工工件的要求,又使加工费用最低最低? 练习练习38/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM 练习练习3车车床床类类 型型单位工件所单位工件所需加工台时需加工台时数数单位工件的单位工件的加工费用加工费用可可用用台台时时数数工工件件1 1工工件件2 2工工件件3 3工工件件1 1工工件件2 2工工件件3 3
65、甲甲 0.40.4 1.11.1 1.01.013139 91010800800乙乙 0.50.5 1.21.2 1.31.3111112128 89009008/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM解解1 设在甲车床上加工工件1、2、3的数量为x1、x2、x3,在乙车床上加工工件1、2、3的数量分别为x4、x5、x6。可建立以下线性规划模型: 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM解解2 设在甲车床上加工工件设在甲车床上加工工件i i的数量为的数量为x(ix(i) ), 单位工件所需加工台时数单位工
66、件所需加工台时数为为timex(itimex(i),),单位工件的加工费用单位工件的加工费用为为costx(icostx(i),),在乙车床上加工工件在乙车床上加工工件i i的数量为的数量为y(iy(i),),单位工件所需加工台时数单位工件所需加工台时数为为timey(itimey(i) )单位工件的加工费用单位工件的加工费用为为costy(icosty(i) )工件工件i i的加工数量为的加工数量为demand(idemand(i) )8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM数学模型8/29/20248/29/2024 8:14 AM8/29/2
67、024 8:14 AMLingo建模sets:Chechuang/1.3/ :costx,costy, timex,timey,x,y,demand;endsets8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMLingo建模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);8/29/20248/29/2024 8:14
68、AM8/29/2024 8:14 AMdata: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 38/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMLingo-Generate-Display modelMODEL:_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 =
69、 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); END8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM练习练习4-求求S到到T的最短路的最短路5 56 67 77 74 49 96 68 86 65 58 83 33 36 6C C1 1BB1 1C
70、C2 2BB2 2AA1 1AA2 2AA3 3T TS S6 68/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMmodel:sets:cities/s,a1,a2,a3, b1,b2,c1,c2,t/:l;roads(cities,cities)/ s,a1 s,a2 s,a3 a1,b1 a1,b2 a2,b1 a2,b2 a3,b1 a3,b2 b1,c1 b1,c2 b2,c1 b2,c2 c1,t c2,t/:d;endsets8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMdata:d=6 3 3 6 5
71、8 6 7 4 6 7 8 9 5 6;enddata8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AMl(1)=0;for(cities(i) | i#gt#index(s) : l(i)=min( roads(j,i) : l(j)+d(j,i);end最短路最短路.lg4.lg48/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM三三. LINGO程序流程控制和子模型程序流程控制和子模型8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM1、程序流程控制、程序流程控制条件分支控制条件分
72、支控制 条件循环控制条件循环控制 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM条件分支控制条件分支控制1、ifc 或或 ifc /else 语句语句2、其基本的使用语法是:、其基本的使用语法是: ifc( condition :可执行语句可执行语句1; else 可执行语句可执行语句2; )其中其中condition 是一个逻辑表达式(表示相应是一个逻辑表达式(表示相应的条件),当的条件),当condition 的逻辑值为的逻辑值为“真(条真(条件成立)时,程序执行语句件成立)时,程序执行语句1;否则程序执行;否则程序执行语句语句2。8/29/2024
73、8/29/2024 8:14 AM8/29/2024 8:14 AM条件分支控制条件分支控制 请读者注意,请读者注意,ifc 函数和以前用过的函数和以前用过的if 函数的功能是不同的:函数的功能是不同的: ifc 是引导流程控制语句的函数(按是引导流程控制语句的函数(按照不同条件选择不同的程序分支进行执行)照不同条件选择不同的程序分支进行执行),而,而 if 一个算术函数,按照不同条件返一个算术函数,按照不同条件返回不同的计算结果或表达式。回不同的计算结果或表达式。 8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM条件循环控制条件循环控制在在LINGO 1
74、0.0 以上版本中,有两种条件循环以上版本中,有两种条件循环控制语句:控制语句:for和和while。while语句的使用语法是:语句的使用语法是: while(condition: 可执行语句可执行语句;)当逻辑表达式当逻辑表达式condition为为“真真”时,执行相时,执行相应的一条或多条可执行语句(多条之间用分应的一条或多条可执行语句(多条之间用分号分隔),直到号分隔),直到condition的值为假为止。的值为假为止。请注意请注意,while条件循环控制语句只能出现条件循环控制语句只能出现在在计算段(计算段(calc)中。中。 8/29/20248/29/2024 8:14 AM8/
75、29/2024 8:14 AM条件循环控制条件循环控制在条件循环控制中,还经常会使用到在条件循环控制中,还经常会使用到break: 不需要任何参数,其功能是立即终止当前循环,继不需要任何参数,其功能是立即终止当前循环,继续执行当前循环外的下一条语句。续执行当前循环外的下一条语句。pause( message): 暂停程序执行,并弹出一个窗口,等待用户选择继暂停程序执行,并弹出一个窗口,等待用户选择继续执行或者终止程序。续执行或者终止程序。stop( message): 终止程序的运行,并弹出一个窗口,说明程序已经终止程序的运行,并弹出一个窗口,说明程序已经停止运行。停止运行。 8/29/202
76、48/29/2024 8:14 AM8/29/2024 8:14 AM二分法查找数据二分法查找数据采用二分搜索算法,从一个递增排列的采用二分搜索算法,从一个递增排列的正整数数列正整数数列X 中找到某个具体的数中找到某个具体的数KEY 在数列在数列X 中所在的位置中所在的位置二分法查找二分法查找.lg48/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM2、子模型、子模型子模型必须包含在主模型之内,即必须位于以子模型必须包含在主模型之内,即必须位于以“model:”开头、以开头、以“end”结束的模块内。结束的模块内。同一个主模型中,允许定义多个子模型,所以每个
77、子同一个主模型中,允许定义多个子模型,所以每个子模型本身必须命名,模型本身必须命名,子模型定义子模型定义: submodel mymodel: 可执行语句(约束可执行语句(约束+目标函数)目标函数); endsubmodel其中其中 mymodel 是该子模型的名字,可执行语句不可是该子模型的名字,可执行语句不可以有自身单独的集合段、数据段、初始段和计算段。以有自身单独的集合段、数据段、初始段和计算段。也就是说,同一个主模型内的变量都是全局变量,这也就是说,同一个主模型内的变量都是全局变量,这些变量对主模型和所有子模型同样有效。些变量对主模型和所有子模型同样有效。 8/29/20248/29/
78、2024 8:14 AM8/29/2024 8:14 AM2、子模型、子模型子模型调用子模型调用: solve( submodel_name, , submodel_name_n) 参数可以是多个子模型的名字,即同时求解多参数可以是多个子模型的名字,即同时求解多个子模型。也可以没有参数,如果没有参数则个子模型。也可以没有参数,如果没有参数则求解出现在语句求解出现在语句“solve();”之前的所有子之前的所有子模型。模型。8/29/20248/29/2024 8:14 AM8/29/2024 8:14 AM1个子模型个子模型.lg44个子模型个子模型.lg4子模型调用例子子模型调用例子8/29/2024