关于LINDO&lingo学习心得
用LinDo、LinGo求解规划问题

• • • •
程序2
• •
• • • •
•
!location problem; model: title location problem; sets:!集合段; demand/1..6/:a,b,d;!demand/1,2,3,4,5,6/:a,b,d; suply/1..2/:x,y,e; link(demand,suply):c;!导出集合; endsets data:!数据段; a=1.25,8.75,0.5,5.75,3,7.25; b=1,2.5,0.3,5.8,1,1.3; e=20,20; enddata !init:!初始段; !x y=5,1,2,7; !endinit; [obj] min=@sum(link(i,j):c(i,j)*(x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2);!目标与约束段; @for(demand(i):[demand_con]@sum(suply(j):c(i,j))=d(i);); @for(suply(i):@sum(demand(j):c(j,i))<=e(i);); @for(suply(i):@free(x); @free(y); ); end
6、尽量使用实数优化,减少整数约束和整数变量。 7、尽量使用光滑优化,减少非光滑约束的个数。 (即:少用绝对值、符号函数、多个变量求最大/ 最小值、四舍五入、取整函数等)。 8、合理设置上下界,尽量给初值。 9、参数数量级要适当。一个原则是,系数矩阵中非 零元素的绝对值不能大于10000或者小于0.0001。
lindo常用的基本语法

2、 min Z x1 3 x2 x1 2 x2 6 s.t. 3 x1 x2 15 x , x 0 1 2
2、lingo的优点 (1)可以用于求线性规划及非线性规划问 题,包括非线性整数规划问题。
(2)lingo包含内置的建模语言(常称矩阵 生成器),允许以简练、直观的方式描述 较大规模的优化模型(成千万个约束条件 和变量), 模型中所需的数据可以用一定格 式保存在独立的文件中,需要时再读取数据。
在Lingo中,所有的系统函数都必须是以“@”开头。
2、集合循环函数
集合循环函数是指对集合中的所有元素(下标) 进行循环操作的函数,如@sum,@for等。
具体的使用格式:
@循环函数名(循环变量所在的集 (循环变量)│ 过滤条件:循环表达式) 其中,如果在操作过程中没有过滤条件,可 以省略过滤条件;如果表达式是对集合的所有循 环变量进行操作,循环变量也可以省略。
LINGO软件的使用规则(3)
(6) 约束条件中的符号“≥”用 “> = ”或“>”表示, “≤”用“<=”或 “<”表示。
(7) 计算机把输入程序中的第一行默认为目标函数, 其它各约束条件可以用[_1],[_2]标明它的行号。 (8) 虽然决策变量可以放在约束条件的右端,但为 了提高Lingo的求解效率,应尽可能采用线性表达 式定义目标函数和约束条件。 (9) 在lingo中以感叹号“!”开始的是说明语句, 并且说明语句也需要以分号“;”结束,并且除 了“!”和“;”之外,说明语句中的其它字符 可以是任何字符。
3、 lingo中的灵敏度分析
在lindo中的目标函数最优值、最优解与灵敏度 而在lingo中,最优解、最 分析是一起显示出来, 优值与灵敏度分析是分别用不同的命令显示出来。 lingo中的灵敏度分析的数据输出结果与lindo 中的灵敏性分析中输出结果是相同的。 因为lingo的求解结果中是没有灵敏度分析的, 所以如果需要灵敏度分析的数据,可以通过修改 选项来实现。
Lindo教程

L i n d o教程(总53页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--LINDO使用手册LINDO Users Manual第一章 LINDO初步LINDO 是 Linear INteractive Discrete Optimizer的缩写,是一个线性和整数规划的软件系统。
这里介绍的LINDO/386 版本,最大规模的模型的非零系数可以达到1,000,000个,最大变量个数可以达到100,000个,最大目标函数和约束条件个数可以达到32000个,最大整数变量个数可以达到100,000个。
它的特点是采用交互方式操作,而且命令简单明了,很容易掌握。
用户在输入初步的数学模型后,可以一边运行,一边修改调试,直至获得满意的结果。
LINDO既是一个实用的求解大规模线性和整数规划系统,也很适用于训练的目的,用来培养学生面对较复杂的实际问题,构造线性及整数规划模型以及求解这些问题的能力。
限于本教材的内容,本手册只介绍有关线性规划和整数规划的基本内容,省略了有关二次规划、参数规划以及有关线性规划算法的比较专门的内容。
§ LINDO 命令一览表LINDO 命令纳成十一类,每一类的名称及所属命令如下:1、查询类(Information)HELP 求助COM ( Command ) 命令列表LOCAL 当前版本信息CAT ( Categories ) 命令分类TIME 显示当前时间DATE 显示当前日期2、文件输入类 ( Input )MAX 键盘输入极大化模型MIN 键盘输入极小化模型RETR ( Retrieve ) 从磁盘读入模型文件RMPS ( Read MPS ) 从磁盘读入MPS文件TAKE 从磁盘读入模型或命令文件LEAV ( LEAVE ) TAKE命令的终止RDBC* 读取用SBDC命令保存的基列作为初始基FBR * 读取用FBS命令保存的基FINS* 读取用MPS格式保存的基3、显示类(Display)PIC ( Picture ) 显示矩阵中非零元素的分布及数量级TABL ( Tableau ) 显示当前单纯形表LOOK 显示模型的数学形式NONZ ( Nonzeros ) 显示解中的非零变量SHOC ( Show Column ) 显示模型中的一列SOLU ( Solution ) 显示当前得到的解RANGE 显示灵敏度分析的结果BPIC* 显示三角化的当前基逆矩阵CPRI* 显示所选择列的有关信息RPRI* 显示所选择行的有关信息DMPS* 显示以MPS格式表示的解PPIC* 显示行列重新排列的矩阵,使非零元素最靠近对角线224、文件输出类 ( File Output )SAVE 模型存盘DIVE ( Divert ) 将屏幕输出转向磁盘文件RVRT ( Revert ) 重新回到屏幕输出状态SMPS ( Save MPS ) 模型以 MPS 格式存盘SDBC* 将当前基的列向量以文件形式保存FBS* 将当前基以文件形式保存FPUN* 将当前基以MPS形式保存SMPN* 将当前模型用非标准的MPS格式保存5、求解类(Solution)GO 求解一个模型PIV(Pivot) 进行一次单纯形叠代GLEX* 用字典序方法优化6、问题编辑类 ( Problem Editing )ALT(Alter) 修改模型中的系数EXT(Extension) 增加一个约束DEL(Delete) 删除一个约束SUB(Simple Upper Bound) 给出一个变量的上界APPC(Append Column) 增加一列SLB(Simple Lower Bound) 给出一个变量的下界FREE 取消一个变量的上下界EDIT 用全屏幕编辑建立或修改模型7、退出 ( Quit )QUIT 退出 LINDO 系统338、整数规划、二次规划和参数规划 ( Integer, Quadratic and Parametric Programs )INT 定义一个0-1变量QCP*(Quadratic Programming) 定义二次规划PARA*(Parametric Programming)求解参数规划POSD*(Positive Definiteness) 检查二次规划矩阵的正定性TITAN* 紧缩连续变量的上界以及0-1变量的系数BIP* 在整数规划中给出一个剪枝的界GIN (General Integer)定义一个整数变量IPTOL* 设定整数规划最优解的宽容度9、对话参数 ( Conversational Parameters )WIDTH 设置打印机宽度TERS ( Terse ) 简洁输出信息VERB ( Verbose ) 冗长输出信息BAT ( Batch ) 成批输出信息PAGE 设定屏幕页的大小PAUSE 暂停10、用户子程序USER 执行用户提供的子程序11、杂项INV* (INVERT)求当前基的逆矩阵,以减少叠代误差STAT (STATISTICS)统计模型矩阵的系数BUG 如发现系统缺陷,提供有关信息SET 设置LINDO的内部参数TITL (TITLE)给出模型的标题44§ LINDO 初步操作以下命令,可以完成模型输入,模型显示,模型运行,退出LINDO等操作,这些命令是:•MAX 开始输入一个极大化模型•MIN 开始输入一个极小化模型•TITL 输入模型标题•EDIT 全屏幕输入或全屏幕编辑一个模型•LOOK 在屏幕上显示已输入的模型•GO 模型运行•QUIT 退出LINDO,返回操作系统在这一章中,先对这几个命令的用法作详细解说。
LINDO LINGO使用简介

1 LINDO菜单命令和语句1.1菜单命令我们可以从类似于其它Windows程序的便捷菜单访问LINDO的命令。
主菜单包括屏幕顶部的6个子菜单,它们列出了各种命令。
当单击其中一个子菜单——File、Edit、Solve、Reports、Window或Help时,将出现了一个包含各种命令的下拉菜单。
你可以像在大多数windows程序中那样选择命令——或者用鼠标单击命令,或者在适当的子菜单亮显时,按命令名中带下划线的字母。
许多命令还有快捷键(F2、Ctrl+Z等)。
为了增加方便性,还可以利用位于屏幕顶部工具栏中的图标访问一些最常用的命令。
下面简要介绍各种菜单命令,并列出了可以应用的快捷键和图标。
1.File(文件)菜单File菜单命令能够以各种方法操纵LINDO数据文件。
可以使用这个命令打开、关闭、保存和打印文件,并且可以执行LINDO独有的各种任务。
下面将描述File命令。
命令说明New F2 创建用于输入数据的新窗口。
Open F3 打开已有的文件。
利用对话框可以选择各种文件类型和位置。
View F4 打开已有的文件,仅进行浏览。
不对文件进行修改。
Save F5 保存窗口。
可以保存输入数据(模型)、Reports窗口或命令窗口。
可以下列格式保存数据:*.LTX,可以利用字处理软件进行编辑的文本格式;*.LPK,以“填充”格式保存编译模型,但是不进行特殊的格式化或解释;*.MPS,与机器无关的工业标准格式,用于在LINDO和其它LP软件之间传递LP问题。
Save As F6 利用指定的文件名保存活动窗口。
这特别适合于重命名已修改的文件,同时能够保持原始文件不受影响。
Close F7 关闭活动窗口。
如果窗口包含新的输入数据,将询问你是否保存修改。
Print F8 把活动窗口发送到打印机。
Printer Setup…F9 选择打印机和打印格式的各种选项。
Log Output…F10 把通常发送到Reports窗口的所有后续屏幕活动发送到文本文件中。
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:给出当前目标函数值
第5讲 LINDO简介

4.4 影子价格(Dual Price)
在LINDO解决方案的Slack or Surplus项后面一般还 有Dual Price项,它表示约束函数的右侧值(RHS)每 “增加”一单位,目标函数将“增加”的值。这里的 “增加”是相对求关于MAX问题而言;相对求关于 MIN线性问题来说,则为RHS值每增加一单位,目标 函数将减少的值。如果此值为负数,则对于MAX线性 问题而言,RHS值每增加一单位,目标函数将“增加” 一个负值,即将减少的值;对于求关于MIN线性问题来 说就是将要增加的值。
5.3 Debug子菜单
用Debug命令诊断一个模型的错误是很方便的。而许 多模型的错误往往出现在充分行和必要行上。所谓充 分行(Sufficent Rows)是指: 如果从模型中删去这个约束 条件,将使模型变为可行。并不是每个模型都有充分 行,但每一个无可行解或最优解模型都有必要行(Neces –sary Rows)。必要行是指一个约束条件是非法的,但
X<=10 Y<=12 X+2Y<=16 END
3.2.4 类型说明语句的写法
类型说明语句一般写在结束语句END的后面,下面 分别加以介绍:
Free<Variable> 设置变量为任意值,包括正数和 负数. 如果程序中没有此说明语 句,则变量默认为正数.
Gin<Variable> 设置变量为整数.
选择“是”,然后选Close键,就得到分析结果。也 可以选“否”,然后在Solutions下拉菜单中选Range项, 同样可以得到灵敏度分析结果。
灵敏度分析有两个结果:
(一) 在最优解不变条件下目标函数系数的允许变化范 围(RANGES IN WHICH THE BASIS IS UNCHANGED: OBJ COEFFICIENT RANGES):
LINDO简介
在输入的最后一行中“qcp 4” ,表示原问题中的实际约束是从输入的第四行开始的,注 意这里“s.t.”并不能算作是一行,而“c3)”行才是真正的第四行。 对该问题求解,得到的报告窗口为:
可以看出,迭代了 7 步,得到最优解(0.666667,0.333333) ,最优值 1.355556。求解二 次规划时的灵敏度分析也同整数规划类似,是没有意义的,我们无法利用。 注意在求解二次规划时,最好是将最大化问题都改写为最小化问题来求解。
目前整数规划尚无相应完善的灵敏度分析,因此检验数和影子价格无实际意义。
五、求解二次规划
利用 LINDO 求解二次规划时需要对问题进行改写才能够进行,我们通过事例来进行说 明。 例 3.求解下述二次规划问题:
2 2 + x2 − x1 x 2 + 0.4 x2 min z = 3 x1
1.2 x1 + 0.9 x 2 > 1.1 x + x = 1 1 2 s.t . x 2 < 0.7 x1 , x2 ≥ 0
题目中有三个约束条件是我们需要考虑的,而第四个约束(非负约束)在 LINDO 中可 以不去考虑,因此我们设出与有效约束数目相同的变量 L1、L2、L3,它们分别对应三个约 束,然后写出下述函数:
2 2 3 x1 + x2 − x1 x 2 + 0.4 x 2 − L1(1.2 x1 + 0.9 x 2 − 1.1)
+ L2( x1 + x 2 − 1) + L 3( x 2 − 0.7 )
由该函数可以看出,它的第一部分就是目标函数,而 L1 与第一个约束相乘,L2 与第二 个约束相乘,L3 与第三个约束相乘。由于第一个约束是“>” ,因此在 L1 前面用的是减号。 将该函数分别对两个决策变量求偏导,并令其大于零,得到两个线性约束:
数学建模软件LinDoLinGo的简介(修改)
X——表示变量X可取任意实数值。 GIN X——表示变量X只取非负整数值。 INT X——表示变量X只能取0或1。 SLB X value——表示变量X以value为下界。 SUB X value——表示变量X以value为上界。 FREE m——表示问题的前m个变量为自由变量 GIN m——表示问题前m个变量为非负整数值 INT m——表示问题前m个变量为0-1变量。
LINGO 示例
查看简单例子
LINHGO程序
Lindo模型到Lingo模型的转换
“ST”在Lingo模型中不再需要,所以删除了; 在每个系数与变量之间增加了运算符“*”;
将目标函数的表示方式从“MAX”变成“MAX=”;
每行(目标、约束和说明语句)后面均增加了一
个分号“;”; 约束的名字被放ngo中模型以“Model:”开始,以“END”结束。 对简单模型,这两个语句也可以省略。
LINDO/LINGO软件 使用简介
LinDo/LinGo简介
LINDO(Linear Interactive and Discrete Optimizer),即“交互式的线性和离散优化求解 器”,可以用来求解线性规划(LP)和二次规划 (QP); LINGO(Linear Interactive and General Optimizer),即“交互式的线性和通用优化求解 器”,除了用来求解线性规划(LP)、二次规划 (QP)和非线性规划,还可用于线性和非线性方程 组的求解。 最大的特色:允许决策变量是整数(即整数规划,包 括0-1规划)。
Lindo求解整数规划
Lindo求解整数规划程序
LP OPTIMUM FOUND AT STEP 2 OBJECTIVE VALUE = 998.811951
lingo-lindo简介
Lingo、lindo简介一、软件概述 (1)二、快速入门 (4)三、Mathematica函数大全--运算符及特殊符号 (11)参见网址: /一、软件概述(一)简介LINGO软件是由美国LINDO系统公司研发的主要产品。
LINGO是Linear Interactive and General Optimizer的缩写,即交互式的线性和通用优化求解器。
LINGO可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。
其特色在于内置建模语言,提供十几个内部函数,可以允许决策变量是整数(即整数规划,包括 0-1 整数规划),方便灵活,而且执行速度非常快。
能方便与EXCEL,数据库等其他软件交换数据。
LINGO实际上还是最优化问题的一种建模语言,包括许多常用的函数可供使用者建立优化模型时调用,并提供与其他数据文件(如文本文件、Excel 电子表格文件、数据库文件等)的接口,易于方便地输入、求解和分析大规模最优化问题。
(二)LINGO的主要特点:Lingo 是使建立和求解线性、非线性和整数最佳化模型更快更简单更有效率的综合工具。
Lingo 提供强大的语言和快速的求解引擎来阐述和求解最佳化模型。
1 简单的模型表示LINGO 可以将线性、非线性和整数问题迅速得予以公式表示,并且容易阅读、了解和修改。
LINGO的建模语言允许您使用汇总和下标变量以一种易懂的直观的方式来表达模型,非常类似您在使用纸和笔。
模型更加容易构建,更容易理解,因此也更容易维护。
2 方便的数据输入和输出选择LINGO 建立的模型可以直接从数据库或工作表获取资料。
同样地,LINGO 可以将求解结果直接输出到数据库或工作表。
使得您能够在您选择的应用程序中生成报告。
3 强大的求解器LINGO拥有一整套快速的,内建的求解器用来求解线性的,非线性的(球面&非球面的),二次的,二次约束的,和整数优化问题。
Lindo软件
保存文件
选择File|Save(F5)命令把 结果报告”保存在一个文件中 选择 命令把“结果报告 保存在一个文件中 命令把 结果报告 (缺省的后缀名为 缺省的后缀名为LTX,即LINDO文本文件 文本文件) 缺省的后缀名为 即 文本文件 类似地,回到模型窗口, 类似地,回到模型窗口,可以把输入的模型保存在一个 文件中。保存的文件将来可以用File |Open(F3)和File | 文件中。保存的文件将来可以用 和 View(F4)重新打开,用前者打开的程序可以进行修改, 重新打开,用前者打开的程序可以进行修改, 重新打开 而后者只能浏览。 而后者只能浏览。 如果模型有错误,运行时会弹出出错信息报告窗口 (LINDO Error Message),则需要修改模型。 ,则需要修改模型。
模型求解
用鼠标点击工具栏中的图标 , 或从菜单中选择Solve|Solve(Ctrl+S)命令 或从菜单中选择 命令
LINDO首先开始编译 首先开始编译 这个模型, 编译没有 这个模型 , 错误则开始求解; 错误则开始求解; 求解时会首先显示如 右 图 所 示 的 LINDO “求解器运行状态窗 口 ”。
显示整数规划当前的最佳目标值: 显示整数规划当前的最佳目标值:“N/A” (No Best IP Answer或Not Applicable)表示无答案或无意义, 表示无答案或无意义, 或 表示无答案或无意义 (整数规划当前的最佳 整数规划当前的最佳 因为这个模型中没有整数变量,不是整数规划(IP) 因为这个模型中没有整数变量,不是整数规划 目标值) 目标值 。
Close(关闭 关闭) 关闭
பைடு நூலகம்
模型求解
紧接着弹出一对话框, 紧接着弹出一对话框,询问你是否需要做灵敏性分析 (DO RANGE (SENSITIVITY) ANALYSIS? )先选择 否 先选择“否 先选择 (N)”按钮,这个窗口就会关闭。然后,再把状态窗口也 按钮,这个窗口就会关闭。然后, 按钮 关闭。 关闭。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网上关于LINDO/LINGO的学习心得材料1、LINDO这个就是一开始的那个软件,主要求解线性规划、整数规划、二次规划问题。
现在版本好像是6.1。
2、GINO一开始的时候这也是一个求非线性规划的工具,甚至她还用来求解一些非线性的方程根。
它的特点是:包含了丰富的数学函数,尤其是概率函数!但是随着像Mathematica/Matlab的迅速发展,他逐渐的消亡,并演化为现在的函数引擎LINDO API,呵呵,现在版本2.0。
3、LINGO/LINGO NL大家现在看到的LINGO8.0在一开始也是两部分:LINGO and LINGO NL,他们分别用于求解线性、整数规划以及非线性、线性、整数规划问题。
可见这很混乱,所以现在就统一成为了LINGO,它与LINDO的主要主要区别在于:她内建了建模语言,可以简约的得描述大规模的优化问题。
现在版本是8.0。
4、What's the best这是一个组件,主要处理由Excell/Access生成数据文件的规划问题,安装之后会在你的Office中添加一个名为What's the best的宏,启用后会在Excell中生成一个工具条,就像Adobe的pdf插件一样。
现在版本是7.0。
注解:上面这些旨在说明这些软件名字是有各自的含义的,首先要明确他们各自的长处是什么,才能有的放矢!至于学习方法,很简单,阅读、运行程序自带实例。
呵呵,打算每天一个例子吧:)一些他们的区别在具体例子中会比较说明!说一下这里的lindo和lingo程序结构的差异:1、基本程序架构(1)lindo是这样的:MAX 目标函数表达ST变量约束1变量约束2变量约束3END(2)lingo是这样的:MAX=目标函数表达;变量约束1;变量约束2;变量约束3;注意:可见它们的基本frame不同,在lingo80中每个语句后面必须以分号结束,包括以开头的注释语句。
2、简单的示例假设现在一个计算机厂商要生产两种型号的PC:标准型(standard)和增强型(turbo),由于生产线和劳动力工作时间的约束,使得标准型PC最多生产100台。
增强型PC最多生产120台;一共耗时劳动力时间不能超过160小时。
已知每台标准型PC可获利润$100,耗掉1小时劳动力工作时间;每台增强型PC可获利润$150,耗掉2小时劳动力工作时间。
请问:该如何规划这两种计算机的生产量才能够使得最后获利最大?这个问题是标准的线性规划,目标函数是100*standard+150*turbo最大!lindo/lingo的程序分别如下:(1)[lindo sourcecode]:max 100 standard+150 turboststandard<=100turbo<=120standard+2 turbo<=160end运行结果如下:LP OPTIMUM FOUND AT STEP 2OBJECTIVE FUNCTION V ALUE1) 14500.VARIABLE V ALUE REDUCED COSTSTANDARD 100.000000 0.000000TURBO 30.000000 0.000000ROW SLACK OR SURPLUS DUAL PRICES2) 0.000000 25.0000003) 90.000000 0.0000004) 0.000000 75.000000NO. ITERATIONS= 2注解:第一行告知线性优化步数为2,下面是目标函数值=14500,在standard=100/turbo=30时取到;下面是对偶值。
(2)[lingo sourcecode]:max=100*standard+150*turbo;standard<=100;turbo<=120;standard+2*turbo<=160;运行结果如下:Global optimal solution found at iteration: 3Objective value: 14500.00Variable Value Reduced CostSTANDARD 100.0000 0.000000TURBO 30.00000 0.000000Row Slack or Surplus Dual Price1 14500.00 1.0000002 0.000000 25.000003 90.00000 0.0000004 0.000000 75.00000注意:同样的一个问题,lingo却用了3次迭代!实际上lingo的长处在于它的内建的建模语言,从而刻画大型的规划问题简单,小规模的规划问题好像lindo有更好的效率!我实际上更喜欢用lingo,总觉得她和matlab更接近一点!特别是一些基本的数学运算符。
非常不习惯lindo不用*表示乘,却用空格,sigh...从本部分介绍lingo的强大的数学优化建模语言。
这是他专门为大规模优化建模提供的一套规范语言,下面介绍简单的例子来说明他的基本组成。
一、原始问题(运输问题):现在WW(Wireless Widgets)公司拥有6个仓库,向其8个销售商供应它的产品。
要求每个仓库供应不能超量,每个销售商的需求必须得到满足。
WW公司需要决策具体的从每个仓库运输多少产品到每个销售商。
以使得所花的运输费用最少?二、问题的已知数据:1、产品仓库数据:仓库编号产品库存量1 602 553 514 435 416 522、销售商产品需求:销售商编号产品需求量1 352 373 224 325 416 327 438 383、每件产品运输费用($):销售商[右] V1 V2 V3 V4 V5 V6 V7 V8仓库[下]Wh1 6 2 6 7 4 2 5 9Wh2 4 9 5 3 8 5 8 2Wh3 5 2 1 9 7 4 3 3Wh4 7 6 7 3 9 2 7 1Wh5 2 3 9 5 7 2 6 5Wh6 5 5 2 2 8 1 4 3三、目标函数描述:线性优化建模的重要一步就是构造目标函数,正如上面提到的,在此问题中,WW 公司欲使总的运输费用最小。
现在令:变量VOLUME_I_J 表示从仓库I到销售商J运送的产品数目。
这样我们就可以写出如下的目标函数:MIN = 6 * VOLUME_1_1 + 2 * VOLUME_1_2 + 6 * VOLUME_1_3 + 7 * VOLUME_1_4 +4 * VOLUME_1_5 +...8 * VOLUME_6_5 + VOLUME_6_6 + 4 * VOLUME_6_7 +3 * VOLUME_6_8;当然上面是个简写形式。
很明显的上面的目标函数如此的冗长,很容易导致输入错误。
现实中的情况往往是销售商成千上万个,如果还是使用上述的方法就难以想象了。
熟悉规划数学定义的人可以很轻易的用下面的方式表达上述的目标函数:Minimize SUM(ij)(COST_ij*VOLUME_ij)LINGO就是采用这种类似的方式来描述规划模型的,比如这个例子的等价的LINGO语句就是: MIN = @SUM( LINKS(I,J): COST(I,J) * VOLUME(I,J));总之:LINGO的规划语言很适合熟悉数学的人使用,很自然。
上面的@SUM是系统函数,后面会介绍常见系统函数:P四、变量约束:这里有两种约束,第一种是供货约束,第二种是接货约束。
例如:对于第一个销售商而言VOLUME_1_1 + VOLUME_2_1 + VOLUME_3_1 + VOLUME_4_1 + VOLUME_5_1 + VOLUME_6_1 = 35;如果使用原始的规划语句,要建如类似上面的语句8次呢:(有了建模语言就方便了:@FOR( VENDORS( J):@SUM( WAREHOUSES( I): VOLUME( I, J)) = DEMAND( J));类似的:@FOR( WAREHOUSES( I): @SUM( VENDORS( J): VOLUME( I, J))<= CAPACITY( I));好了,到此为止我们的模型就建起来了:MODEL:MIN = @SUM( LINKS( I, J):COST( I, J) * VOLUME( I, J));@FOR( VENDORS( J):@SUM( WAREHOUSES( I): VOLUME( I, J)) =DEMAND( J));@FOR( WAREHOUSES( I):@SUM( VENDORS( J): VOLUME( I, J)) <=CAPACITY( I));END注释:从上面可以看出一个LINGO模型必须包含在MODEL/END中间,然后在中间依次给出目标函数,约束条件等。
但是我们的数据该如何给出呢?也就是解决LINGO建模语言中的赋值问题,下面会接着介绍的,呵呵:)五、定义变量集合:我们要处理的实际建模问题中经常会遇到一类同样的问题:若干相关的对象集合。
比如:工厂稽核、客户集合、车辆集合和雇员集合等等。
通常我们希望:约束某个集合中的特定对象的条件也同样适用于同一集合内其他的对象。
这恰好是LINGO建模语言的最基本的概念。
LINGO允许在SETS段定义某些相关对象于同一个集合内。
集合段以关键字SETS开始;以关键字ENDSETS结束。
一旦你定义了集合,LINGO可以提供大量的集合循环函数(例如:@FOR), 通过简单的调用他们的语句就可以操作集合内的所有元素。
我们回到最初的例子:Wireless Widget 模型,定义如下的三个集合:仓库集,销售商集,运输路线集。
具体的定义如下:SETS:WAREHOUSES / WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY;VENDORS / V1 V2 V3 V4 V5 V6 V7 V8/ : DEMAND;LINKS( WAREHOUSES, VENDORS): COST, VOLUME;ENDSETS注解:普通集合定义格式如下:集合名/成员列表/:成员共有属性。
最后的LINKS集合,代表着48条运输路线。
每条路线分别有两个属性COST和VOLUME。
定义这种集合的语法和前面不同: LINKS( WAREHOUSES, VENDORS)上面前面两个集合成为“基本集合(Primarity Sets)”,第三个集合LINKS是“派生集合(Derived Sets)”;顾名思义他是由基本集合WAREHOUSES和VENDORS派生出来的。
在这个例子中, LINGO生成每个可能的(warehouse, vendor)序对,这48个有序对组成了集合LINKS。