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

班次时间最少需要人数
16:00 - 10:0060
210:00 - 14:0070
314:00 - 18:0060
418:00 - 22:0050
522:00 - 2:0020
62:00 - 6:0030

       表一 班次表

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


  • 设   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 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项业务的费用(单位:元)各不相同,见表二。

业务员业务1234
111008001000700
2600500300800
34008001000900
411001000500700

       表二 业务的费用表

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

0001
0100
1000
0010

  解答示意图

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

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

m i n   Z = ∑ i = 1 4 ∑ j = 1 4 a i j x i j min\ Z=\sum_{i=1}^{4}\sum_{j=1}^{4}a_{ij}x_{ij} min Z=i=14j=14aijxij
s . t . { ∑ i = 1 4 x i j = 1    j = 1 , 2 , 3 , 4 ∑ j = 1 4 x i j = 1    i = 1 , 2 , 3 , 4 x i j = 0 或 1        i , j = 1 , 2 , 3 , 4 s.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=14xij=1  j=1,2,3,4j=14xij=1  i=1,2,3,4xij=01      i,j=1,2,3,4

LINGO程序如下:

MODEL:
    SETS:
        person/1..4/;
        task/1..4/;
        assign(person, task):a, x;
    ENDSETS

    DATA:
        a = 1100, 800, 1000, 700, 600, 500, 300, 800, 400, 800, 1000, 900, 1100, 1000, 500, 700;
    ENDDATA

    min=@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;
    ENDSETS

    DATA:
        a = @file(data.txt);
    ENDDATA

    min=@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、生产规划

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

 产品 
资源资源量
A248500
B234300
C123100
D357700
单件可变费用4612 
固定费用100150200 
单件售价71020 
<![endif]>

         表3 数据详细表


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

    设   y j = { 1    生 产 第   j   种 产 品 (   x j > 0   ) 0    不 生 产 第   j   种 产 品 (   x j = 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\ 元    74=3 
    第   Ⅱ   种 产 品 销 售 一 件 可 收 入   10 − 6 = 4   元 第\ Ⅱ\ 种产品销售一件可收入\ 10-6=4\ 元    106=4 
    第   Ⅲ   种 产 品 销 售 一 件 可 收 入   20 − 12 = 8   元 第\ Ⅲ\ 种产品销售一件可收入\ 20-12=8\ 元    2012=8 

    则 问 题 的 整 数 规 划 模 型 如 下 则问题的整数规划模型如下
    m a x   Z = 3 x 1 + 4 x 2 + 8 x 3 − 100 y 1 − 150 y 2 − 200 y 3 max\ Z=3 x_1 + 4 x_2 + 8 x_3 -100 y_1 - 150 y_2 - 200 y_3 max Z=3x1+4x2+8x3100y1150y2200y3
    s . t . { 2 x 1 + 4 x 2 + 8 x 3 ≤ 500 2 x 1 + 3 x 2 + 4 x 3 ≤ 300    x 1 + 2 x 2 + 3 x 3 ≤ 100 3 x 1 + 5 x 2 + 7 x 3 ≤ 700 x 1 ≤ M 1 y 1 x 2 ≤ M 2 y 2 x 3 ≤ M 3 y 3 x j ≥ 0   且 为 整 数 ,   j = 1 , 2 , 3 y j = 0 或 1 ,   j = 1 , 2 , 3 M j   为   x j 的 某 个 上 界 , 可 取 M = 150 s.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=150 s.t.2x1+4x2+8x35002x1+3x2+4x3300  x1+2x2+3x31003x1+5x2+7x3700x1M1y1x2M2y2x3M3y3xj0 , j=1,2,3yj=01, j=1,2,3Mj  xj,M=150

LINGO程序如下:

MODEL:
    DATA:
        M = 150;
    ENDDATA

    max = 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 数学建模(西北工业大学) 第一章 第三讲"

  • 4
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值