lingo入门
LINGO教程(基本语法)
H
20
输出结果: 运行菜单命令“LINGO|Solve”
最大利润=11077.5
最优整数解 X=(35,65)
H
21
输出结果备注: LINGO是将它作为PINLP(纯整数非线性规划)来求解,因此找到的是局部最优解。
通过菜单 “WINDOW| Status Window”看到状态窗口,可 看到最佳目标值“Best Obj” 与问题的上界“Obj Bound”已 经是一样的,当前解的最大 利润与这两个值非常接近, 是计算误差引起的。如果采 用全局最优求解程序(后面介 绍),可以验证它就是全局最 优解。
•限定变量取整数值的语句为“@GIN(X1)”和“@GIN(X2)”,不可以写成“@GIN(2)”,否 则LINGO将把这个模型看成没有整数变量。
•LINGO中函数一律需要以“@”开头,其中整型变量函数(@BIN、@GIN)和上下界 限定函数(@FREE、@SUB、@SLB)与LINDO中的命令类似。而且0/1变量函数 是@BIN函数。
H
18
一个简单的LINGO程序
例 直接用LINGO来解如下二次规划问题:
Max98x127x72x120.3x1x22x22 1
s.t. x1x2100
2
x12x2
3
x1,x2 0 为整数
4
输入窗口如下:
H
19
程序语句输入的备注:
•LINGO总是根据“MAX=”或“MIN=”寻找目标函数,而除注释语句和TITLE语句外的其 他语句都是约束条件,因此语句的顺序并不重要 。
H
27
集合及其属性
• QUARTERS集合的属性
• DEM
• RP
• OP
• INV
lingo入门教程(共55张)
3 3
A2
8 67
A3 4
7
B2
8 9
5 C2 6
T
第18页,共55页。
分析
(fēnxī)
6 A1 5 6
B1 6 C1
S
3 3
A2
8 67
A3 4
7
B2
8 9
5 C2 6
T
假设从S到T的最优行驶路线 P 经过城市C1, 则P中从S到C1的子路也一定 是从S到C1的最优行驶路线; 假设 P 经过城市C2, 则P中从S到C2的子路也一定是从S到C2的最优行驶路线. 因此, 为得到从S到T的最优行驶路线, 只需要先求出从S到Ck(k=1,2)的最 优行驶路线, 就可以方便地得到从S到T的最优行驶路线.
第19页,共55页。
分析
(fēnxī)
6 A1 5 6
B1 6 C1
S
3 3
A2
8 67
A3 4
7
B2
8 9
5 C2 6
T
此例中可把从S到T的行驶过程分成4个阶段,即 S→Ai (i=1,2 或3), Ai → Bj(j=1或2), Bj → Ck(k=1或2), Ck → T. 记d(Y,X)为城 市Y与城市X之间的直接距离(若这两个城市之间没有道路直 接相连,则可以认为直接距离为∞),用L(X)表示城市S到城市
L B2 minL A1 5, L A2 6, L A3 4 7 L A3 4; L C1 minL B1 6, L B2 8 15 L B2 8;
略2去),最小运量136.2275(吨公里)。
1
3
5
0
0
1
2
3
4
5
6
培训教案——LINGO(一)
培训教案——LINGO(一)LINGO是一款常用的线性规划软件,它能够方便地解决复杂问题。
培训LINGO,需要深入了解软件的使用方法和解决实际问题的能力。
下面就LINGO培训的内容进行分点介绍。
一、LINGO的基础知识LINGO的基础知识包括软件的基本功能和操作。
需要讲解LINGO的界面、工具栏、菜单栏等。
初次接触LINGO的学员需要掌握LINGO的一些基本用法,比如如何输入数据、如何设定优化目标,如何设置约束等,这些都是LINGO的基本操作。
二、LINGO求解模型了解LINGO的基本操作之后,需要讲解LINGO的求解模型。
LINGO的数学模型是LINGO软件解决问题必需的部分。
对于LINGO求解模型的学习,需要学员掌握数学模型的建立方法和标准的数学模型。
培训学员掌握LINGO的求解模型知识是LINGO培训的核心。
三、LINGO的高级应用LINGO的高级应用需要讲授如何利用LINGO解决实际问题,需要讲解如何构建多约束模型来描述现实中的问题,如何设置变量、常数和目标函数等。
高级应用的讲授需要结合实例,让学员深入了解LINGO的实际应用场景,提高解决实际问题的能力。
四、LINGO的调试LINGO的调试是LINGO培训的重要组成部分。
在LINGO求解过程中,有时会出现错误,导致模型不能正常求解。
因此,需要讲解LINGO调试的方法和技巧,使得学员具备调试LINGO模型的能力。
五、LINGO应用举例为了让学员进一步巩固LINGO的知识,需要讲解一些LINGO的应用举例。
举例的内容包括:产品组合问题、生产调度问题、财务规划问题、运输规划问题等。
通过这些示例,让学员对LINGO的应用有更加深刻的理解。
六、LINGO的作业练习培训LINGO需要进行实际操作,软件操作的熟练程度可以通过作业考核来体现。
作业练习的难度需要逐渐增加,从简单到复杂地设置模型,巩固培训成果。
LINGO培训需要根据学员的水平进行分类管理,加强培训的个性化和针对性。
第3讲LINGO基本使用方法
新余学院 建模组
目前为止找到的可行 解的最佳目标函数值
有效步数
目标函数值的界
特殊求解程序当前运行步数: 分枝数(对B-and-B程序); 子问题数(对Global程序); 初始点数(对Multistart程序)
上一页
下一页
Xinyu University MCM
优优优化化化建建建模模模
(2) min z 3x1 2x2 x3
s.t. 2x1 x2 x3 5, 4x1 3x2 x3 3 x1 x2 x3 2 x1, x2 , x3 0
2020/1/15
新余学院 建模组
上一页
下一页
Xinyu University MCM
二、在LINGO中使用集合
注意:用“[]”表示该部分内容可选。下同,不再赘述。
2020/1/15
新余学院 建模组
上一页
下一页
Xinyu University MCM
优优优化化化建建建模模模
例语1法可:以定se义tn一a个m名e[为/mstuedmenbts的er原_l始is集t/,][它:a具tt有ri成bu员tJeo_hlni、stJ]i;ll、Rose和Mike
MonthM..MonthN Jill 0 Oc1t4..Ja按n 列赋值 Oct,Nov,Dec,Jan
Rose 0 17 MonthYearM..MonthYeMariNkeOc1t201031.;.Jan2002
Oct2001,Nov2001,Dec2001 ,Jan2002
enddata
③ 集成员不放在集定义中,而在随后的数据部分来定义。
2020/1/15
新余学院 建模组
lingo快速入门
LINGO 使用教程LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++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 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮即可。
第四章 LINGO入门
第四章 LINGO 入门LINGO 9.0 功能增强,性能稳定,解答结果可靠.LINDO 用于求解线性规划和二次规划, LINGO 除了具有 LINDO 的全部功能外,还可以用于求解非线性规划,也可以用于一些线性和 非线性方程组的求解以及代数方程求根等.LINDO 和 LINGO 软件的最大特色在于可以允许优 化模型中的决策变量是整数(即整数规划),而且执行速度很快.LINGO 实际上还是最优化问 题的一种建模语言,包括许多常用的函数可供使用者建立优化模型时调用, 并提供与其它数 据文件(如文本文件、EXCEL 电子表格文件、数据库文件等)的接口,易于方便地输入、求 解和分析大规模最优化问题.由于这些特点,LINDO 和 LINGO 软件在教学、科研和工业、商 业、服务等领域得到广泛应用.第一节 简单的LINGO 模型1.1 LINGO 软件安装LINGO 安装过程与 LINDO for Windows 类似.安装过程中需要接受安装协议、选择安装 目录(缺省 C:\LINGO9).安装完成前,在出现的对话框(如图)中选择缺省的建模(即编程) 语言,系统推荐的是采用 LINGO.安装后可通过“LINGO|Options|File Format”命令修改缺 省的建模(即编程)语言.第一次运行时提示输入授权密码.LINGO 版本分为:演示版、求解包、高级版、超级版、工业版和扩展版,演示版之外 的都是正式版,它们的区别不只在于求解规模的限制,而且对于演示版还有试用时间限制, 同时有些功能限制.若没有授权密码,只能安装演示版.对于扩展版来说,对变量的数目和约 束的数目都没有限制,就是说可以求解无限规模的优化问题.本书以 LINGO9.0 版本为例.1.2 模型的输入首先,打开 LINGO 软件后,直接显示输入界面,如下图:图4-1 LINGO编辑界面编辑窗口与 LINDO编辑窗口类似,快捷按钮表示的功能也是相同的,唯一明显的差别是在窗 口的最下部有一个状态行.我们要在主窗口中的 model 窗口输入 LINGO 模型.首先,模型以“model:”开始,以“end”结束,并且要注意“model”后面的“:”不 要丢掉, 对一些简单问题来说也可以省略不写,并且 LINDO 模型在 LINGO 中仍然是有效的;其次,在目标函数行中,“max”后面一定要加“=”,而在“LINDO”中是不加的,这 是它们的一个显著区别;第三,任何一行内容输入完毕后需要在后面加“;”以标志一个语 句段的结束, 这样我们就允许两行的内容在同一行中书写, 只要中间用“; ”隔开就可以了, 但是为了保证较好的可读性,我们不赞成这样的写法;第四,在系数与变量之间的乘号一定 要写出来,这里与通常的计算机语言一样,用“*”表示乘号,这也是一个与“LINDO”明显 的区别; 第五,在书写约束时,我将变量按列对齐地写了出来, 这不过是为了阅读清楚而已, 在“LINGO”中与在“LINDO”中一样,忽略多余的空格,并且不区分字母的大小写,认为大 写的和小写的具有同一含义;第六,点击“LINGO”菜单的“Generate”子菜单下的 “Display model”命令,弹出一个窗口,这是 LINGO 的模型报告,在这里与之前输入时的 主要差别在于每一行前添加了行号,要注意的是,LINGO 中的行号是写在方括号“[ ]”之 中.因为我在输入时没有规定行号,所以程序自动按 1,2,3,4 ,…进行了编号,并且在 数字前有下划线“_”;第七,在 LINGO中不需要在约束前面写“ST”进行说明,程序自 动根据 “MAX=”或“MIN=”语句在各行中寻找目标函数,其它语句都作为约束条件来处 理,因此语句的顺序是不重要的,当然我们仍然是建议将目标函数写在最前面,使得模型清 晰; 第八, 在 LINGO 中对于变量都做非负假设, 不是非负变量需要进行说明; 第九, 在 LINGO 中允许将变量放在式子的右端;第十,在 LINGO 中可以调用已经存储好的 LINDO 模型,也 就是说 LINDO 模型在LINGO中仍然是被接受的.当然在 LINGO 模型的输入中还有很多的内容需要学习,我们将在后面的内容中逐步介 绍.1.3 模型的求解在“LINGO”菜单下选择“SOLVE”命令, 或者在快捷按钮中点击图标,则马上弹出下面 的求解状态窗口图4-2 LINGO求解状态窗口下面我们对其各个部分的含义进行说明:1) Variables:表示变量的数目.Total:表示变量总数;Nonlinear:非线性变量数;Integers:整型变量数.2) Constraints:约束的数目.Total:总约束数;Nonlinear:非线性约束数.3) Nonzeros:非零系数个数.Total:非零系数总数;Nonlinear:非线性项的系数个数.4) Generator Memory Used(K):内存的使用量,单位为千字节.5) Elapsed Runtime(hh:mm:ss):到目前为止求解所用的时间.6) Solver Status:求解器状态.Model:模型的类型,可能的显示有 IP、QP、ILP、IQP、PILP、PIQP、NLP、INLP、PINLP 等;State:求解到目前为止解的状态,可能的结果有Global Optimum:全局最优解;Local Optimum:局部最优解;Feasible:可行解;Infeasible:不可行解;Unbounded:无界解;Interrupted:用户中断;Undetermined:不确定;Objective:当前解的目标函数值;Infeasibility:当前每个约束不满足的数值总和,但是即使这个值为“0”,结果也不 一定是可行的;Iterations:到目前为止的迭代次数.7) Extended Solver Status:扩展的求解器状态.Solver Type:使用了什么样的特殊求解程序B-and-B:分支定界算法求解程序;Global:全局最优解求解程序;Multistart:使用多个初始点的求解程序;Best Obj:到目前为止找到的可行解的最佳目标值;Obj Bound:目标函数值的界;Steps:特殊求解程序当前运行的步数;Active:有效步数.8) Update:状态窗口刷新的时间间隔,可直接在窗口中进行修改.9) Interrupt Solver:中断求解,当求解完成后该按钮失效,变为灰色.10) Close:关闭状态窗口,但是模型计算仍在进行,在需要时可以在“Windows”菜单 下再打开该窗口.需要注意的是,这里多次用到了“到目前为止”这个词,这是因为在求解大规模的问题 时,有可能需要运算很长的时间,状态窗口实时地对求解过程进行着跟踪报告,如果无法等 到最终结果的出现,当达到满意解时就可以人为地终止了,这也就是中断按钮的作用.由于 这个问题规模非常小,当状态窗口打开时计算已经完成,因此中断按钮已经是灰色的,并且 运行时间显示为“00:00:00”,说明运行时间已经小于 0.005 秒.这时已经自动打开了一 个“Solution Report”(求解报告)窗口,如果该窗口没有自动打开,在计算结束后可以 在“Windows”菜单下打开该窗口.第二节 运算符与函数这些运算符是非常基本的,甚至可以不认为它们是一类函数.事实上,在 LINGO 中它们 是非常重要的.2.1 算术运算符算术运算符是针对数值进行操作的运算符.LINGO提供了 5 种二元运算符:^ 乘方﹡ 乘/ 除﹢ 加﹣ 减LINGO 唯一的一元算术运算符是取反函数“﹣”.这些运算符的优先级由高到底为:高 ﹣(取反)^﹡/低 ﹢﹣”来() 运算符的运算次序为从左到右按优先级高低来执行.运算的次序可以用圆括号“改变.2.2 关系运算符在 LINGO 中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小 于等于、 或者大于等于右边, 形成模型的一个约束条件.关系运算符与逻辑运算符#eq#、 #le#、 #ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该 关系是否被满足:满足为真,不满足为假.LINGO 有三种关系运算符:“=”、“<=”和“>=”.LINGO 中还能用“<”表示小于等于 “>”表示大于等于关系.LINGO 并不支持严格小于和严格大于关系运算符.然而,如果 关系,需要严格小于和严格大于关系,比如让A 严格小于 B:A<B,那么可以把它变成如下的小于等于表达式:A+ε<=B,这里ε是一个小的正数,它的值依赖于模型中 A小于B 多少才算不等.下面给出以上三类操作符的优先级:高 #not# ﹣(取反)^﹡ /﹢﹣#eq# #ne# #gt# #ge# #lt# #le##and# #or#低 <= = >=2.3 逻辑运算符在 LINGO 中, 逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集 成员被包含,哪些被排斥.另外,在创建稀疏集时用在成员资格过滤器中.LINGO 具有9种逻辑运算符:#not# 否定该操作数的逻辑值,#not#是一个一元运算符;#eq# 若两个运算数相等,则为 true,否则为 flase;#ne# 若两个运算符不相等,则为 true,否则为 flase;#gt# 若左边的运算符严格大于右边的运算符,则为 true,否则为 flase;#ge# 若左边的运算符大于或等于右边的运算符,则为 true,否则为 flase;#lt# 若左边的运算符严格小于右边的运算符,则为 true,否则为 flase;#le# 若左边的运算符小于或等于右边的运算符,则为 true,否则为 flase;#and# 仅当两个参数都为 true 时,结果为 true,否则为 flase;#or# 仅当两个参数都为 false 时,结果为 false,否则为 true;这些运算符的优先级由高到低为:高 #not##eq# #ne# #gt# #ge# #lt# #le#低 #and# #or#2.4 函数1.数学函数LINGO 提供了大量的标准数学函数:@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 中的最小值.2. 金融函数目前 LINGO 提供了两个金融函数.1) @fpa(I,n)返回如下情形的净现值:单位时段利率为 I,连续n 个时段支付,每个时段支付单位费 用.若每个时段支付 x 单位的费用,则净现值可用 x 乘以@fpa(I,n)算得.@fpa 的计算公式为I I I nnk k - = + - = + å ) 1 ( 1 ) 1 ( 1 1 . 净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用.2) @fpl(I,n)返回如下情形的净现值:单位时段利率为 I,第 n 个时段支付单位费用.@fpl(I,n)的计 算公式为n I - + ) 1 ( .细心的读者可以发现这两个函数间的关系:å= = n k k I fpl n I fpa 1 ), ( @ ) , ( @ .3. 概率函数1) @pbn(p,n,x)二项分布的累积分布函数.当 n 和(或)x 不是整数时,用线性插值法进行计算.2) @pcx(n,x)自由度为 n 的 χ 2 分布的累积分布函数.3) @peb(a,x)当到达负荷为 a,服务系统有x 个服务器且允许无穷排队时的 Erlang 繁忙概率.4) @pel(a,x)当到达负荷为 a,服务系统有x 个服务器且不允许排队时的 Erlang 繁忙概率.5) @pfd(n,d,x)自由度为 n和 d 的 F分布的累积分布函数.6) @pfs(a,x,c)当负荷上限为 a,顾客数为 c,平行服务器数量为 x 时,有限源的 Poisson 服务系统的 等待或返修顾客数的期望值.a 是顾客数乘以平均服务时间,再除以平均返修时间.当 c 和 (或)x 不是整数时,采用线性插值进行计算.7) @phg(pop,g,n,x)超几何(Hypergeometric)分布的累积分布函数.pop 表示产品总数,g 是正品数.从所 有产品中任意取出 n(n≤pop)件.pop,g,n 和 x都可以是非整数,这时采用线性插值进行 计算.8) @ppl(a,x)Poisson 分布的线性损失函数, 即返回 max(0,z-x)的期望值,其中随机变量z 服从均值 为 a 的 Poisson 分布.9) @pps(a,x)均值为 a 的 Poisson分布的累积分布函数.当 x不是整数时,采用线性插值进行计算.10) @psl(x)单位正态线性损失函数,即返回 max(0,z-x)的期望值,其中随机变量 z 服从标准正态 分布.11) @psn(x)标准正态分布的累积分布函数.12) @ptd(n,x)自由度为 n的 t 分布的累积分布函数.13) @qrand(seed)产生服从(0,1)区间的拟随机数.@qrand 只允许在模型的数据部分使用,它将用拟随机 数填满集属性.通常,声明一个 m×n 的二维表,m 表示运行实验的次数,n 表示每次实验所 需的随机数的个数.在行内,随机数是独立分布的;在行间,随机数是非常均匀的.这些随机 数是用“分层取样”的方法产生的.14) @rand(seed)返回 0 和 1 间的伪随机数,依赖于指定的种子.典型用法是 U(I+1)=@rand(U(I)).注意 如果 seed 不变,那么产生的随机数也不变.4.变量界定函数变量界定函数实现对变量取值范围的附加限制,共 4种:@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的约束.5. 集操作函数LINGO 提供了几个函数帮助处理集.1) @in(set_name,primitive_index_1 [,primitive_index_2,…])如果元素在指定集中,返回 1;否则返回 0.2) @index([set_name,] primitive_set_element)该函数返回在集 set_name 中原始集成员primitive_set_element 的索引.如果 set_name 被 忽略,那么 LINGO 将返回与 primitive_set_element 匹配的第一个原始集成员的索引.如果 找不到,则产生一个错误.3) @wrap(index,limit)该函数返回 j=index-k*limit, 其中 k 是一个整数, 取适当值保证j 落在区间[1, limit] 内.该函数相当于 index 模 limit 再加 1.该函数在循环、多阶段计划编制中特别有用.4) @size(set_name)该函数返回集 set_name 的成员个数.在模型中明确给出集大小时最好使用该函数.它的 使用使模型更加数据中立,集大小改变时也更易维护.6. 集循环函数集循环函数遍历整个集进行操作.其语法为@function(setname[(set_index_list)[|conditional_qualifier]]:expression_list);@function 相应于下面罗列的五个集循环函数之一;setname 是要遍历的集;set_ index_list是集索引列表;conditional_qualifier是用来限制集循环函数的范围, 当集循 环函数遍历集的每个成员时, LINGO都要对 conditional_qualifier 进行评价, 若结果为真, 则对该成员执行@function 操作,否则跳过,继续执行下一次循环.expression_list是被应 用到每个集成员的表达式列表, 当用的是@for 函数时,expression_list 可以包含多个表达 式,其间用逗号隔开.这些表达式将被作为约束加到模型中.当使用其余的三个集循环函数 时 , expression_list 只能有一个表达式 . 如果省略 set_index_list , 那么在 expression_list 中引用的所有属性的类型都是setname 集.1) @for该函数用来产生对集成员的约束.基于建模语言的标量需要显式输入每个约束,不过 @for 函数允许只输入一个约束,然后 LINGO 自动产生每个集成员的约束.2) @sum该函数返回遍历指定的集成员的一个表达式的和.3) @min 和@max该函数返回指定的集成员的一个表达式的最小值或最大值.4)@prod该函数返回遍历指定集成员的表达式的积.7. 输入和输出函数输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来.1) @file 函数该函数用从外部文件中输入数据,可以放在模型中任何地方.该函数的语法格式为 @file(’filename’).这里 filename 是文件名,可以采用相对路径和绝对路径两种表示方 式.@file 函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一 点必须注意.当使用@file 函数时,可把记录的内容(除了记录结束标记“~”外)看作是替代模型一条记录可以是声明的一部分, 整个声明, 中@file(’filename’)位置的文本.这也就是说,或一系列声明.在数据文件中注释被忽略.注意在LINGO 中不允许嵌套调用@file 函数.2) @text 函数该函数被用在数据部分用来把解输出至文本文件中.它可以输出集成员和集属性值.其 语法为@text([’filename’])这里 filename 是文件名,可以采用相对路径和绝对路径两种表示方式.如果忽略 filename, 那么数据就被输出到标准输出设备(大多数情形都是屏幕).@text 函数仅能出现在模型数 据部分的一条语句的左边,右边是集名(用来输出该集的所有成员名)或集属性名(用来输 出该集属性的值).3) @ole 函数@OLE 是从 EXCEL 中引入或输出数据的接口函数,它是基于传输的 OLE 技术.OLE 传输直 接在内存中传输数据,并不借助于中间文件.当使用@OLE 时,LINGO 先装载 EXCEL,再通知 EXCEL 装载指定的电子数据表,最后从电子数据表中获得 Ranges.为了使用 OLE 函数,必须 有 EXCEL5 及其以上版本.OLE函数可在数据部分和初始部分引入数据.@OLE 可以同时读集成员和集属性,集成员最好用文本格式,集属性最好用数值格式.原始集每个集成员需要一个单元(cell),而对于 n 元的派生集每个集成员需要 n 个单元,这里 第一行的 n个单元对应派生集的第一个集成员, 第二行的 n 个单元对应派生集的第二个集成 员,依此类推.@OLE 只能读一维或二维的 Ranges(在单个的 EXCEL 工作表(sheet)中),但不能读间断 的或三维的 Ranges.Ranges 是自左而右、自上而下来读.为了在 EXCEL 中定义 Ranges 名:① 按鼠标左键拖曳选择 Range,② 释放鼠标按钮,③ 选择“插入|名称|定义”,④ 输入希望的名字,⑤ 点击“确定”按钮.我们在模型的数据部分用如下代码从 EXECL中引入数据:PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS');@OLE('D:\IMPORT.XLS')=rate;等价的描述为PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS', PRODUCT,MACHINE,WEEK,ALLOWED,x,y);@OLE('D:\IMPORT.XLS',rate)=rate;这一等价描述使得变量名和 Ranges 不同亦可.4) @ranged(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量.5) @rangeu(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量.6) @status()返回 LINGO求解模型结束后的状态:0 Global Optimum(全局最优)1 Infeasible(不可行)2 Unbounded(无界)3 Undetermined(不确定)4 Feasible(可行)5 Infeasible or Unbounded(通常需要关闭“预处理”选项后重新求解模型,以确 定模型究竟是不可行还是无界)6 Local Optimum(局部最优)7 Locally Infeasible(局部不可行,尽管可行解可能存在,但是 LINGO并没有找到 一个)8 Cutoff(目标函数的截断值被达到)9 Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止)通常,如果返回值不是 0、4 或 6 时,那么解将不可信,几乎不能用.该函数仅被用在模 型的数据部分来输出数据.7) @dual@dual(variable_or_row_name)返回变量的判别数(检验数)或约束行的对偶(影子) 价格(dual prices).8. 辅助函数1) @if(logical_condition,true_result,false_result)@if 函数将评价一个逻辑表达式 logical_condition,如果为真,返回 true_ result, 否则返回 false_result.2) @warn(’text’,logical_condition)如果逻辑条件 logical_condition 为真,则产生一个内容为’text’的信息框.第三节 集与属性对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、 交通工具和雇工等等.LINGO 允许把这些相联系的对象聚合成集(sets).一旦把对象聚合成 集,就可以利用集来最大限度的发挥 LINGO 建模语言的优势.本节我们将深入介绍如何创建 集,并用数据初始化集的属性.3.1 集与属性的定义集是 LINGO 建模语言的基础,是程序设计最强有力的基本构件.借助于集,能够用一个 单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大 的模型.集是一群相联系的对象,这些对象也称为集的成员.一个集可能是一系列产品、卡车或 雇员.每个集成员可能有一个或多个与之有关联的特征, 我们把这些特征称为属性.属性值可 以预先给定,也可以是未知的,有待于 LINGO 求解.例如,产品集中的每个产品可以有一个 价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪 水属性,也可以有一个生日属性等等.3.2 原始集与派生集LINGO 有两种类型的集:原始集(primitive set)和派生集(derived set).一个原始集是由一些最基本的对象组成的.一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的 集.1.定义原始集为了定义一个原始集,必须详细声明:集的名字;集的成员(可选);集成员的属性(可选).定义一个原始集,用下面的语法:setname[/member_list/][:attribute_list];注意:用“[]”表示该部分内容可选.下同,不再赘述.setname 是你选择的来标记集的名字,最好具有较强的可读性.集名字必须严格符合标 准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉 伯数字(0,1,…,9)组成的总长度不超过 32 个字符的字符串,且不区分大小写.该命名 规则同样适用于集成员名和属性名等的命名.Member_list 是集成员列表.如果集成员放在集定义中,那么对它们可采取显式罗列和 隐式罗列两种方式.如果集成员不放在集定义中,那么可以在随后的数据部分定义它们.1) 当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁,.2) 当隐式罗列成员时,不必罗列出每个集成员.可采用如下语法:setname/member1..memberN/[: attribute_list];这里的 member1 是集的第一个成员名, memberN 是集的最末一个成员名.LINGO 将自动产生中 间的所有成员名.LINGO 也接受一些特定的首成员名和末成员名,用于创建一些特殊的集.列 表如下:表4.1隐式成员列表格式 示例 所产生集成员1..n 1..5 1,2,3,4,5StringM..StringN Car2..car14 Car2,Car3,Car4,…,Car14 DayM..DayN Mon..Fri Mon,Tue,Wed,Thu,FriMonthM..MonthN Oct..Jan Oct,Nov,Dec,Jan MonthYearM..MonthYearN Oct2001..Jan2002 Oct2001,Nov2001,Dec2001,Jan20023) 集成员不放在集定义中,而在随后的数据部分来定义.集成员无论用何种字符标记,它的索引都是从1开始连续计数.在attribute_ list可以 指定一个或多个集成员的属性,属性之间必须用逗号隔开.可以把集、集成员和集属性同C 语言中的结构体作个类比.如下所示:集 ←→ 结构体集成员 ←→ 结构体的域集属性 ←→ 结构体实例LINGO 内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后 再借助于 LINGO 求解器求解.因此,集属性的值一旦在模型中被确定,就不可能再更改.在 LINGO 中,只有在初始部分中给出的集属性值在以后的求解中可更改.这与前面并不矛盾, 初始部分是 LINGO 求解器的需要,并不是描述问题所必须的.2.定义派生集为了定义一个派生集,必须详细声明:集的名字;父集的名字;集成员(可选);集成员的属性(可选).可用下面的语法定义一个派生集:setname(parent_set_list)[/member_list/][:attribute_list];setname 是集的名字.parent_set_list 是已定义的集的列表,多个时必须用逗号隔开. 如果没有指定成员列表,那么 LINGO 会自动创建父集成员的所有组合作为派生集的成员.派 生集的父集既可以是原始集,也可以是其它的派生集.例 1sets:product/A B/;machine/M N/;week/1..2/;allowed(product,machine,week):x;endsetsLINGO 生成了三个父集的所有组合共八组作为 allowed 集的成员.列表如下:编号 成员1 (A,M,1)2 (A,M,2)3 (A,N,1)4 (A,N,2)5 (B,M,1)6 (B,M,2)7 (B,N,1)8 (B,N,2)成员列表被忽略时, 派生集成员由父集成员所有的组合构成, 这样的派生集成为稠密集. 如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集 成为稀疏集.同原始集一样, 派生集成员的声明也可以放在数据部分.一个派生集的成员列表 有两种方式生成:①显式罗列;②设置成员资格过滤器.当采用方式①时,必须显式罗列出 所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集.使用前面的例子,显 式罗列派生集的成员:allowed(product,machine,week)/A M 1,A N 2,B N 1/;如果需要生成一个大的、稀疏的集,那么显式罗列就很讨厌.幸运地是许多稀疏集的成员都 满足一些条件以和非成员相区分.我们可以把这些逻辑条件看作过滤器,在 LINGO 生成派生集的成员时把使逻辑条件为假的成员从稠密集中过滤掉.例 2sets :!学生集:性别属性sex,1表示男性,0表示女性;年龄属性age. ;students/John,Jill,Rose,Mike/:sex,age;!男学生和女学生的联系集:友好程度属性friend,[0,1]之间的数. ;linkmf(students,students)|sex(&1) #eq# 1 #and# sex(&2) #eq# 0: friend;!男学生和女学生的友好程度大于0.5的集;linkmf2(linkmf) | friend(&1,&2) #ge# 0.5 : x;endsetsdata :sex,age = 1 160 140 170 13;friend = 0.3 0.5 0.6;enddata用竖线(|)来标记一个成员资格过滤器的开始.#eq#是逻辑运算符,用来判断是否“相 等”. &1 可看作派生集的第 1 个原始父集的索引,它取遍该原始父集的所有成员;&2 可看 作派生集的第 2 个原始父集的索引,它取遍该原始父集的所有成员;&3,&4,……,以此 类推.注意如果派生集 B 的父集是另外的派生集 A,那么上面所说的原始父集是集 A 向前回 溯到最终的原始集,其顺序保持不变,并且派生集 A 的过滤器对派生集 B 仍然有效.因此, 派生集的索引个数是最终原始父集的个数, 索引的取值是从原始父集到当前派生集所作限制 的总和.总的来说,LINGO 可识别的集只有两种类型:原始集和派生集.在一个模型中,原始集是基本的对象,不能再被拆分成更小的组分.原始集可以由显式 罗列和隐式罗列两种方式来定义.当用显式罗列方式时,需在集成员列表中逐个输入每个成 员.当用隐式罗列方式时, 只需在集成员列表中输入首成员和末成员, 而中间的成员由 LINGO 产生.另一方面,派生集是由其它的集来创建.这些集被称为该派生集的父集(原始集或其它 的派生集).一个派生集既可以是稀疏的, 也可以是稠密的.稠密集包含了父集成员的所有组 合(有时也称为父集的笛卡尔乘积).稀疏集仅包含了父集的笛卡尔乘积的一个子集,可通 过显式罗列和成员资格过滤器这两种方式来定义.显式罗列方法就是逐个罗列稀疏集的成员. 成员资格过滤器方法通过使用稀疏集成员必须满足的逻辑条件从稠密集成员中过滤出稀疏 集的成员.不同集类型的关系见下图.集稠密集原始集显式罗列 稀疏集 过滤器派生集 图4-3 LINGO 集类型。
LINGO快速入门
概率函数
• 7.@phg(pop,g,n,x) • 超几何(Hypergeometric)分布的累积分布函数。pop表示产品总数,g是正
品数。从所有产品中任意取出n(n≤pop)件。pop,g,n和x都可以是非整数, 这时采用线性插值进行计算。
变量界定函数
• 变量界定函数实现对变量取值范围的附加限制,共4种: • @bin(x) 限制x为0或1 • @bnd(L,x,U) 限制L≤x≤U • @free(x) 取消对变量x的默认下界为0的限制,即x可
以取任意实数 • @gin(x) 限制x为整数 • 在默认情况下,LINGO规定变量是非负的,也就是说下界
• @smax(x1,x2,...,xn)返回 x1 , x2 , … , xn 中的 最大值
• @smin(x1,x2,...,xn)返回 x1 , x2 , … , xn 中的最 小值
例 给定一个直角三角形,求包含该三角形的最小正方形。
解:如图所示。ABCDDAEabx
求最小的正方形就相当于求如下的最优化问题:
• data:
• sex,age = 1 16
•
0 14
•
0 17
•
0 13;
• friend = 0.3 0.5 0.6;
• enddata
基本运算符
• ^ 乘方 •﹡ 乘 •/ 除 •﹢ 加 •﹣ 减
: LINGO具有9种逻辑运算符
• #not# 否定该操作数的逻辑值,# not #是一个一元运算符 • #eq# 若两个运算数相等,则为 true ;否则为 flase • #ne# 若两个运算符不相等,则为 true ;否则为 flase • #gt# 若左边的运算符严格大于右边的运算符,则为 true ;否则
Lingo语言入门
Lingo语言入门
6.5 基本语法规则
园括号
函数 关键词后,放精灵或演员的名称
关键词:系统自定义词
表达式
P145
空格符
分隔单词
注释:便于他人阅读程序
用“--”表示(脚本窗口中有 工具按钮) 运行“P146_注释.dir”(将延时程序用注释 暂时取消,观察运行结果:只显示10)
大小写:可任意 省略命令
以它为母体的精灵都具有此脚本 生成方法:选中演员后单击“演员脚 本工具按钮” 不是单独的演员(包含在演员身上)
2.
帧脚本
对此帧中所有精灵都有效 生成方法:双击“脚本通道”某一帧 会在演员表中生成帧脚本演员 在上例中添加“停在当前帧”帧脚本(先删除原来的行为)
3.
精灵脚本
只对当前精灵有效 生成方法:选中精灵后,运行右键快捷菜
工具按钮
运行“P143_电影脚本.dir”
6.4 Lingo的优先级
优先权:
指定基本事件处理程序>精灵脚本>演员脚本 >帧脚本>电影脚本
运行“P144_优先权.dir”
1.
2.
3.
察看“爱”按钮的精灵脚本 和演员脚本 运行程序,演员脚本不会 执行 在“爱”按钮的精灵脚本中 设置断点,如右图,观察 Property变量
单命令“Script”或“Modify/Sprite/Script” 菜单命令
运行“P143_精灵脚本.dir”
注意:现在“榔头”鼠标左键只具有“背景透 明”墨水效果,“返回”操作没有了,因 为优先权为 精灵>演员>帧
4.
电影脚本
用于控制整个电影的播放 生成方法:在“Script”窗口中直接点击“+”
lingo使用入门
伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。
member_list· 可选,集的成员列表,如果集成员放在集定义中,那么对它们可采取 显式罗列和隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数 据部分定义它们。 ① 当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号 搁开,允许混合使用。 例4-3 可以定义一个名为students的原始集,它具有成员John、Jill、Rose和Mike ,属性有sex和age: sets: students/John Jill, Rose Mike/: sex, age; endsets
注:A variable is considered to be nonlinear if it enters into any nonlinear relationship in any constraint in the model,如X*Y=10,而X+Y=10则认为X,Y都是线 性的;在X*X+Y=100中,X是非线性的,Y是线性的;在X=1,X+Y=3中,则认为X和Y 都不是变量。 2、约束框(Constraints)显示的是模型约束的总数和非线性约束的总数。 3、非零框(Nonzeros)显示的是模型中的非零系数的总数和非线性变量中非零系数的 总数。 4、内存时间框(Generator Memory Used)显示正在使用的模型所需的内存大小。 5、耗用时间框(Elapsed Runtime)显示用于编译和求解模型所需的时间。 6、求解状态框(Solver Status)显示模型类型和最优解的状态 Model:模型类型,可能的结果是:LP,NLP,QP,IP,ILP,INLP,PIP,MIP,IQP,PIQP,PINP等 State:给出现行解得状态,可能的结果是:全局最优解(Global Opt),局部最优解 (Local/Relative Opt),可行解(Feasible solution),不可行解(Infeasible solution),无界 解(Unbounded),中断(Interrupt),未定(Undetermined) Objective:给出当前目标函数值
LINGO基本教程(完整版)pdf
LINGO基本教程(完整版)pdf一、教学内容本节课我们使用的教材是《LINGO基本教程》,我们将学习第14章的内容。
第1章介绍LINGO软件的基本操作,包括界面的熟悉、模型的建立等;第2章学习线性规划模型的建立与求解;第3章讲解非线性规划模型的建立与求解;第4章介绍整数规划模型的建立与求解。
二、教学目标1. 学生能够熟练操作LINGO软件,建立和求解线性、非线性以及整数规划模型。
2. 学生能够理解线性、非线性以及整数规划的基本概念,并能够运用到实际问题中。
3. 学生通过学习LINGO基本教程,提高自己的逻辑思维能力和解决实际问题的能力。
三、教学难点与重点重点:熟练操作LINGO软件,建立和求解线性、非线性以及整数规划模型。
难点:理解线性、非线性以及整数规划的基本概念,以及如何将这些概念运用到实际问题中。
四、教具与学具准备教具:多媒体教学设备、投影仪、计算机。
学具:学生计算机、LINGO软件、教材《LINGO基本教程》。
五、教学过程1. 实践情景引入:以一个简单的线性规划问题为切入点,引导学生思考如何利用LINGO软件求解。
2. 讲解教材内容:分别讲解第14章的内容,包括LINGO软件的基本操作、线性规划模型的建立与求解、非线性规划模型的建立与求解以及整数规划模型的建立与求解。
3. 例题讲解:针对每个章节的内容,选择合适的例题进行讲解,让学生通过例题理解并掌握相关知识点。
4. 随堂练习:在每个章节讲解结束后,安排随堂练习,让学生通过练习巩固所学知识。
5. 课堂互动:鼓励学生提问,解答学生在学习过程中遇到的问题。
6. 板书设计:每个章节的重要知识点和操作步骤进行板书设计,方便学生复习。
7. 作业布置:布置与本节课内容相关的作业,巩固所学知识。
六、作业设计1. 作业题目:最大化问题:目标函数:Z = 2x1 + 3x2约束条件:x1 + x2 ≤ 62x1 + x2 ≤ 8x1, x2 ≥ 0最大化问题:目标函数:Z = x1^2 + x2^2约束条件:x1 + x2 ≤ 5x1^2 + x2^2 ≤ 10x1, x2 ≥ 0最大化问题:目标函数:Z = 3x1 + 2x2约束条件:x1 + x2 ≤ 42x1 + x2 ≤ 6x1, x2 均为整数2. 答案:(1)线性规划问题的解为:x1 = 2, x2 = 4(2)非线性规划问题的解为:x1 = 3, x2 = 2(3)整数规划问题的解为:x1 = 2, x2 = 2七、板书设计1. 第1章:LINGO软件的基本操作(1)界面的熟悉(2)模型的建立2. 第2章:线性规划模型的建立与求解(1)目标函数的定义(2)约束条件的设置(3)求解线性规划问题3. 第3章:非线性规划模型的建立与求解(1)目标函数的定义(2)约束条件的设置(3)求解非线性规划问题4. 第4章:整数规划模型的建立与求解(1)目标函数的定义(2)约束条件的设置(3)求解整数规划问题八、课后反思及拓展延伸本节课通过实践情景引入,使学生能够快速融入学习状态。
LINGO的基本用法
试确定各货栈到各客户处的货物调运数量, 使总的运输费用 最小
返回X的整数部分(向最靠近0的方向取整)
@LGM(X)
返回X的gamma函数的自然对数值
@MOD(X,Y)
运算对象是两个数
#GT# #GE#
左边大于右边时为真,否则为假 左边大于或等于右边时为真,否则为假
#LT#
左边小于右边时为真,否则为假
#LE#
左边小于或等于右边时为真,否则为假
预算对象是逻辑值 或逻辑表达式
#NOT# #AND# #OR#
单目运算符,表示对运算对象取反(即真变假,假变真) 两个运算对象都真时为真,否则为假 两个运算对象都假时为假,否则为真
◆生成图形
由模型生成图形,以矩阵形式显示 模型的系数.
◆调试
调试结果,找到充分行(Sufficient Rows)和必要行 (Necessary Rows). ◆模型统计资料
◆查看(以为本方式显示模型内容)
13
LINGO 教 程
◆命令行窗口
主要是为用户交互地测试命令脚本 而设计.(通常不用)
◆状态窗口
@FOR(VD(J): @SUM(WH(I): X(I, J)) =DJ(J));
21
§1.4 LINGO的运算符和函数
一、 LINGO的常用运算符. 1. 算术运算符.
LINGO 教 程
^* / + -
lingo入门
lingo入门lingo入门教程之一--- 初识lingoingo对于一些线性或者非线性的规划,优化问题非常有效首先介绍一下,在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(变量数量):变量总数(T otal)、非线性变量数(Nonlinear)、整数变量数(Integer)。
Constraints(约束数量):约束总数(T otal)、非线性约束个数(Nonlinear)。
Nonzeros(非零系数数量):总数(Total)、非线性项系数个数(Nonlinear)。
GeneratorMemory Used (K) (内存使用量)ElapsedRuntime (hh:mm:ss)(求解花费的时间)运行之后页面介绍(这里的运行界面并不是与上面的运行过程中出现界面一致,即并非来自于同一个程序运行出现)第一行表示在经过457次迭代后得到局部最优解第二行给出该局部最优解的具体值下面给出取局部最优值时,x1 x2的具体取值这里求解的是局部最优解,如果想求出全局最优解,可以进行页面设置:lingo --> option --> global solver --> 勾选use globalsolver对于运行结果也可以另存为,格式一般为ldt,因为有时候对于求解一个问题,或许需要运行很久才可以得出结果,所以没必要每次为了看结果都运行,而是运行成功一次后便把结果保存下来注意事项LINGO总是根据“MAX=”或“MIN=”寻找目标函数;程序语句的顺序一般不重要,既可以随意调换;程序运用函数时都是以@开头;程序中的变量默认为非负数,想要改变变量类型必须有相应函数调整程序中变量不区分大小写;语句必须以分号结尾;注释以!开始,且注释语句后面必须也有分号,注释默认注释到第一个分号处,意思是分号前面会全部被注释掉。
LINGO编程
西 南 大 学 荣 昌 校 区 基 础 部
MAX=200*X1+300*X2; X1<=100; X2<=120; X1+2*X2<=160;
数 学 建 模
【目标函数系数变化范围】 目标函数系数变化范围】
(不限 不限) 不限
【约束条件右边常数的变化范围】 约束条件右边常数的变化范围】
西 南 大 学 荣 昌 校 区 基 础 部
数 学 建 模
例2.基金的优化使用(2001年数学建模竞赛 题) 基金的优化使用( 年数学建模竞赛C题 年数学建模竞赛 假设某校基金会得到了一笔数额为M万元的基金 万元的基金, 假设某校基金会得到了一笔数额为 万元的基金,打算将 其存入银行,校基金会计计划在n年内每年用部分本息奖 其存入银行,校基金会计计划在 年内每年用部分本息奖 励优秀师生,要求每年的奖金额相同,且在n年末仍保留 励优秀师生,要求每年的奖金额相同,且在 年末仍保留 原基金数额.银行存款税后年利率见下表 原基金数额 银行存款税后年利率见下表
1.018
1.0432
1.07776
1.09715968
1.144
西 南 大 学 荣 昌 校 区 基 础 部
由上表知: 由上表知: (1) 一次性存成最长期,优于两个 或两个以上 较短期的组合 一次性存成最长期,优于两个(或两个以上 或两个以上)较短期的组合 (中途转存 . 中途转存) 中途转存 (2) 当存款年限需要组合时 收益比与组合的先后次序无关 当存款年限需要组合时,收益比 收益比与组合的先后次序无关 把总基金M分成 分成5+1份,分别用 1,…,x6表示 表示, 份 分别用x 建立模型 把总基金 分成 其中,x1 , …, x5分别存成1-5年定期,到期后本息合计用于发 其中, 分别存成 - 年定期, 年定期 放奖金, 年定期, 放奖金, x6存5年定期,到期的本息合计等于原基金总数 年定期 到期的本息合计等于原基金总数M 表示每年发放的奖金, 表示第i年的最优收益比 用S表示每年发放的奖金,ai表示第 年的最优收益比 表示每年发放的奖金
LINGO教程——从入门到精通
LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++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个收点的最小费用运输问题。
产销单位运价如下表。
单位 销地 运 价 产地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 24953858255A3 5 2 1 9 7 4 3 3 51A4 7 6 7 3 9 2 7 1 43A5 2 3 9 5 7 2 6 5 41A6 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 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮即可。
LINGO教程(基本语法)
•
当前时间
LINGO 教 程
LINGO的文件类型
•.LG4:LINGO格式的模型文件,保存了模型窗口中所 能够看到的所有文本和其他对象及其格式信息;
•.LNG:文本格式的模型文件,不保存模型中的格式信 息(如字体、颜色、嵌入对象等);
•.LDT:LINGO数据文件; •.LTF:LINGO命令脚本文件;
18
LINGO 教 程
一个简单的LINGO程序
LINGO的基本用法的几点注意事项
•LINGO中不区分大小写字母;变量和行名可以超过8个字符,但 不能超过32个字符,且必须以字母开头。 •用LINGO解优化模型时已假定所有变量非负(除非用限定变量取 值范围的函数@free或@sub或@slb另行说明)。 •变量可以放在约束条件的右端(同时数字也可放在约束条件的左 端)。但为了提高LINGO求解时的效率,应尽可能采用线性表达 式定义目标和约束(如果可能的话)。 •语句是组成LINGO模型的基本单位,每个语句都以分号结尾,编 写程序时应注意模型的可读性。例如:一行只写一个语句,按照 语句之间的嵌套关系对语句安排适当的缩进,增强层次感。 •以感叹号开始的是说明语句(说明语句也需要以分号结束))。
选择菜单命令 “File|Open(F3)”, 可以看到 “打开文 件”对话框。 (如 图)
①
6
LINGO 教 程
在LINGO中使用LINDO模型
②
打开“EXAM0201.LTX”文件 (如下图)
选择“LINGO|Solve (Ctrl+S)”来运行这 个程序(运行状态窗口 如右图)
③
7
LINGO 教 程
LINGO 教 程
目标函数的定义方式 @SUM(集合(下标):关于集合的属性的表达式) 对语句中冒号“:”后面的表达式,按照“:”前 面的集合指定的下标(元素)进行求和。 本例中目标函数也可以等价地写成
lingo11入门到精通
LINGO11入门到精通LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
一般来说LINGO 多用于解决大规模数学规划。
用时要注意以下几点:(1) 每条语句后必须使用分号“;”结束。
问题模型必须由MODEL 命令开始,END 结束。
(2) 用MODEL 命令来作为输入问题模型的开始,格式为MODEL :statement (语句)。
(3) 目标函数必须由“min =”或“max =”开头。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++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 5 94 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮即可。
lingo入门教程
lingo入门教程Lingo是一种广泛应用于计算机编程和计算机科学领域的编程语言。
它是用于Adobe Director(一种多媒体应用程序)中的脚本语言,用于控制多媒体元素和动画。
Lingo的语法比较简单易懂,有助于创建交互式和多媒体项目。
下面是一些Lingo的基本概念和用法。
1. 变量(Variables): 在Lingo中,变量用于存储数据值。
变量可以是数字、文本或其他数据类型。
要创建变量,可以使用关键字`global`或`local`,后跟变量名和初始值(可选)。
例如:```global myVariable = 10local myText = "Hello World"```2. 条件语句(Conditional statements): 条件语句用于根据条件执行特定的代码块。
常用的条件语句有`if-then`和`if-then-else`。
例如:```if myVariable > 5 thenalert "Value is greater than 5"elsealert "Value is less than or equal to 5"end if```3. 循环(Loops): 循环用于重复执行一段代码块,直到满足指定条件为止。
Lingo提供了`repeat`和`repeat while`循环语句。
例如:```repeat with i = 1 to 5put iend repeat```4. 函数(Functions): 函数是一组预定义的代码,用于执行特定的任务。
Lingo提供了许多内置函数,如`alert`、`put`等。
您还可以创建自己的函数。
例如:```on multiplyNumbers(a, b)return a * bend multiplyNumbersput multiplyNumbers(2, 4) -- 输出8```这些只是Lingo的一些基本概念和用法。
(完整版)lingo初级入门手册
LINGO软件使用
LINGO是美国LINDO系统公司开发的一套专门用 于求解最优化问题的软件.它为求解最优化问题提供 了一个平台,主要用于求解线性规划、非线性规划、 整数规划、二次规划、线性及非线性方程组等问 题.它是最优化问题的一种建模语言,包含有许多常 用的函数供使用者编写程序时调用,并提供了与其他 数据文件的接口,易于方便地输入,求解和分析大规 模最优化问题,且执行速度快.由于它的功能较强, 所以在教学、科研、工业、商业、服务等许多领域得 到了广泛的应用.
STUDENTS/1..5/:NAME,AGE; ENDSETS
数学建模及其实验
数学建模及其实验
数学建模及其实验
数学建模及其实验
派生集:
Setname(parent_set_list(源集列表))[/member_list/][:attribute_list];
图1.1中最外层的窗口是LINGO软件的主窗口(LINGO软件的用户界 面),所有其他窗口都在这个窗口之内.主窗口有:标题栏、菜单栏、工 具栏和状态栏.目前,状态栏最左边显示的是“Ready”,表示准备就绪, 右下角显示的是当前时间,时间前面是当前光标的位置“Ln 1,Col 1” (即1行1列).将来用户可以用选项命令(LINGO|Options|Interface菜单 命令)决定是否需要显示工具栏和状态栏.
LINGO|Solution(Ctrl-O)(解答)命令显示当前解
• LINGO|Range(Ctrl-R)
LINGO|Range(Ctrl-R)(灵敏度分析)命令显示当前解的灵敏度分析结 果.(你必须在此之前求解过当前模型)
数学建模及其实验
• LINGO|Options(Ctrl-I)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5、模型中使用的参数数量级要适当 (如小于103)
优化建模
1. LINGO入门 2.在LINGO中使用集合
3. 运算符和函数
2.在LINGO中使用集合 4. LINGO的主要菜单命令 5. LINGO命令窗口 6.习题
优化建模
集合的基本用法和LINGO模型的基本要素
例 SAILCO公司需要决定下四个季度的帆船生产量。下 理解LINGO建模语言最重要的是理解集合(Set)及其 四个季度的帆船需求量分别是40条,60条,75条,25条, 属性(Attribute)的概念。 这些需求必须按时满足。每个季度正常的生产能力是40 条帆船,每条船的生产费用为400美元。如果加班生产, 每条船的生产费用为450美元。每个季度末,每条船的 库存费用为20美元。假定生产提前期为0,初始库存为 10条船。如何安排生产可使总费用最小?
有效步数
优化建模
• 运行状态窗口 注:凡是可以从一个约束直接解出变量取值时,这个 变量就不认为是决策变量而是固定变量,不列入统计 中;只含有固定变量的约束也不列入约束统计中。
优化建模
一个简单的LINGO程序
例 直接用LINGO来解如下二次规划问题:
2 Max 98 x1 277 x2 x12 0.3 x1 x2 2 x2
优化建模
约束的定义方式 本例中,对于产品数量的平衡方程,由于下标i=1时的 约束关系式与i=2,3,4时有所区别,所以不能省略下 标“i”。实际上,i=1时要用到变量INV(0),但定义 的属性变量中INV不包含INV(0)(INV(0)=10是一个已 知的)。 为了区别i=1和i=2,3,4,把i=1时的约束关系式单独写 出,即“INV(1)=10+RP(1)+OP(1)-DEM(1);” ; 而对i=2,3,4对应的约束,对下标集合的元素(下标i) 增加了一个逻辑关系式“i#GT#1”(这个限制条件与集 合之间有一个竖线“|”分开,称为过滤条件)。 限制条件“i#GT#1”是一个逻辑表达式,意思就是i>1; “#GT#”是逻辑运算符号,意思是“大于(Greater Than的字首字母缩写)” 。
约束的定义方式 循环函数 @FOR(集合(下标):关于集合的属性的约束关系式) 对冒号“:”前面的集合的每个元素(下标),冒号 “:”后面的约束关系式都要成立 本例中,每个季度正常的生产能力是40条帆船,这正是 语句“@FOR(QUARTERS(I):RP(I)<40);”的含义。 由于对所有元素(下标I),约束的形式是一样的,所以也 可以像上面定义目标函数时一样,将下标i省去, 这个语句可以简化成“@FOR(QUARTERS:RP<40);” 。
除“LG4”文件外, 另外几种格式的文件 都是普通的文本文件, 可以用任何文本编辑 器打开和编辑。
•.MPS:示MPS(数学规划系统)格式的模型文件。
优化建模
• 运行状态窗口
Variables(变量数量): 变量总数(Total)、 非线性变量数(Nonlinear)、 整数变量数(Integer)。 Constraints(约束数量): 约束总数(Total)、 非线性约束个数(Nonlinear)。 Nonzeros(非零系数数量): 总数(Total)、 非线性项系数个数(Nonlinear)。 Generator Memory Used (K) (内存使用 量) • Elapsed Runtime (hh:mm:ss) (求解花费的时间)
数字型 字符-数字型 1..n stringM..stringN 1..5 Car101..car 208 1, 2, 3, 4, 5 Car101, car102, … , car208
日期(星期)型 月份型
年份-月份型
dayM..dayN monthM..monthN
MON..FRI OCT..JAN
求解 器(求 解程 序)状 态框
解的目标函数值
目前为止的 迭代次数
优化建模
• 运行状态窗口
使用的特殊求解程序 : B-and-B (分枝定界算法) Global (全局最优求解程序) Multistart(用多个初始点求解的程序)
目前为止找到的可行 解的最佳目标函数值 扩展 的求 解器 (求解 程序) 状态 框 目标函数值的界 特殊求解程序当前运行步数: 分枝数(对B-and-B程序); 子问题数(对Global程序); 初始点数(对Multistart程序)
优化建模
输出结果: 运行菜单命令“LINGO|S X=(35,65)
优化建模
输出结果备注: LINGO是将它作为PINLP(纯整数非线性规划)来求解, 因此找到的是局部最优解。
通过菜单 “WINDOW| Status Window”看到状态窗 口,可看到最佳目标值 “Best Obj”与问题的上界 “Obj Bound”已经是一样的, 当前解的最大利润与这两个 值非常接近,是计算误差引 起的。如果采用全局最优求 解程序(后面介绍),可以验 证它就是全局最优解。
优化建模
集合及其属性
• QUARTERS集合的属性 • DEM • RP
• OP
•
INV
• 1
• 2
• 3
• 4
• QUARTERS集合
优化建模
集合元素及集合的属性确定的所有变量
1 2 3 4 集合QUARTERS 的元素 定义在集 DEM DEM(1) DEM(2) DEM(3) DEM(4) 合 RP RP(1) RP(2) RP(3) RP(4) QUARTE OP OP(1) OP(2) OP(3) OP(4) RS 上的属性 INV INV(1) INV(2) INV(3) INV(4)
• 运行状态窗口
优化建模 当前模型的类型 :LP,QP,ILP,IQP,PILP, PIQP,NLP,INLP,PINLP (以I开头表示 IP,以PI开头表示PIP) 当前解的状态 : "Global Optimum", "Local Optimum", "Feasible", "Infeasible“(不可行), "Unbounded“(无界), "Interrupted“(中断), "Undetermined“(未确定) 当前约束不满足的总量(不是不 满足的约束的个数):实数(即使 该值=0,当前解也可能不可行, 因为这个量中没有考虑用上下界 命令形式给出的约束)
s.t.
x1 x2 100 x1 2 x2 x1 , x2 0 为整数
1 2 3 4
输入窗口如下:
优化建模
程序语句输入的备注: •LINGO总是根据“MAX=”或“MIN=”寻找目标函数, 而除注释语句和TITLE语句外的其他语句都是约束条 件,因此语句的顺序并不重要 。 •限定变量取整数值的语句为“@GIN(X1)”和 “@GIN(X2)”,LINGO中函数一律需要以“@”开头, 其中整型变量函数(@BIN、@GIN)和上下界限定函 数(@FREE、@SUB、@SLB)与LINDO中的命令类 似。而且0/1变量函数是@BIN函数。
优化建模
一个简单的LINGO程序
LINGO的基本用法的几点注意事项
•LINGO中不区分大小写字母;变量和行名可以超过8个字符,但 不能超过32个字符,且必须以字母开头。 •用LINGO解优化模型时已假定所有变量非负(除非用限定变量取 值范围的函数@free或@sub或@slb另行说明)。 •变量可以放在约束条件的右端(同时数字也可放在约束条件的左 端)。但为了提高LINGO求解时的效率,应尽可能采用线性表达 式定义目标和约束(如果可能的话)。 •语句是组成LINGO模型的基本单位,每个语句都以分号结尾,编 写程序时应注意模型的可读性。例如:一行只写一个语句,按照 语句之间的嵌套关系对语句安排适当的缩进,增强层次感。 •以感叹号开始的是说明语句(说明语句也需要以分号结束))。
• 当前时间
优化建模
LINGO的文件类型 •.LG4:LINGO格式的模型文件,保存了模型窗口中所 能够看到的所有文本和其他对象及其格式信息;
•.LNG:文本格式的模型文件,不保存模型中的格式信 息(如字体、颜色、嵌入对象等); •.LDT:LINGO数据文件;
•.LTF:LINGO命令脚本文件; •.LGR:LINGO报告文件; •.LTX: LINDO格式的模型文件;
优化建模
LINGO软件的基本使用方法
优化建模
LINGO
LINGO的界面
• LINGO软件的主窗口(用 户界面),所有其他窗口 都在这个窗口之内。
• 当前光标 的位置 • 模型窗口(Model Window),用于输入 LINGO优化模型(即 LINGO程序)。
• 状态行(最左边显 示“Ready”,表示 “准备就绪”)
MON, TUE, WED, THU, FRI OCT, NOV, DEC, JAN
monthYearM..monthY OCT2001..J OCT2001, NOV2001, earN AN2002 DEC2001, JAN2002
优化建模
目标函数的定义方式 @SUM(集合(下标):关于集合的属性的表达式) 对语句中冒号“:”后面的表达式,按照“:”前 面的集合指定的下标(元素)进行求和。 本例中目标函数也可以等价地写成