LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到广泛应用。LINGO主要用于求解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于求解一些线性和非线性方程组及代数方程求根等。

目录

  • 一、LINGO使用介绍
    • 1.1 LINGO编写格式
      • (1)集合部分 (SETS)
      • (2)目标与约束
      • (3)数据部分 (DATA)
      • (4)初始化部分 (INT)
      • 编写LINGO程序要注意的几点
    • 1.2 LINGO内部函数使用详解
      • (1)常用数学函数
      • (2)集合函数
      • (3)变量界定函数
  • 二、LINGO求解优化模型实例
    • 1、公交车排班
    • 2、办业务
    • 3、生产规划

一、LINGO使用介绍

1.1 LINGO编写格式

LINGO模型以 MODEL 开始,以 END 结束。中间为语句,分为四大部分。

(1)集合部分 (SETS)
  • 这部分以"SETS:"开始,以"ENDSETS"结束。
  • 这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计算,在 LINGO 中称为集合(SET)及其元素和属性。
  • LINGO中的集合有两类:一类是原始集合,其定义的格式为:
    SETNAME/member list(or 1..n )/: attribute, attribute, etc.
  • 另一类是导出集合,即引用其它集合定义的集合,其定义的格式为:
    SETNAME(set1, set2, etc.): attribute, attribute, etc.
  • 如果要在程序中使用数组,就必须在该部分定义,否则可不需要, 如
    Person/1..10/:A;
    Task/1..12/:B;
    Link(Person, Task):X;
    
(2)目标与约束
  • 这部分定义了目标函数、约束条件等。一般要用到LINGO的内部函数。求解优化问题时,该部分是必须的。
(3)数据部分 (DATA)
  • 这部分以"DATA: "开始,以"END DATA"结束。
  • 其作用在于对集合的属性(数组)输入必要的数值, 方便数据的输入。
  • 格式为:
    attribute = value_list
(4)初始化部分 (INT)
  • 这部分以"INIT: "开始,以"END INIT"结束。
  • 作用在于对集合的属性(数组)定义初值。
  • 格式为:
    attribute = value_list
编写LINGO程序要注意的几点
  • 所有的语句除SETS、ENDSETS、DATA、ENDDATA、INIT、ENDINIT和MODEL、END之外必须以一个分号" ;"结尾。
  • LINGO求解非线性规划时已约定各变量非负

1.2 LINGO内部函数使用详解

LINGO建立优化模型时可以引用大量内部函数,这些函数以" @ "符号打头。

(1)常用数学函数
  • @ABS(X) 返回变量X的绝对数值
  • @SIN(X) 返回X的正弦值,X的单位为弧度
  • @COS(X) 返回X的余弦值,X的单位为弧度
  • @TAN(X) 返回X的正切值,X的单位为弧度
  • @EXP(X) 返回指数函数值,其中e=2.72828…
  • @FLOOR(X) 向0靠近返回X的整数部分
  • @LGM(X) 返回γ函数的自然对数值
  • @LOG(X) 返回变量X的自然对数值
  • @SIGN(X) 返回变量x的符号值,当X<0时为-1;当X>0时为1
  • @SMAX(X) 返回一列值X1, X2,…, XN的最大值
  • @SMAX(X) 返回一列值X1, X2,…, XN的最小值
(2)集合函数
  • 用法如下:
    set_operator(set_name|condition: expression)

    • 其中 set_operator 是集合函数名,set_name 是数据集合名,expression 部分是表达式,|condition部分是条件,用逻辑表达式描述(无条件时可省略)。

    • 逻辑表达式中可以用
      三种逻辑算符:
      #AND# (与),#OR# (或),#NOT# (非)
      和六种关系算符:
      #EQ# (等于),#NE# (不等于),#GT# (大于),#GE# (大于等于),#LT# (小于),#LE# (小于等于)

  • 常见的集合函数

    • @FOR(set_name: constraint_expressions)
      对集合(set_name)的每个元素独立地生成约束,约束由约束表达式(constraint_expressions)描述
    • @MAX(set_name: expression)
      返回集合上表达式(expression)的最大值
    • @MIN(set_name: expression)
      返回集合上表达式(expression)的最小值
    • @SUM(set_name: expression)
      返回集合上表达式(expression)的和
    • @SIZE(set_name)
      返回数据集(set_name)中包含元素的个数
    • @IN(set_name, set_element)
      如果数据集(set_name)中包含元素set_element,则返回1,否则返回0
