LINGO教程(基本语法).ppt

上传人:max****ui 文档编号:6374989 上传时间:2020-02-24 格式:PPT 页数:152 大小:1.82MB
返回 下载 相关 举报
LINGO教程(基本语法).ppt_第1页
第1页 / 共152页
LINGO教程(基本语法).ppt_第2页
第2页 / 共152页
LINGO教程(基本语法).ppt_第3页
第3页 / 共152页
点击查看更多>>
资源描述
LINGO软件的基本使用方法 内容提要 LINGO入门2 在LINGO中使用集合3 运算符和函数4 LINGO的主要菜单命令5 LINGO命令窗口 1 LINGO入门 LINGO入门2 在LINGO中使用集合3 运算符和函数4 LINGO的主要菜单命令5 LINGO命令窗口 安装文件20M多一点 需要接受安装协议 选择安装目录 缺省C LINGO9 LINGO软件的安装 安装过程 与LINDOforWindows类似 安装完成前 在出现的对话框 如图 中选择缺省的建模 即编程 语言 系统推荐的是采用LINGO 安装后可通过 LINGO Options FileFormat 命令修改缺省的建模 即编程 语言 第一次运行时提示输入授权密码 如图 LINGO软件的主要特色 两种命令模式 Windows模式 通过下拉式菜单命令驱动LINGO运行 多数菜单命令有快捷键 常用的菜单命令有快捷按钮 图形界面 使用方便 命令行模式 仅在命令窗口 CommandWindow 下操作 通过输入行命令驱动LINGO运行 这里主要介绍这种模式 从LINDO到LINGO LINGO9 0功能增强 性能稳定 解答结果可靠 与LINDO相比 LINGO软件主要具有两大优点 内置建模语言 允许以简练 直观的方式描述较大规模的优化问题 所需的数据可以以一定格式保存在独立的文件中 除具有LINDO的全部功能外 还可用于求解非线性规划问题 包括非线性整数规划问题 在LINGO中使用LINDO模型 LINGO的界面 LINGO软件的主窗口 用户界面 所有其他窗口都在这个窗口之内 模型窗口 ModelWindow 用于输入LINGO优化模型 即LINGO程序 状态行 最左边显示 Ready 表示 准备就绪 当前时间 当前光标的位置 LINGO的文件类型 LG4 LINGO格式的模型文件 保存了模型窗口中所能够看到的所有文本和其他对象及其格式信息 LNG 文本格式的模型文件 不保存模型中的格式信息 如字体 颜色 嵌入对象等 LDT LINGO数据文件 LTF LINGO命令脚本文件 LGR LINGO报告文件 LTX LINDO格式的模型文件 MPS 示MPS 数学规划系统 格式的模型文件 除 LG4 文件外 另外几种格式的文件都是普通的文本文件 可以用任何文本编辑器打开和编辑 在LINGO中使用LINDO模型 选择菜单命令 File Open F3 可以看到 打开文件 对话框 如图 在LINGO中可以直接使用LINDO语法编写的优化模型 即优化程序 作为一个最简单的例子 在名为EXAM0201 LTX的模型文件中保存了一个LINDO模型 我们现在看看如何用LINGO把它打开 在LINGO中使用LINDO模型 打开 EXAM0201 LTX 文件 如下图 选择 LINGO Solve Ctrl S 来运行这个程序 运行状态窗口如右图 运行程序的LINGO报告窗口 如下图 在LINGO中使用LINDO模型 注 LINGO不询问是否进行敏感性分析 敏感性分析需要将来通过修改系统选项启动敏感性分析后 再调用 REPORT RANGE 菜单命令来实现 现在同样可以把模型和结果报告保存在文件中 运行状态窗口 Variables 变量数量 变量总数 Total 非线性变量数 Nonlinear 整数变量数 Integer Constraints 约束数量 约束总数 Total 非线性约束个数 Nonlinear Nonzeros 非零系数数量 总数 Total 非线性项系数个数 Nonlinear GeneratorMemoryUsed K 内存使用量 ElapsedRuntime hh mm ss 求解花费的时间 运行状态窗口 求解器 求解程序 状态框 当前模型的类型 LP QP ILP IQP PILP PIQP NLP INLP PINLP 以I开头表示IP 以PI开头表示PIP 当前解的状态 GlobalOptimum LocalOptimum Feasible Infeasible 不可行 Unbounded 无界 Interrupted 中断 Undetermined 未确定 解的目标函数值 当前约束不满足的总量 不是不满足的约束的个数 实数 即使该值 0 当前解也可能不可行 因为这个量中没有考虑用上下界命令形式给出的约束 目前为止的迭代次数 运行状态窗口 扩展的求解器 求解程序 状态框 使用的特殊求解程序 B and B 分枝定界算法 Global 全局最优求解程序 Multistart 用多个初始点求解的程序 目前为止找到的可行解的最佳目标函数值 目标函数值的界 特殊求解程序当前运行步数 分枝数 对B and B程序 子问题数 对Global程序 初始点数 对Multistart程序 有效步数 注 凡是可以从一个约束直接解出变量取值时 这个变量就不认为是决策变量而是固定变量 不列入统计中 只含有固定变量的约束也不列入约束统计中 运行状态窗口 LINGO早期版本对LINDO的兼容问题 在LINGO9 0以前的版本中不能直接用File Open命令打开LINDO模型 但由FILE IMPORTLINDOFILE F12 命令可以直接把LINDO的模型文件转化成LINGO模型 运行后屏幕上会显示一个标准的 打开文件 的对话框 打开EXAM0201 LTX 在LINGO主窗口中又打开了命令窗口 CommandWindow 显示原始文件 名为 exam0201 的模型窗口显示的是等价的LINGO模型 当前光标位于命令窗口 从LINDO模型到LINGO模型的实质性转化工作主要在于以下几个方面 这也是LINGO模型的最基本特征 将目标函数的表示方式从 MAX 变成了 MAX ST SubjectTo 在LINGO模型中不需要 被删除 在系数与变量之间增加运算符 即乘号不能省略 每行 目标 约束和说明语句 后面增加一个分号 约束的名字被放到 中 不放在右半括号 前 LINGO中模型以 MODEL 开始 以 END 结束 对简单的模型 这两个语句也可以省略 LINGO早期版本对LINDO的兼容问题 一个简单的LINGO程序 例直接用LINGO来解如下二次规划问题 输入窗口如下 程序语句输入的备注 LINGO总是根据 MAX 或 MIN 寻找目标函数 而除注释语句和TITLE语句外的其他语句都是约束条件 因此语句的顺序并不重要 限定变量取整数值的语句为 GIN X1 和 GIN X2 不可以写成 GIN 2 否则LINGO将把这个模型看成没有整数变量 LINGO中函数一律需要以 开头 其中整型变量函数 BIN GIN 和上下界限定函数 FREE SUB SLB 与LINDO中的命令类似 而且0 1变量函数是 BIN函数 输出结果 运行菜单命令 LINGO Solve 最优整数解X 35 65 最大利润 11077 5 输出结果备注 通过菜单 WINDOW StatusWindow 看到状态窗口 可看到最佳目标值 BestObj 与问题的上界 ObjBound 已经是一样的 当前解的最大利润与这两个值非常接近 是计算误差引起的 如果采用全局最优求解程序 后面介绍 可以验证它就是全局最优解 LINGO是将它作为PINLP 纯整数非线性规划 来求解 因此找到的是局部最优解 一个简单的LINGO程序 LINGO的基本用法的几点注意事项 LINGO中不区分大小写字母 变量和行名可以超过8个字符 但不能超过32个字符 且必须以字母开头 用LINGO解优化模型时已假定所有变量非负 除非用限定变量取值范围的函数 free或 sub或 slb另行说明 变量可以放在约束条件的右端 同时数字也可放在约束条件的左端 但为了提高LINGO求解时的效率 应尽可能采用线性表达式定义目标和约束 如果可能的话 语句是组成LINGO模型的基本单位 每个语句都以分号结尾 编写程序时应注意模型的可读性 例如 一行只写一个语句 按照语句之间的嵌套关系对语句安排适当的缩进 增强层次感 以感叹号开始的是说明语句 说明语句也需要以分号结束 2 在LINGO中使用集合 LINGO入门2 在LINGO中使用集合3 运算符和函数4 LINGO的主要菜单命令5 LINGO命令窗口6 习题 集合的基本用法和LINGO模型的基本要素 理解LINGO建模语言最重要的是理解集合 Set 及其属性 Attribute 的概念 例SAILCO公司需要决定下四个季度的帆船生产量 下四个季度的帆船需求量分别是40条 60条 75条 25条 这些需求必须按时满足 每个季度正常的生产能力是40条帆船 每条船的生产费用为400美元 如果加班生产 每条船的生产费用为450美元 每个季度末 每条船的库存费用为20美元 假定生产提前期为0 初始库存为10条船 如何安排生产可使总费用最小 用DEM RP OP INV分别表示需求量 正常生产的产量 加班生产的产量 库存量 则DEM RP OP INV对每个季度都应该有一个对应的值 也就说他们都应该是一个由4个元素组成的数组 其中DEM是已知的 而RP OP INV是未知数 问题的模型 可以看出是LP模型 目标函数是所有费用的和 约束条件主要有两个 1 能力限制 2 产品数量的平衡方程 加上变量的非负约束 注 LINDO中没有数组 只能对每个季度分别定义变量 如正常产量就要有RP1 RP2 RP3 RP44个变量等 写起来就比较麻烦 尤其是更多 如1000个季度 的时候 记四个季度组成的集合QUARTERS 1 2 3 4 它们就是上面数组的下标集合 而数组DEM RP OP INV对集合QUARTERS中的每个元素1 2 3 4分别对应于一个值 LINGO正是充分利用了这种数组及其下标的关系 引入了 集合 及其 属性 的概念 把QUARTERS 1 2 3 4 称为集合 把DEM RP OP INV称为该集合的属性 即定义在该集合上的属性 集合及其属性 集合元素及集合的属性确定的所有变量 LINGO中定义集合及其属性 LP模型在LINGO中的一个典型输入方式 以 MODEL 开始 以 END 结束 给出优化目标和约束 目标函数的定义方式 SUM 集合 下标 关于集合的属性的表达式 对语句中冒号 后面的表达式 按照 前面的集合指定的下标 元素 进行求和 本例中目标函数也可以等价地写成 SUM QUARTERS i 400 RP i 450 OP i 20 INV i SUM 相当于求和符号 QUARTERS i 相当于 iQUARTERS 的含义 由于本例中目标函数对集合QUARTERS的所有元素 下标 都要求和 所以可以将下标i省去 约束的定义方式 循环函数 FOR 集合 下标 关于集合的属性的约束关系式 对冒号 前面的集合的每个元素 下标 冒号 后面的约束关系式都要成立 本例中 每个季度正常的生产能力是40条帆船 这正是语句 FOR QUARTERS I RP I 40 的含义 由于对所有元素 下标I 约束的形式是一样的 所以也可以像上面定义目标函数时一样 将下标i省去 这个语句可以简化成 FOR QUARTERS RP 40 本例中 对于产品数量的平衡方程 由于下标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 是逻辑运算符号 意思是 大于 GreaterThan的字首字母缩写 约束的定义方式 问题的求解 运行菜单命令 LINGO Solve 最小成本 78450 注 由于输入中没有给出行名 所以行名是系统自动按照行号1 9生成的 选择菜单命令 LINGO Generate Displymodel Ctrl G 可以得到展开形式的模型 如图 可以看到完整的模型 也能确定行号 行号放在方括号 中 且数字前面带有下划线 最好在输入模型时用户主动设定约束的行名 即约束名 使程序清晰些 单一约束的行名设置方法就是将行名放在方括号 中 置于约束之前 后面将结合具体例子介绍在使用集合的情况下如何设置行名 小结 LINGO模型最基本的组成要素 一般来说 LINGO中建立的优化模型可以由五个部分组成 或称为五 段 SECTION 1 集合段 SETS 以 SETS 开始 ENDSETS 结束 定义必要的集合变量 SET 及其元素 MEMBER 含义类似于数组的下标 和属性 ATTRIBUTE 含义类似于数组 如上例中定义了集合quarters 含义是季节 它包含四个元素即四个季节指标 1 2 3 4 每个季节都有需求 DEM 正常生产量 RP 加班生产量 OP 库存量 INV 等属性 相当于数组 数组下标由quarters元素决定 一旦这样的定义建立起来 如果quarters的数量不是4而是1000 只需扩展其元素为1 2 1000 每个季节仍然都有DEM RP OP INV这样的属性 这些量的具体数值如果是常量 则可在数据段输入 如果是未知数 则可在初始段输入初值 当quarters的数量不是4而是1000时 没有必要把1 2 1000全部一个一个列出来 而是可以如下定义quarters集合 quarters 1 1000 DEM RP OP INV 1 1000 的意思就是从1到1000的所有整数 2 目标与约束段 目标函数 约束条件等 没有段的开始和结束标记 因此实际上就是除其它四个段 都有明确的段标记 外的LINGO模型 这里一般要用到LINGO的内部函数 尤其是与集合相关的求和函数 SUM和循环函数 FOR等 上例中定义的目标函数与quarters的元素数目是4或1000并无具体的关系 约束的表示也类似 3 数据段 DATA 以 DATA 开始 ENDDATA 结束 对集合的属性 数组 输入必要的常数数据 格式为 attribute 属性 value list 常数列表 常数列表 value list 中数据之间可以用逗号 分开 也可以用空格分开 回车等价于一个空格 如上面对DEM的赋值也可以写成 DEM 40607525 在LINGO模型中 如果想在运行时才对参数赋值 可以在数据段使用输入语句 但这仅能用于对单个变量赋值 输入语句格式为 变量名 例如 上例中如果需要在求解模型时才给出初始库存量 记为A 则可以在模型中数据段写上语句 A 在求解时LINDO系统给出提示界面 等待用户输入变量A的数值 当然 此时的约束语句INV 1 10 RP 1 OP 1 DEM 1 也应该改写成INV 1 A RP 1 OP 1 DEM 1 这样 模型就可以计算任意初始库存量 而不仅仅只能计算初始库存量为10 的情况了 4 初始段 INIT 以 INIT 开始 ENDINIT 结束 对集合的属性 数组 定义初值 因为求解算法一般是迭代算法 所以用户如果能给出一个比较好的迭代初值 对提高算法的计算效果是有益的 如果有一个接近最优解的初值 对LINGO求解模型是有帮助的 定义初值的格式为 attribute 属性 value list 常数列表 这与数据段中的用法是类似的 上例中没有初始化部分 我们将在下一个例子中举例说明 5 计算段 CALC 以 CALC 开始 ENDCALC 结束 对一些原始数据进行计算处理 在实际问题中 输入的数据通常是原始数据 不一定能在模型中直接使用 可以在这个段对这些原始数据进行一定的 预处理 得到模型中真正需要的数据 例如上例 如果希望得到全年的总需求和季度平均需求 可以增加这个段 CALC T DEM SUM quarters DEM 总需求 A DEM T DEM size quarters 平均需求 ENDCALC在计算段中也可以使用集合函数 其中函数 size quarters 表示集合quarters的元素个数 这里也就是4 这时 变量T DEM的值就是总需求 A DEM的值就是平均需求 如果需要的话 这两个变量就可以在程序的其它地方作为常数使用了 注 上面的两个语句不能交换顺序 因为计算A DEM必须要用到T DEM的值 此外 在计算段中只能直接使用赋值语句 而不能包含需要经过解方程或经过求解优化问题以后才能决定的变量 基本集合与派生集合 例建筑工地的位置 用平面坐标a b表示 距离单位 公里 及水泥日用量d 吨 下表给出 有两个临时料场位于P 5 1 Q 2 7 日储量各有20吨 从A B两料场分别向各工地运送多少吨水泥 使总的吨公里数最小 两个新的料场应建在何处 节省的吨公里数有多大 建立模型 记工地的位置为 水泥日用量为 料场位置为 日储量为 从料场向工地的运送量为 使用现有临时料场时 决策变量只有 非负 所以这是LP模型 当为新建料场选址时决策变量为和 由于目标函数对是非线性的 所以在新建料场时是NLP模型 先解NLP模型 而把现有临时料场的位置作为初始解告诉LINGO 本例中集合的概念 利用集合的概念 可以定义需求点DEMAND和供应点SUPPLY两个集合 分别有6个和2个元素 下标 但决策变量 运送量 与集合DEMAND和集合SUPPLY都有关系的 该如何定义这样的属性 集合的属性相当于以集合的元素为下标的数组 这里的相当于二维数组 它的两个下标分别来自集合DEMAND和SUPPLY 因此可以定义一个由二元对组成的新的集合 然后将定义成这个新集合的属性 输入程序 定义了三个集合 其中LINK在前两个集合DEMAND和SUPPLY的基础上定义 表示集合LINK中的元素就是集合DEMAND和SUPPLY的元素组合成的有序二元组 从数学上看LINK是DEMAND和SUPPLY的笛卡儿积 也就是说LINK S T SDEMAND TSUPPLY 因此 其属性C也就是一个6 2的矩阵 或者说是含有12个元素的二维数组 LINGO建模语言也称为矩阵生成器 MATRIXGENERATOR 类似DEMAND和SUPPLY直接把元素列举出来的集合 称为基本集合 primaryset 而把LINK这种基于其它集合而派生出来的二维或多维集合称为派生集合 derivedset 由于是DEMAND和SUPPLY生成了派生集合LINK 所以DEMAND和SUPPLY称为LINK的父集合 输入程序 初始段 INGO对数据是按列赋值的语句的实际赋值顺序是X 5 2 Y 1 7 而不是X 5 1 Y 2 7 等价写法 X 5 2 Y 1 7 同理 数据段中对常数数组A B的赋值语句也可以写成A B 1 251 258 750 750 54 755 75536 57 257 75 输入程序 解答 运行菜单命令 LINGO Solve 局部最优解X 1 7 249997 X 2 5 695940 Y 1 7 749998 Y 2 4 928524 C 略 最小运量 89 8835 吨公里 问题 最小运量89 8835是不是全局最优 是用 LINGO Options 菜单命令打开选项对话框 在 GlobalSolver 选项卡上选择 UseGlobalSolver 激活全局最优求解程序 问题 最小运量89 8835是不是全局最优 此时目标函数值的下界 ObjBound 85 2638 与目前得到的最好的可行解的目标函数值 BestObj 85 2661 相差已经非常小 可以认为已经得到了全局最优解 计算结果 工地与料场示意图 表示料场 表示工地 可以认为是模型的最后结果 附注 如果要把料厂P 5 1 Q 2 7 的位置看成是已知并且固定的 这时是LP模型 只需要把初始段的 XY 5 1 2 7 语句移到数据段就可以了 此时 运行结果告诉我们得到全局最优解 变量C的取值这里略去 最小运量136 2275 吨公里 稠密集合与稀疏集合 包含了两个基本集合构成的所有二元有序对的派生集合称为稠密集合 简称稠集 有时候 在实际问题中 一些属性 数组 只在笛卡儿积的一个真子集合上定义 这种派生集合称为稀疏集合 简称疏集 例 最短路问题 在纵横交错的公路网中 货车司机希望找到一条从一个城市到另一个城市的最短路 下图表示的是公路网 节点表示货车可以停靠的城市 弧上的权表示两个城市之间的距离 百公里 那么 货车从城市S出发到达城市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的最优行驶路线 同样 为了求出从S到Ck k 1 2 的最优行驶路线 只需要先求出从S到Bj j 1 2 的最优行驶路线 为了求出从S到Bj j 1 2 的最优行驶路线 只需要先求出从S到Ai i 1 2 3 的最优行驶路线 而S到Ai i 1 2 3 的最优行驶路线是很容易得到的 实际上 此例中S到Ai i 1 2 3 只有唯一的道路 分析 此例中可把从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到城市X的最优行驶路线的路长 本例的计算 所以 从S到T的最优行驶路线的路长为20 进一步分析以上求解过程 可以得到从S到T的最优行驶路线为S A3 B2 C1 T 这种计算方法在数学上称为动态规划 DynamicProgramming 本例的LINGO求解 CITIES 城市 一个基本集合 元素通过枚举给出 L CITIES对应的属性变量 我们要求的最短路长 ROADS 道路 由CITIES导出的一个派生集合 请特别注意其用法 由于只有一部分城市之间有道路相连 所以不应该把它定义成稠密集合 将其元素通过枚举给出 这就是一个稀疏集合 D 稀疏集合ROADS对应的属性变量 给定的距离 本例的LINGO求解 从模型中还可以看出 这个LINGO程序可以没有目标函数 这在LINGO中 可以用来找可行解 解方程组和不等式组 在数据段对L进行赋值 只有L S 0已知 后面的值为空 但位置必须留出来 即逗号 一个也不能少 否则会出错 如果这个语句直接写成 L 0 语法上看也是对的 但其含义是L所有元素的取值全部为0 所以也会与题意不符 本例的LINGO求解 虽然集合CITIES中的元素不是数字 但当它以CITIES I 的形式出现在循环中时 引用下标I却实际上仍是正整数 也就是说I指的正是元素在集合中的位置 顺序 一般称为元素的索引 INDEX 在 for循环中的过滤条件里用了一个函数 index 其作用是返回一个元素在集合中的索引值 这里 index S 1 即元素S在集合中的索引值为1 所以逻辑关系式 I GT index S 可以可以直接等价地写成 I GT 1 这里 index S 实际上还是 index CITIES S 的简写 即返回S在集合CITIES中的索引值 本例的LINGO求解结果 从S到T的最优行驶路线的路长为20 进一步分析 可以得到最优行驶路线为S A3 B2 C1 T 本例中定义稀疏集合ROADS的方法是将其元素通过枚举给出 有时如果元素比较多 用起来不方便 另一种定义稀疏集合的方法是 元素过滤 法 能够从笛卡儿积中系统地过滤下来一些真正的元素 例某班8名同学准备分成4个调查队 每队两人 前往4个地区进行社会调查 这8名同学两两之间组队的效率如下表所示 由于对称性 只列出了严格上三角部分 问如何组队可以使总效率最高 分析 这是一个匹配 MATCHING 问题 把上表的效率矩阵记为BENEFIT 由于对称性 这个矩阵只有严格上三角部分共28个数取非零值 用MATCH Si Sj 1表示同学Si Sj组成一队 而MATCH Si Sj 0表示Si Sj不组队 由于对称性 只需考虑i j共28个0 1变量 而不是全部32个变量 显然 目标函数正好是BENEFIT Si Sj MATCH Si Sj 对I j之和 约束条件是每个同学只能 而且必须在 某一组 即对于任意i有 只要属性MATCH的某个下标为i就加起来 此和应该等于1 由上面的分析 因此 完整的数学模型如下 显然 这是一个0 1线性规划 问题的LINGO求解 S1 S8 等价于写成 S1S2S3S4S5S6S7S8 它没有相关的属性列表 只用于表示是一个下标集合 在派生集合PAIRS定义中增加了过滤条件 2 GT 1 意思是第2个父集合的元素的索引值 用 2 表示 大于第1个父集合的元素的索引值 用 1 表示 PAIRS中的元素对应于上表中的严格上三角部分的二维下标 共28个元素 BENEFIT和MATCH是PAIRS的属性 注意数据段对BENEFIT的赋值方式 LINGO按照列的顺序对属性变量的元素进行赋值 在约束部分 过滤条件 J EQ I OR K EQ I 是由逻辑运算符 OR 或者 连接的一个复合的逻辑关系式 连接由 EQ 等于 表示的两个逻辑关系 由于 OR 的运算级别低于 EQ 所以这个逻辑式中没有必要使用括号指定运算次序 LINGO求解结果 LINGO SOLVE 运行这个程序 可以得到全局最优值为30 MATCH变量中多数为0 可以更清晰地浏览最优解解 选择菜单命令 LINGO SOLUTION 可以看到图示对话框 选择属性MATCH 变量 选择Text 文本格式 选择NonzerosOnly 只显示非零值 点击 OK 按钮 得到关于最优解的非零分量的报告 学生最佳的组队方式是 1 8 2 4 3 7 5 6 集合的使用小结 集合的不同类型及其关系 基本集合的定义语法 基本集合的定义格式为 方括号 中的内容是可选项 可以没有 setname member list attribute list 其中setname为定义的集合名 member list为元素列表 attribute list为属性列表 元素列表可以采用显式列举法 即直接将所有元素全部列出 元素之间用逗号或空格分开 也可以采用隐式列举法 隐式列举法可以有几种不同格式 元素列表和属性列表都是可选的 当属性列表不在集合定义中出现时 这样的集合往往只是为了将来在程序中作为一个循环变量来使用 或者作为构造更复杂的派生集合的父集合使用 匹配问题中的集合STUDENTS没有属性列表 而当元素列表不在基本集合的定义中出现时 则必须在程序的数据段以赋值语句的方式直接给出元素列表 例如 前例中SAILCO公司决定四个季度的帆船生产量模型的集合段和数据段可以分别改为 SETS QUARTERS DEM RP OP INV 注意没有给出集合的元素列表 ENDSETSDATA QUARTERSDEM 140260375425 注意LINGO按列赋值的特点 ENDDATA 基本集合的定义语法 帆船生产量模型的源程序 匹配问题的源程序 派生集合的定义语法 派生集合的定义格式为 方括号 中的内容是可选项 可以没有 setname parent set list member list attribute list 与基本集合的定义相比较多了一个parent set list 父集合列表 父集合列表中的集合 如set1 set2 等 称为派生集合setname的父集合 它们本身也可以是派生集合 当元素列表 member list 不在集合定义中出现时 还可以在程序的数据段以赋值语句的方式给出元素列表 若在程序的数据段也不以赋值语句的方式给出元素列表 则认为定义的是稠密集合 即父集合中所有元素的有序组合 笛卡儿积 都是setname的元素 当元素列表在集合定义中出现时 又有 元素列表法 直接列出元素 和 元素过滤法 利用过滤条件 两种不同方式 3 运算符和函数 LINGO入门2 在LINGO中使用集合3 运算符和函数4 LINGO的主要菜单命令5 LINGO命令窗口 运算符及其优先级 算术运算符 加 减 乘 除 乘方等数学运算 即数与数之间的运算 运算结果也是数 LINGO中的算术运算符有以下5种 加法 减法或负号 乘法 除法 求幂 逻辑运算符 运算结果只有 真 TRUE 和 假 FALSE 两个值 称为 逻辑值 LINGO中用数字1代表TRUE 其他值 典型的值是0 都是FALSE 在LINGO中 逻辑运算 表达式 通常作为过滤条件使用 逻辑运算符有9种 可以分成两类 AND 与 OR 或 NOT 非 逻辑值之间的运算 它们操作的对象本身已经是逻辑值或逻辑表达式 计算结果也是逻辑值 EQ 等于 NE 不等于 GT 大于 GE 大于等于 LT 小于 LE 小于等于 是 数与数之间 的比较 也就是它们操作的对象本身必须是两个数 计算得到的结果是逻辑值 关系运算符 表示是 数与数之间 的大小关系 在LINGO中用来表示优化模型的约束条件 LINGO中关系运算符有3种 即 大于等于 在优化模型中约束一般没有严格小于 严格大于关系 运算符的优先级 基本的数学函数 在LINGO中建立优化模型时可以引用大量的内部函数 这些函数以 打头 LINGO中包括相当丰富的数学函数 这些函数的用法非常简单 下面一一列出 ABS X 绝对值函数 返回X的绝对值 COS X 余弦函数 返回X的余弦值 X的单位是弧度 EXP X 指数函数 返回 FLOOR X 取整函数 返回X的整数部分 向最靠近0的方向取整 LGM X 返回X的伽玛 gamma 函数的自然对数值 当X为整数时LGM X LOG X 1 当X不为整数时 采用线性插值得到结果 LOG X 自然对数函数 返回X的自然对数值 的值 其中e 2 718281 基本的数学函数 MOD X Y 模函数 返回X对Y取模的结果 即X除以Y的余数 这里X和Y应该是整数 POW X Y 指数函数 返回XY的值 SIGN X 符号函数 返回X的符号值 X 0时返回 1 SIN X 正弦函数 返回X的正弦值 X的单位是弧度 SMAX list 最大值函数 返回一列数 list 的最大值 SMIN list 最小值函数 返回一列数 list 的最小值 SQR X 平方函数 返回X的平方 即X X 的值 SQRT X 开平方函数 返回X的正的平方根的值 TAN X 正切函数 返回X的正切值 X的单位是弧度 集合循环函数 集合上的元素 下标 进行循环操作的函数 一般用法如下 function setname set index list condition expression list 其中 function集合函数名 FOR MAX MIN PROD SUM之一 Setname集合名 set index list集合索引列表 不需使用索引时可以省略 Condition用逻辑表达式描述的过滤条件 通常含有索引 无条件时可以省略 expression list一个表达式 对 FOR函数 可以是一组表达式 集合循环函数 五个集合函数名的含义 FOR 集合元素的循环函数 对集合setname的每个元素独立地生成表达式 表达式由expression list描述 通常是优化问题的约束 MAX 集合属性的最大值函数 返回集合setname上的表达式的最大值 MIN 集合属性的最小值函数 返回集合setname上的表达式的最小值 PROD 集合属性的乘积函数 返回集合setname上的表达式的积 SUM 集合属性的求和函数 返回集合setname上的表达式的和 集合操作函数 INDEX set name primitive set element 给出元素primitive set element在集合set name中的索引值 即按定义集合时元素出现顺序的位置编号 省略set name LINGO按模型中定义的集合顺序找到第一个含有该元素的集合 并返回索引值 如果没有找到该元素 则出错 注 Set name的索引值是正整数且只能位于1和元素个数之间 例 定义一个女孩姓名集合 GIRLS 和男孩姓名集合 BOYS SETS GIRLS DEBBIE SUE ALICE BOYS BOB JOE SUE FRED ENDSETS都有SUE GIRLS在BOYS前定义 调用 INDEX SUE 将返2 相当于 INDEX GIRLS SUE 要找男孩中名为SUE的小孩的索引 应该使用 INDEX BOYS SUE 返3 集合操作函数 IN set name primitive index 1 primitive index 2 判断一个集合中是否含有某个索引值 如果集合set name中包含由索引primitive index 1 primitive index 2 所对应元素 则返回1 逻辑值 真 否则返回0 逻辑值 假 索引用 ENDSETS 如果集合C是由集合A B派生的 例如 SETS A 1 3 B XYZ C A B 1 X1 Z2 Y3 X ENDSETS判断C中是否包含元素 2 Y 则可以利用以下语句 X IN C INDEX A 2 INDEX B Y 对本例 结果是X 1 真 注 X既是集合B的元素 又对X赋值1 在LINGO中这种表达是允许的 因为前者是集合的元素 后者是变量 逻辑上没有关系 除了同名外 所以不会出现混淆 集合操作函数 IN set name primitive index 1 primitive index 2 WRAP I N 此函数对N 1无定义当I位于区间 1 N 内时直接返回I 一般地 返回J I K N 其中J位于区间 1 N K为整数 即 WRAP I N MOD I N 但当 MOD I N 0时 WRAP I N N 此函数可以用来防止集合的索引值越界 用户在编写LINGO程序时 应注意避免LINGO模型求解时出现集合的索引值越界的错误 集合操作函数 SIZE set name 返回数据集set name中包含元素的个数 变量定界函数 对变量的取值范围附加限制 共有以下四种 BND L X U 限制L X U 注意LINGO中没有与LINDO命令SLB SUB类似的函数 SLB和 SUB BIN X 限制X为0或1 注意LINDO中的命令是INT 但LINGO中这个函数的名字却不是 INT X FREE X 取消对X的符号限制 即可取负数 0或正数 GIN X 限制X为整数 财务会计函数 用于计算净现值 包括以下两个函数 FPA I N 返回如下情形下总的净现值 单位时段利率为I 连续N个时段支付 每个时段支付单位费用 根据复利的计算公式 很容易知道 FPA I N FPL I N 返回如下情形下总的净现值 单位时段利率为I 第N个时段支付单位费用 根据复利的计算公式 很容易知道 FPL I N 概率相关函数 PSN X 标准正态分布函数 即返回标准正态分布的分布函数在X点的取值 PSL X 标准正态线性损失函数 即返回MAX 0 Z X 的期望值 其中Z为标准正态随机变量 PPS A X Poisson分布函数 即返回均值为A的Poisson分布的分布函数在X点的取值 当X不是整数时 采用线性插值进行计算 PPL A X Poisson分布的线性损失函数 即返回MAX 0 Z X 的期望值 其中Z为均值为A的Poisson随机变量 PBN P N X 二项分布函数 即返回参数为 N P 的二项分布的分布函数在X点的取值 当N和 或 X不是整数时 采用线性插值进行计算 PHG POP G N X 超几何 Hypergeometric 分布的分布函数 也就是说 返回如下概率 当总共有POP个球 其中G个是白球时 那么随机地从中取出N个球 白球不超过X个的概率 当POP G N和 或 X不是整数时 采用线性插值进行计算 PEL A X 当到达负荷 强度 为A 服务系统有X个服务器且不允许排队时的Erlang损失概率 PEB A X 当到达负荷 强度 为A 服务系统有X个服务器且允许无穷排队时的Erlang繁忙概率 PFS A X C 当负荷上限为A 顾客数为C 并行服务器数量为X时 有限源的Poisson服务系统的等待或返修顾客数的期望值 A是顾客数乘以平均服务时间 再除以平均返修时间 当C和 或 X不是整数时 采用线性插值进行计算 概率相关函数 PFD N D X 自由度为N和D的F分布的分布函数在X点的取值 PCX N X 自由度为N的分布的分布函数在X点的取值 PTD N X 自由度为N的t分布的分布函数在X点的取值 QRAND SEED 返回0与1之间的多个拟均匀随机数 SEED为种子 缺省时取当前计算机时间为种子 该函数只能用在数据段 拟均匀随机数可以认为是 超均匀 的随机数 需要详细了解 拟均匀随机数 quasi randomuniformnumbers 请进一步参阅LINGO的使用手册 RAND SEED 返回0与1之间的一个伪均匀随机数 SEED为种子 概率相关函数 文件输入输出函数 FILE filename 当前模型引用其他ASCII码文件中的数据或文本时可以采用该语句 但不允许嵌套使用 其中filename为存放数据的文件名 该文件中记录之间用 分开 ODBC提供LINGO与ODBC OpenDataBaseConnection 开放式数据库连接 的接口 OLE提供LINGO与OLE ObjectLinkingandEmbeding 接口 POINTER N 在Windows下使用LINGO的动态连接库DLL 直接从共享的内存中传送数据 TEXT filename 用于数据段中将解答结果送到文本文件filename中 当省略filename时 结果送到标准的输出设备 通常就是屏幕 filename中可以带有文件路径 没有指定路径时表示在当前目录 如果这个文件已经存在 将会被覆盖 结果报告函数 ITERS 只能在程序的数据段使用 调用时不需要任何参数 返回LINGO求解器计算所使用的总迭代次数 例如 TEXT ITERS 将迭代次数显示在屏幕上 NEWLINE n 在输出设备上输出n个新行 STRLEN string 返回字串 string 的长度 如 STRLEN 123 返回值为3 NAME var or row refernce 返回变量名或行名 例 SETS WH WH1 WH3 WH表示仓库的集合 C C1 C4 C表示顾客的集合 ROAD WH C X ROAD表示仓库到顾客的道路集合 X表示某个仓库对某个顾客供货数 ENDSETSDATA TEXT WRITEFOR ROAD I J X I J GT 0 NAME X X NEWLINE 1 ENDDATA 结果报告函数 NAME var or row refernce 返回变量名或行名 输出结果示意如下 这里没有详细交待属性X当前的取值 X WH1 C1 2X WH1 C2 17X WH1 C3 1X WH2 C1 13X WH2 C4 12X WH3 C3 21注 变量 是指 数组元素 X WH1 C1 X WH2 C4 等 即属性加上相应的下标 集合元素 同理 约束名也是指模型展开后的约束名 用LINGO Generate命令可以看到约束展开后的情况 即也应该是带有相应的下标 集合元素 的 结果报告函数 结果报告函数 WRITE obj1 objn 只能在数据段中使用 输出一系列结果 obj1 objn 其中obj1 objn等可以是变量 但不能只是属性 也可以是字符串 放在单引号中的为字符串 或换行 NEWLINE 等 结果可以输出到一个文件 或电子表格 如EXCEL 或数据库 这取决于 WRITE所在的输出语句中左边的定位函数 例如 DATA TEXT WRITE Ais A Bis B A Bis A B ENDDATA其中A B是该模型中的变量 在屏幕上输出A B以及A B的值 增加了一些字符串 使结果读起来更方便 假设计算结束时A 10 B 5 则输出为 Ais10 Bis5 A Bis2 结果报告函数 WRITEFOR setname set index list condition obj1 objn 函数 WRITE在循环情况下的推广 输出集合上定义的属性对应的多个变量的取值 例 这里WH C X含义同上 DATA TEXT WRITEFOR ROAD I J X I J GT 0 从仓库 WH I 到顾客 C J 供货 X I J 件 NEWLINE 1 ENDDATA对应的输出效果示意如下 从仓库WH1到顾客C1供货2件 从仓库WH3到顾客C3供货21件 注 这里省略了部分输出结果 结果报告函数 在 WRITE和 WRITEFFOR函数中 可以使用符号 表示将一个字符串重复多次 用法是将 放在一个正整数n和这个字符串之前 表示将这个字符串重复n次 DATA LEAD 3 TEXT 上班人数图示 TEXT WRITEFOR DAY D LEAD DAY D ON DUTY D ON DUTY D NEWLINE 1 ENDDATA程序执行的效果示意如下 DAY表示一周 ON DUTY表示每天上班人数 上班人数图示MON20 SUN13 注 这里省略了部分输出结果 结果报告函数 FORMAT value format descriptor 在 WRITE和 WRITEFFOR函数中 FORMAT对数值设定输出格式 value表示输出的值 format descriptor 格式描述符 表示输出格式 格式描述符的含义与C语言中的格式描述类似 如 12 2f 表示十进制数 总共12位 其中有2位小数 注 使用 FORMAT函数将把数值转换成字符串 所以输出的实际上是字符串 这对于向数据库 电子表中输出不一定合适 DUAL variable or row name DUAL variable 返回解答中variable的判别数 reducedcost DUAL row 将返回约束行row的对偶 影子 价格 dualprices 例 DATA TEXT WRITEFOR SET1 I X I DUAL X I NEWLINE 1 ENDDATA 结果报告函数 RANGED variable or row name 为了保持最优基不变 目标函数中变量的系数或约束行的右端项允许减少的量 参见第2章2 2节敏感性分析中的allowabledecrease RANGEU variable or row name 为了保持最优基不变 目标函数中变量的系数或约束行的右端项允许增加的量 参见第2章2 2节敏感性分析中的allowableincrease 结果报告函数 STATUS 返回LINGO求解模型结束后的最后状态 0GlobalOptimum 全局最优 1Infeasible 不可行 2Unbounded 无界 3Undetermined 不确定 4Interrupted 用户人为终止了程序的运行 5InfeasibleorUnbounded 通常需要关闭 预处理 选项后重新求解模型 以确定究竟是不可行还是无界 6LocalOptimum 局部最优 7LocallyInfeasible 局部不可行 8Cutoff 目标函数达到了指定的误差水平 9NumericError 约束中遇到了无定义的数学操作 其他函数 IF logical condition true result false result 当逻辑表达式logical condition的结果为真时 返回true result 否则返回false result WARN text logical condition 如果逻辑表达式 logical condition 的结果为真 显示 text 信息 USER user determined arguments 允许用户自己编写的函数 DLL或OBJ文件 可能应当用C或FORTRAN等其他语言编写并编译 4 LINGO的主要菜单命令 LINGO入门2 在LINGO中使用集合3 运算符和函数4 LINGO的主要菜单命令5 LINGO命令窗口 工具栏 File Open F3 打开文件 File Print F7 打印文件 Edit Copy Ctrl C 复制 Edit Undo Ctrl Z 取消操作 Edit Find Ctrl F 查找 LINGO Solution Alt O 显示解答 Edit MatchParenthesis Ctrl P 匹配括号 LINGO Options Ctrl I 选项设置 Window CloseAll Alt X 关闭所有窗口 Help Contents F1 在线帮助 File New F2 新建文件 File Save F4 保存文件 Edit Cut Ctrl X 剪切 Edit Paste Ctrl V 粘贴 Edit Redo Ctrl Y 恢复操作 Edit GoToLine Ctrl T 定位某行 LINGO Solve Ctrl S 求解模型 LINGO Picture Ctrl K 模型图示 Window SendtoBack Ctrl B 窗口后置 Window Tile Alt T 平铺窗口 上下文相关的帮助 文件 File 主菜单 File ExportFile 优化模型输出到文件 有两个子菜单 分别表示两种输出格式 都是文本文件 MPSFormat MPS格式 是IBM公司制定的一种数学规划文件格式 MPIFormat MPI格式 是LINDO公司制定的一种数学规划文件格式 File UserDatabaseInfo弹出对话框 用户输入用户使用数据库时需要验证的用户名 UserID 和密码 Password 这些信息在使用 ODBC 函数访问数据库时要用到 编辑 Edit 主菜单 将WINDOWS剪贴板中的内容粘贴到当前光标处 Edit Paste 粘贴命令 仅用于剪贴板中的内容是文本的情形 Edit PasteSpecial 特殊粘贴命令 可以用于剪贴板中的内容不是文本的情形 可以插入其它应用程序中生成的对象 Object 或对象的链接 Link 例如 LINGO模型中可能会在数据段用到从其它应用程序中生成的数据对象 如EXCEL电子表格数据 这时用 Edit PasteSpecial 是很方便的 Edit Paste和Edit PasteSpecial 编辑 Edit 主菜单 Edit MatchParenthesis 用于匹配模型中的括号 如果当前没有选定括号 则把光标移动到离当前光标最近的一个括号并选中这个括号 当选定一个括号后 则把光标移动到与这个括号相匹配的括号并选中这个括号 Edit PasteFunction 还有下一级子菜单和下下一级子菜单 用于按函数类型选择LINGO的某个函数 粘贴到当前光标处 编辑 Edit 主菜单 Edit SelectFont 弹出对话框 控制显示字体 字形 大小 颜色 效果等 注 这些显示特性只有当文件保存为LINGO格式 LG4 的文件时才能保存下来 此外 如果 按语法显示色彩 选项是有效的 参见 LINGO Options 在模型窗口中将不能通过 Edit SelectFont 菜单命令控制文本的颜色 编辑 Edit 主菜单 Edit InsertNewObject 插入其它应用程序中生成的整个对象或对象的链接 前面介绍过的 Edit PasteSpecial 与此类似 但 Pas
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!