LINGO编程简介与实例

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

一、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

       表一 班次表

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


  • 设   x i   为 第   i   班 报 到 人 员 ( i = 1 , 2 , ⋯   , 6 ) , 可 得 到 目 标 函 数 和 约 束 条 件 设\ x_i\ 为第\ i\ 班报到人员(i=1,2,\cdots,6),可得到目标函数和约束条件  xi  i (i=1,2,,6)
    m i n   Z = ∑ i = 1 6 x i min\ Z=\sum_{i=1}^{6}x_i min Z=i=16xi
    s . t . { x 6 + x 1 ≥   60 x 1 + x 2 ≥   70 x 2 + x 3 ≥   60 x 3 + x 4 ≥   50 x 4 + x 5 ≥   20 x 5 + x 6 ≥   30 x 1 , x 2 , ⋯   , x 6 ≥   0 s.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 60x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值