(3)变量界定函数

变量函数对变量的取值范围附加限制,共有四种:

  • @BND(L, X, U) 限制L ≤ X ≤ U
  • @BIN(X) 限制X为0或1
  • @FREE(X) 取消对X的符号限制(可取任意实数值)
  • @GIN(X) 限制X为整数值

二、LINGO求解优化模型实例

1、公交车排班

某昼夜服务的公交路线每天各时间区段内所需司机和乘务人员见表1

班次 时间 最少需要人数
1 6:00 - 10:00 60
2 10:00 - 14:00 70
3 14:00 - 18:00 60
4 18:00 - 22:00 50
5 22:00 - 2:00 20
6 2:00 - 6:00 30

       表一 班次表

设司机和乘务人员分别在各时间区段一开始上班,并连续工作八小时,问该公交线路至少配备多少名司机和乘务人员?从第一班开始排,试建立线性模型


  • 设xi为第i班报到人员(i=1,2,⋯,6),可得到目标函数和约束条件设\ x_i\ 为第\ i\ 班报到人员(i=1,2,\cdots,6),可得到目标函数和约束条件设 xi​ 为第 i 班报到人员(i=1,2,⋯,6),可得到目标函数和约束条件
    minZ=∑i=16ximin\ Z=\sum_{i=1}^{6}x_imin Z=i=1∑6​xi​
    s.t.{x6+x1≥60x1+x2≥70x2+x3≥60x3+x4≥50x4+x5≥20x5+x6≥30x1,x2,⋯,x6≥0s.t.\begin{cases} x_6 + x_1 \geq\ 60\\ x_1 + x_2 \geq\ 70\\ x_2 + x_3 \geq\ 60\\ x_3 + x_4 \geq\ 50\\ x_4 + x_5 \geq\ 20\\ x_5 + x_6 \geq\ 30\\ x_1,x_2,\cdots,x_6 \geq\ 0 \end{cases}s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​x6​+x1​≥ 60x1​+x2​≥ 70x2​+x3​≥ 60x3​+x4​≥ 50x4​+x5​≥ 20x5​+x6​≥ 30x1​,x2​,⋯,x6​≥ 0​

LINGO程序如下:

MODEL:min = x1+x2+x3+x4+x5+x6;x1 + x6 >= 60;x1 + x2 >= 70;x2 + x3 >= 60;x3 + x4 >= 50;x4 + x5 >= 20;x5 + x6 >= 30;
END

2、办业务

公司在各地有4项业务,选定了4位业务员去处理。由于业务能力、经验和其他情况不同,4位业务员处理4项业务的费用(单位:元)各不相同,见表二。

业务员 业务 1 2 3 4
1 1100 800 1000 700
2 600 500 300 800
3 400 800 1000 900
4 1100 1000 500 700

       表二 业务的费用表

应当怎样分派任务,才能使总得费用最小?

0 0 0 1
0 1 0 0
1 0 0 0
0 0 1 0

  解答示意图

这是一个最优指派问题,引入如下变量:
xij={1分派第i个人做第j项任务0不分派第i个人做第j项任务x_{ij}=\begin{cases} 1\ \ \ \ \ 分派第i个人做第j项任务\\ \\ 0\ \ \ \ \ 不分派第i个人做第j项任务\\ \end{cases}xij​=⎩⎪⎨⎪⎧​1     分派第i个人做第j项任务0     不分派第i个人做第j项任务​
设矩阵A4∗4为指派矩阵,其中a(i,j)为第i个业务员做第j项业务的业务费。设矩阵A_{4*4}为指派矩阵,其中a(i,j)为第i个业务员做第j项业务的业务费。设矩阵A4∗4​为指派矩阵,其中a(i,j)为第i个业务员做第j项业务的业务费。

则可建立优化模型及LINGO程序

minZ=∑i=14∑j=14aijxijmin\ Z=\sum_{i=1}^{4}\sum_{j=1}^{4}a_{ij}x_{ij}min Z=i=1∑4​j=1∑4​aij​xij​
s.t.{∑i=14xij=1j=1,2,3,4∑j=14xij=1i=1,2,3,4xij=0或1i,j=1,2,3,4s.t.\begin{cases} \sum_{i=1}^{4}x_{ij}=1\ \ j=1,2,3,4\\ \\ \sum_{j=1}^{4}x_{ij}=1\ \ i=1,2,3,4\\ \\ x_{ij}=0或1\ \ \ \ \ \ i,j=1,2,3,4\\ \end{cases}s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​∑i=14​xij​=1  j=1,2,3,4∑j=14​xij​=1  i=1,2,3,4xij​=0或1      i,j=1,2,3,4​

LINGO程序如下:

MODEL:SETS:person/1..4/;task/1..4/;assign(person, task):a, x;ENDSETSDATA:a = 1100, 800, 1000, 700, 600, 500, 300, 800, 400, 800, 1000, 900, 1100, 1000, 500, 700;ENDDATAmin=@sum(assign:a * x);@for(task(j):@sum(person(i):x(i,j)) = 1);@for(person(i):@sum(task(j):x(i,j)) = 1);@for(assign(i,j):@bin(x(i,j)));
END

采用数据文件方式编程:

MODEL:SETS:person/1..4/;task/1..4/;assign(person, task):a, x;ENDSETSDATA:a = @file(data.txt);ENDDATAmin=@sum(assign:a * x);@for(task(j):@sum(person(i):x(i,j)) = 1);@for(person(i):@sum(task(j):x(i,j)) = 1);@for(assign(i,j):@bin(x(i,j)));
END

同时在LINGO目录下建立文本文件data.txt,数据如下:

1100, 800, 1000, 700
600, 500, 300, 800
400, 800, 1000, 900
1100, 1000, 500, 700

3、生产规划

有四种资源被用于生产三种产品,资源量、产品单件可变费用、单件售价、资源单耗量及组织三种商品生产的固定费用见下表。现要求制定一个生产计划,使总收益最大。

  产品  
资源 资源量
A 2 4 8 500
B 2 3 4 300
C 1 2 3 100
D 3 5 7 700
单件可变费用 4 6 12  
固定费用 100 150 200  
单件售价 7 10 20  

<![endif]>

         表3 数据详细表


  • 设xj是第j种产品的产量,j=1,2,3.设\,x_j是第\,j种产品的产量,j=1,2,3.设xj​是第j种产品的产量,j=1,2,3.

    设yj={1生产第j种产品(xj>0)0不生产第j种产品(xj=0)设\,y_j=\begin{cases} 1\ \ 生产第\,j\,种产品(\,x_j > 0\,)\\ \\ 0\ \ 不生产第\,j\,种产品(\,x_j = 0\,)\\ \end{cases}设yj​=⎩⎪⎨⎪⎧​1  生产第j种产品(xj​>0)0  不生产第j种产品(xj​=0)​

    第Ⅰ种产品销售一件可收入7−4=3元第\ Ⅰ\ 种产品销售一件可收入\ 7-4=3\ 元第 Ⅰ 种产品销售一件可收入 7−4=3 元
    第Ⅱ种产品销售一件可收入10−6=4元第\ Ⅱ\ 种产品销售一件可收入\ 10-6=4\ 元第 Ⅱ 种产品销售一件可收入 10−6=4 元
    第Ⅲ种产品销售一件可收入20−12=8元第\ Ⅲ\ 种产品销售一件可收入\ 20-12=8\ 元第 Ⅲ 种产品销售一件可收入 20−12=8 元

    则问题的整数规划模型如下则问题的整数规划模型如下则问题的整数规划模型如下
    maxZ=3x1+4x2+8x3−100y1−150y2−200y3max\ Z=3 x_1 + 4 x_2 + 8 x_3 -100 y_1 - 150 y_2 - 200 y_3max Z=3x1​+4x2​+8x3​−100y1​−150y2​−200y3​
    s.t.{2x1+4x2+8x3≤5002x1+3x2+4x3≤300x1+2x2+3x3≤1003x1+5x2+7x3≤700x1≤M1y1x2≤M2y2x3≤M3y3xj≥0且为整数,j=1,2,3yj=0或1,j=1,2,3Mj为xj的某个上界,可取M=150s.t.\begin{cases} 2 x_1 + 4 x_2 + 8 x_3 \leq 500 \\ 2 x_1 + 3 x_2 + 4 x_3 \leq 300\\ \ \ x_1 + 2 x_2 + 3 x_3 \leq 100\\ 3 x_1 + 5 x_2 + 7 x_3 \leq 700\\ x_1 \leq M_1y_1\\ x_2 \leq M_2y_2\\ x_3 \leq M_3y_3\\ x_j \geq 0 \ 且为整数, \ j=1,2,3\\ y_j = 0或1, \ j=1,2,3\\ \end{cases}\\ M_j\ 为\ x_j的某个上界, 可取M=150s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​2x1​+4x2​+8x3​≤5002x1​+3x2​+4x3​≤300  x1​+2x2​+3x3​≤1003x1​+5x2​+7x3​≤700x1​≤M1​y1​x2​≤M2​y2​x3​≤M3​y3​xj​≥0 且为整数, j=1,2,3yj​=0或1, j=1,2,3​Mj​ 为 xj​的某个上界,可取M=150

LINGO程序如下:

MODEL:DATA:M = 150;ENDDATAmax = 3*x1 + 4*x2 + 8*x3 - 100*y1 - 150*y2 - 200*y3;2*x1 + 4*x2 + 8*x3 <= 500; 2*x1 + 3*x2 + 4*x3 <= 300;x1 + 2*x2 + 3*x3 <= 100;3*x1 + 5*x2 + 7*x3 <= 700;x1 <= M*y1; x2 <= M*y2; x3 <= M*y3;@GIN(x1); @GIN(x2); @GIN(x3); !指定产品件数为整数;@BIN(y1); @BIN(y2); @BIN(y3); !指定0-1变量;
END

笔记内容来源于" 中国大学MOOC 数学建模(西北工业大学) 第一章 第三讲"

LINGO编程简介与实例相关推荐

  1. 1.3 matlab与LINGO编程

    LINGO编程简介与实例 一.LINGO使用介绍 1. LINGO编写格式 2 .LINGO内部函数使用详解. 二.LINGO求解优化模型实例 一.LINGO使用介绍 LINGO是一种专门用于求解数学 ...

  2. 1.2 matlab与LINGO编程

    Matlab编程简介与实例(二) 函数作图 (1) 二维平面曲线作图函数 (2) 多窗口作图 将屏幕分为几个窗口分别作图 subplot(m,n,k) 表示将窗口分为 m*n个, 当前图在第k个窗口完 ...

  3. python趣味编程10例-Python趣味编程与精彩实例

    Python趣味编程与精彩实例 共19 章,前12章主要以Python 基础知识如文件创建.输出与变量.输入与判断.运算符和循环.列表和字典.函数编程.pygame的各种知识为主,13-19章则以游戏 ...

  4. SVG脚本编程简介(转)

    SVG脚本编程简介 本文主要介绍SVG的脚本编程,并分别给出放大.缩小,查询,鼠标事件等实例. 一.            SVG简介 SVG,全称为Scalable Vector Graphics( ...

  5. plc维修入门与故障处理实例_电气控制基础+PLC编程入门+工程应用实例

    以S7-300/400PLC为主线 电气控制基础+PLC编程入门+工程应用实例 点击图片  购买 编辑推荐1.西门子S7300/400PLC应用广.市场占有率高 2.本书通过大量的实验案例和真实的工程 ...

  6. ruby 新建对象_Ruby面向对象编程简介

    ruby 新建对象 by Nishant Mishra 由Nishant Mishra Ruby面向对象编程简介 (An Introduction to Object-Oriented Program ...

  7. python精彩编程200例-Python趣味编程与精彩实例

    Python趣味编程与精彩实例 共19 章,前12章主要以Python 基础知识如文件创建.输出与变量.输入与判断.运算符和循环.列表和字典.函数编程.pygame的各种知识为主,13-19章则以游戏 ...

  8. plc模拟量与通信控制应用实践_电气控制基础+PLC编程入门+工程应用实例

    以S7-300/400PLC为主线 电气控制基础+PLC编程入门+工程应用实例 点击图片  购买 编辑推荐1.西门子S7300/400PLC应用广.市场占有率高 2.本书通过大量的实验案例和真实的工程 ...

  9. 异构计算(CPU + GPU)编程简介

    异构计算(CPU + GPU)编程简介 1.概念 所谓异构计算,是指CPU+ GPU或者CPU+ 其它设备(如FPGA等)协同计算.一般我们的程序,是在CPU上计算.但是,当大量的数据需要计算时,CP ...

  10. CPU+GPU异构计算编程简介

    异构计算(CPU + GPU)编程简介 1. 概念 所谓异构计算,是指CPU+ GPU或者CPU+ 其它设备(如FPGA等)协同计算.一般我们的程序,是在CPU上计算.但是,当大量的数据需要计算时,C ...

最新文章

  1. Linux命令中21个不太好搜索其含义的特殊符号你都知道吗?
  2. MongoDB sharding迁移那些事(一)
  3. 他们拿走腾讯广告百万奖金,我算是知道票圈广告为啥那么多赞了
  4. 百度相关搜索软件_Python与seo,百度关键词相关搜索关键词采集源码
  5. Excel 技术篇-解决“单元格不能自动适应大小“问题
  6. GDCM:gdcm::UIComp的测试程序
  7. 隐藏网页文件的后缀(IIS测试通过)!
  8. php查到的内容追加到html,javascript - 请问php中如何将查询出来的结果数组转化成自己想要的格式,并在前台利用js输出到html中...
  9. 中兴智能视觉大数据报道:人脸识别画上浓妆也不耽误识别
  10. 【干货】统计学思维导图
  11. 不让editText自动获取焦点
  12. cmake Can‘t find third_party/gtest
  13. 毕设过程小记—同步带传动选型计算+张紧机构
  14. 金万维怎么使用远程服务器,远程桌面如何设置?
  15. 数据库课程设计大作业大盘点【建议在校生收藏】
  16. Android listview图片刷新闪烁
  17. 2019表情包制作工具哪个好用
  18. 网站建设中如何打造最优seo优化页面
  19. 区块链中节点和区块的关系区块链的基本概念
  20. BUUCTF·[AFCTF2018]Vigenère·WP

热门文章

  1. 各种杀毒软件序列号注册码大全
  2. 最新版idea2017+kemulator搭建J2ME开发环境
  3. Access数据库学习
  4. 提供两个卡巴斯基的授权文件
  5. 【语音处理】基于matlab低通滤波器语音信号加噪与去噪【含Matlab源码 1709期】
  6. oracle regexp
  7. Android SDK下载网址
  8. Oozie 集成 Ssh
  9. 计算机组成原理 蒋本珊pdf,计算机组成原理 蒋本珊 习题解答.pdf
  10. 贪吃蛇游戏设计(一)————游戏策划