【数学建模】技术革新——Lingo的使用超详解

news2024/11/24 12:36:09

目录

基础知识

1. 变量声明

示例

2. 常量声明

语法格式

示例

3. 目标函数

语法格式

示例

4. 约束条件

语法格式

示例

5. 完整的Lingo模型示例

示例

解释

6. 整数变量声明

语法格式

示例

7. 非线性规划

示例

8. 多目标优化

语法格式

示例

9. 数据输入与输出

读取数据

语法格式

示例

输出数据

语法格式

示例

10. 注释

语法格式

示例

11. 完整模型示例解析

问题描述

数学模型

Lingo代码

解释

12. 求解模型

结果分析

13. 调试与优化

14. 学习资源与参考资料

实例1:生产规划问题

问题描述

数学模型

Lingo代码

结果分析

结果解释

可能的问题与改进建议

实例2:投资组合优化

问题描述

数学模型

Lingo代码

结果分析

结果解释

可能的问题与改进建议

实例3:运输问题

问题描述

数学模型

Lingo代码

结果分析

结果解释

结果分析

改进建议

实例4:工厂选址问题

问题描述

数学模型

Lingo代码

求解结果

结果解释

结果分析

改进建议

实例5:分配问题

问题描述

数学模型

Lingo代码

结果分析

结果解释

结果分析

改进建议

实例6:非线性规划问题

问题描述

数学模型

Lingo代码

结果分析

结果解释

可能的问题与改进建议

​编辑

总结 


 

ce6fbd68767d465bbe94b775b8b811db.png

731bd47804784fa2897220a90a387b28.gif

专栏:数学建模学习笔记

基础知识

Lingo是一款功能强大的数学建模和优化求解工具,适用于线性规划、整数规划和非线性规划等多种类型的问题。为了帮助初学者更好地理解Lingo的使用,下面将详细讲解其基础语法和代码格式。

1. 变量声明

在Lingo中,变量声明使用@VARIABLES关键字。可以一次性声明多个变量,变量名之间用逗号分隔。变量名区分大小写。

语法格式

@VARIABLES:
    var1, var2, ..., varn;
  • @VARIABLES::这是变量声明的关键字,表示接下来的内容是变量声明部分。
  • var1, var2, ..., varn;:用逗号分隔的变量名列表,最后以分号结束,表示这些变量将在模型中使用。
示例
@VARIABLES:
    x, y, z;
  • x, y, z;:声明了三个变量x、y和z。

2. 常量声明

常量声明使用@CONSTANTS关键字。常量的值在模型中是固定的,不能改变。

语法格式
@CONSTANTS:
    const1 = value1,
    const2 = value2, 
    ... 
    constn = valuen;
  • @CONSTANTS::这是常量声明的关键字,表示接下来的内容是常量声明部分。
  • const1 = value1, ...:用逗号分隔的常量名和值的对列表,最后用逗号结束,表示这些常量将在模型中使用。
示例
@CONSTANTS:
    a = 10,
    b = 5;
  • a = 10, b = 5;:声明了两个常量a和b,值分别为10和5。

3. 目标函数

目标函数是模型的核心部分,用于定义需要最小化或最大化的表达式。使用MINMAX关键字来定义目标函数。

语法格式
MIN = expression;   ! 最小化目标函数
MAX = expression;   ! 最大化目标函数
  • MIN = expression;:定义一个最小化的目标函数,其中expression是需要最小化的表达式。
  • MAX = expression;:定义一个最大化的目标函数,其中expression是需要最大化的表达式。
示例
MAX = 3*x + 2*y;
  • MAX = 3*x + 2*y;:定义了一个最大化目标函数,目标是使3*x + 2*y的值最大。

4. 约束条件

约束条件用于限制变量的取值范围或关系。约束条件可以是等式或不等式。

语法格式
expression1 <= expression2;
expression1 >= expression2;
expression1 = expression2;
  • expression1 <= expression2;:定义一个小于等于的约束条件。
  • expression1 >= expression2;:定义一个大于等于的约束条件。
  • expression1 = expression2;:定义一个等于的约束条件。
示例
x + y <= 10;
2*x - y >= 5;
  • x + y <= 10;:定义了一个约束条件,表示xy的和不能超过10。
  • 2*x - y >= 5;:定义了一个约束条件,表示2*x - y的值不能小于5。

5. 完整的Lingo模型示例

一个完整的线性规划模型包括变量声明、常量声明、目标函数和约束条件。

示例
! 定义变量;
@VARIABLES:
    x, y;

! 定义常量;
@CONSTANTS:
    a = 3,
    b = 2;

! 定义目标函数;
MAX = a*x + b*y;

! 定义约束条件;
x + y <= 10;
2*x - y >= 5;
x >= 0;
y >= 0;
解释
  • ! 定义变量;:注释,说明接下来的部分是变量声明。
  • @VARIABLES::变量声明的关键字。
  • x, y;:声明了两个变量x和y。
  • ! 定义常量;:注释,说明接下来的部分是常量声明。
  • @CONSTANTS::常量声明的关键字。
  • a = 3, b = 2;:声明了两个常量a和b,值分别为3和2。
  • ! 定义目标函数;:注释,说明接下来的部分是目标函数定义。
  • MAX = a*x + b*y;:定义了一个最大化目标函数,目标是使a*x + b*y的值最大。
  • ! 定义约束条件;:注释,说明接下来的部分是约束条件定义。
  • x + y <= 10;:定义了一个约束条件,表示xy的和不能超过10。
  • 2*x - y >= 5;:定义了一个约束条件,表示2*x - y的值不能小于5。
  • x >= 0;:定义了一个约束条件,表示x必须大于或等于0。
  • y >= 0;:定义了一个约束条件,表示y必须大于或等于0。

6. 整数变量声明

如果模型中的某些变量必须是整数,可以使用@GIN@BIN关键字。

语法格式
@GIN(var1, var2, ..., varn);
@BIN(var1, var2, ..., varn);
  • @GIN(var1, var2, ..., varn);:声明一组变量为一般整数变量。
  • @BIN(var1, var2, ..., varn);:声明一组变量为0-1变量(二进制变量)。
示例
@VARIABLES:
    x, y;

@GIN(x, y);
  • @GIN(x, y);:声明变量x和y必须是整数。

7. 非线性规划

Lingo也支持非线性规划,可以直接在目标函数和约束条件中使用非线性表达式。

示例
@VARIABLES:
    x, y;

MAX = x^2 + y^2;

x^2 + y <= 10;
x >= 0;
y >= 0;
  • MAX = x^2 + y^2;:定义了一个最大化目标函数,目标是使x^2 + y^2的值最大。
  • x^2 + y <= 10;:定义了一个约束条件,表示x^2 + y的值不能超过10。
  • x >= 0;:定义了一个约束条件,表示x必须大于或等于0。
  • y >= 0;:定义了一个约束条件,表示y必须大于或等于0。

8. 多目标优化

多目标优化问题可以通过权重法或约束法来解决。

语法格式
! 目标函数权重法;
MAX = w1*(目标1) + w2*(目标2);

! 目标函数约束法;
MAX = 目标1;
subject to 目标2 <= 某个值;
  • MAX = w1*(目标1) + w2*(目标2);:权重法,将多个目标函数按一定权重加权后合并成一个目标函数。
  • MAX = 目标1; subject to 目标2 <= 某个值;:约束法,将一个目标函数作为优化目标,其他目标函数作为约束条件。
示例
@VARIABLES:
    x, y;

MAX = 0.5*(x + y) + 0.5*(2*x - y);

x + y <= 10;
2*x - y <= 15;
x >= 0;
y >= 0;
  • MAX = 0.5*(x + y) + 0.5*(2*x - y);:定义了一个加权的目标函数。
  • x + y <= 10;:定义了一个约束条件。
  • 2*x - y <= 15;:定义了一个约束条件。
  • x >= 0;:定义了一个约束条件。
  • y >= 0;:定义了一个约束条件。

9. 数据输入与输出

Lingo支持从外部文件读取数据或将结果写入外部文件。

读取数据

可以使用@READ关键字从外部文件读取数据。

语法格式
@READ('文件路径', 变量名列表);
  • @READ('文件路径', 变量名列表);:从指定文件路径读取数据并赋值给变量名列表中的变量。
示例
@VARIABLES:
    x, y;

@READ('data.txt', x, y);

MAX = 3*x + 2*y;
x + y <= 10;
x >= 0;
y >= 0;
  • @READ('data.txt', x, y);:从data.txt文件中读取数据,赋值给变量x和y。
输出数据

可以使用@WRITE关键字将结果写入外部文件。

语法格式
@WRITE('文件路径', 表达式列表);
  • @WRITE('文件路径', 表达式列表);:将表达式列表中的值写入指定文件路径。
示例
@VARIABLES:
    x, y;

MAX = 3*x + 2*y;
x + y <= 10;
x >= 0;
y >= 0;

@WRITE('result.txt', x, y, 3*x + 2*y);
  • @WRITE('result.txt', x, y, 3*x + 2*y);:将变量x、y和目标函数值写入result.txt文件中。

10. 注释

注释是Lingo代码中的说明性文字,用于解释代码功能,Lingo在运行时会忽略注释。注释以感叹号!开头。

语法格式
! 注释内容
  • ! 注释内容:注释行,用于解释代码。
示例
! 定义变量;
@VARIABLES:
    x, y;

! 定义目标函数;
MAX = 3*x + 2*y;

! 定义约束条件;
x + y <= 10;
x >= 0;
y >= 0;
  • ! 定义变量;:注释,说明接下来的部分是变量声明。
  • ! 定义目标函数;:注释,说明接下来的部分是目标函数定义。
  • ! 定义约束条件;:注释,说明接下来的部分是约束条件定义。

11. 完整模型示例解析

为了更好地理解Lingo的语法,我们通过一个完整的模型示例来进行详细解析。

问题描述

某工厂生产两种产品A和B。每单位A的利润为10元,每单位B的利润为15元。生产A需要2小时,B需要3小时。每天工厂最多工作10小时,问如何安排生产才能获得最大利润?

数学模型
  1. 变量定义

    • A:生产产品A的数量
    • B:生产产品B的数量
  2. 目标函数

    • 最大化利润:MAX = 10*A + 15*B
  3. 约束条件

    • 时间约束:2*A + 3*B <= 10
    • 非负约束:A >= 0, B >= 0
Lingo代码
! 定义变量;
@VARIABLES:
    A, B;

! 定义目标函数;
MAX = 10*A + 15*B;

! 定义约束条件;
2*A + 3*B <= 10;
A >= 0;
B >= 0;
解释
  • ! 定义变量;:注释,说明接下来的部分是变量声明。
  • @VARIABLES::变量声明的关键字。
  • A, B;:声明了两个变量A和B,分别表示生产产品A和B的数量。
  • ! 定义目标函数;:注释,说明接下来的部分是目标函数定义。
  • MAX = 10*A + 15*B;:定义了一个最大化目标函数,目标是使10*A + 15*B的值最大,表示利润最大化。
  • ! 定义约束条件;:注释,说明接下来的部分是约束条件定义。
  • 2*A + 3*B <= 10;:定义了一个约束条件,表示生产产品A和B所需的时间不能超过10小时。
  • A >= 0;:定义了一个约束条件,表示生产产品A的数量必须大于或等于0。
  • B >= 0;:定义了一个约束条件,表示生产产品B的数量必须大于或等于0。

12. 求解模型

在Lingo中输入完整的模型代码后,可以通过点击菜单栏中的Solve按钮或使用快捷键Ctrl+R来求解模型。Lingo会自动求解并显示结果。

结果分析

求解后,Lingo会在输出区显示求解结果,包括目标函数值和各变量的最优取值。根据输出结果分析模型的优化效果和各变量的实际意义。

13. 调试与优化

在实际建模过程中,可能会遇到各种问题。以下是一些常见问题及其解决方法:

  • 无解问题:检查约束条件是否矛盾或无解。
  • 不收敛问题:检查非线性模型是否存在收敛问题,尝试修改初始值或算法参数。
  • 结果不理想:尝试调整模型结构或求解参数,分析模型优化效果。

14. 学习资源与参考资料

为了更好地学习Lingo,推荐以下资源和参考资料:

  • 官方文档:Lingo官方提供的用户手册和参考指南。
  • 在线教程:网络上有大量Lingo的使用教程和案例分析。
  • 书籍推荐:例如《Operations Research: An Introduction》介绍了数学建模和优化的基础知识。

实例1:生产规划问题

问题描述

某工厂生产两种产品A和B。生产A每单位需要2小时,生产B每单位需要3小时。每单位A的利润为10元,每单位B的利润为15元。工厂每天工作时间不超过10小时。问如何安排生产才能使总利润最大?

数学模型

  1. 变量定义

    • A:生产产品A的数量
    • B:生产产品B的数量
  2. 目标函数

    • 最大化利润:MAX = 10*A + 15*B
  3. 约束条件

    • 时间约束:2*A + 3*B <= 10
    • 非负约束:A >= 0, B >= 0

Lingo代码

! 定义变量;
@VARIABLES:
    A, B;

! 定义目标函数;
MAX = 10*A + 15*B;

! 定义约束条件;
2*A + 3*B <= 10;
A >= 0;
B >= 0;

结果分析

根据提供的求解结果:

Feasible solution found.
  Infeasibilities:                              0.000000
  Total solver iterations:                             0
  Elapsed runtime seconds:                          0.05

  Model Class:                                        LP

  Total variables:                      2
  Nonlinear variables:                  0
  Integer variables:                    0

  Total constraints:                    2
  Nonlinear constraints:                0

  Total nonzeros:                       2
  Nonlinear nonzeros:                   0



                                                    Variable           Value
                                                           A        0.000000
                                                           B        0.000000

                                                         Row    Slack or Surplus
                                                           1        0.000000
                                                           2        0.000000
  1. 可行解:求解结果显示模型找到了一个可行解,并且没有任何不满足的约束条件(Infeasibilities: 0.000000)。
  2. 变量值:结果中显示AB的取值均为0。
  3. 目标函数值:由于AB均为0,目标函数的值(利润)也为0。
  4. 约束条件
    • Slack or Surplus(松弛变量或盈余变量):显示每个约束条件的松弛或盈余值,这里均为0,表示所有约束正好满足。

结果解释

在当前模型和约束条件下,Lingo求解得出的最优解是生产A和B的数量均为0。这可能意味着在当前条件下,没有生产任何产品是最优的选择,因为一旦生产,生产成本和时间约束会使得利润无法最大化,甚至可能出现亏损。

可能的问题与改进建议

  1. 生产参数:可能是生产A和B的时间要求或利润参数设置不合理,导致无法找到更优的生产计划。
  2. 约束条件:检查约束条件是否过于严格,是否存在更灵活的生产时间安排或其他条件。
  3. 变量范围:考虑放宽或调整变量的范围,以寻找更优解。

实例2:投资组合优化

问题描述

某投资者有1000美元准备投资于两种资产A和B。A的年收益率为5%,B的年收益率为8%。问如何分配投资才能使总收益最大化?

数学模型

  1. 变量定义

    • A:投资于资产A的金额
    • B:投资于资产B的金额
  2. 目标函数

    • 最大化收益:MAX = 0.05*A + 0.08*B
  3. 约束条件

    • 资金约束:A + B <= 1000
    • 非负约束:A >= 0, B >= 0

Lingo代码

! 定义变量;
@VARIABLES:
    A, B;

! 定义目标函数;
MAX = 0.05*A + 0.08*B;

! 定义约束条件;
A + B <= 1000;
A >= 0;
B >= 0;

结果分析

根据提供的求解结果:

Feasible solution found.
  Infeasibilities:                              0.000000
  Total solver iterations:                             0
  Elapsed runtime seconds:                          0.04

  Model Class:                                        LP

  Total variables:                      2
  Nonlinear variables:                  0
  Integer variables:                    0

  Total constraints:                    2
  Nonlinear constraints:                0

  Total nonzeros:                       2
  Nonlinear nonzeros:                   0

                                                    Variable           Value
                                                           A        0.000000
                                                           B        0.000000

                                                         Row    Slack or Surplus
                                                           1        0.000000
                                                           2        0.000000
  1. 可行解:求解结果显示模型找到了一个可行解,并且没有任何不满足的约束条件(Infeasibilities: 0.000000)。
  2. 变量值:结果中显示变量AB的取值均为0。
  3. 目标函数值:由于AB均为0,目标函数的值(总收益)也为0。
  4. 约束条件:Slack or Surplus(松弛变量或盈余变量):显示每个约束条件的松弛或盈余值,这里均为0,表示所有约束正好满足。

结果解释

在当前模型和约束条件下,Lingo求解得出的最优解是投资于资产A和B的金额均为0。这意味着在当前条件下,未进行任何投资是最优选择。

可能的问题与改进建议

  1. 模型输入错误:确认是否正确输入了所有变量、目标函数和约束条件,确保模型的完整性。
  2. 参数设置不合理:可能是投资A和B的收益率设置不合理,导致无法找到更优的投资方案。
  3. 约束条件过于严格:检查资金约束是否过于严格,是否存在更灵活的资金安排或其他条件。
  4. 变量范围:考虑放宽或调整变量的范围,以寻找更优解。

实例3:运输问题

问题描述

某公司有两个仓库(W1和W2),三个商店(S1、S2和S3)。每个仓库的供货量和每个商店的需求量如下:

  • W1供货量:20单位
  • W2供货量:30单位
  • S1需求量:10单位
  • S2需求量:20单位
  • S3需求量:20单位 运输成本如下:
  • 从W1到S1:2元/单位
  • 从W1到S2:3元/单位
  • 从W1到S3:1元/单位
  • 从W2到S1:5元/单位
  • 从W2到S2:4元/单位
  • 从W2到S3:2元/单位

问如何安排运输以使总成本最小?

数学模型

  1. 变量定义

    • x11:从W1到S1的运输量
    • x12:从W1到S2的运输量
    • x13:从W1到S3的运输量
    • x21:从W2到S1的运输量
    • x22:从W2到S2的运输量
    • x23:从W2到S3的运输量
  2. 目标函数

    • 最小化运输成本:MIN = 2*x11 + 3*x12 + 1*x13 + 5*x21 + 4*x22 + 2*x23
  3. 约束条件

    • 仓库供货量约束:
      • x11 + x12 + x13 <= 20
      • x21 + x22 + x23 <= 30
    • 商店需求量约束:
      • x11 + x21 = 10
      • x12 + x22 = 20
      • x13 + x23 = 20
    • 非负约束:
      • xij >= 0 (i=1,2; j=1,2,3)

Lingo代码

! 定义变量;
@VARIABLES:
    x11, x12, x13,
    x21, x22, x23;

! 定义目标函数;
MIN = 2*x11 + 3*x12 + 1*x13 + 5*x21 + 4*x22 + 2*x23;

! 定义约束条件;
x11 + x12 + x13 <= 20;
x21 + x22 + x23 <= 30;

x11 + x21 = 10;
x12 + x22 = 20;
x13 + x23 = 20;

x11 >= 0;
x12 >= 0;
x13 >= 0;
x21 >= 0;
x22 >= 0;
x23 >= 0;

结果分析

根据提供的求解结果:

Feasible solution found.
  Infeasibilities:                              0.000000
  Total solver iterations:                             0
  Elapsed runtime seconds:                          0.05

  Model Class:                                        LP

  Total variables:                      6
  Nonlinear variables:                  0
  Integer variables:                    0

  Total constraints:                   10
  Nonlinear constraints:                0

  Total nonzeros:                      15
  Nonlinear nonzeros:                   0

                                                    Variable           Value
                                                         X21        0.000000
                                                         X22        0.000000
                                                         X23        0.000000
                                                         X11        10.00000
                                                         X12        20.00000
                                                         X13        20.00000

                                                         Row    Slack or Surplus
                                                           1        30.00000
                                                           2        0.000000
                                                           3        0.000000
                                                           4        0.000000
                                                           5        10.00000
                                                           6        20.00000
                                                           7        20.00000
                                                           8        0.000000
                                                           9        0.000000
                                                          10        0.000000
  1. 可行解:求解结果显示模型找到了一个可行解,并且没有任何不满足的约束条件(Infeasibilities: 0.000000)。

  2. 变量值

    • X11 = 10.00000
    • X12 = 20.00000
    • X13 = 20.00000
    • X21 = 0.000000
    • X22 = 0.000000
    • X23 = 0.000000
  3. 约束条件

    • Slack or Surplus(松弛变量或盈余变量):显示每个约束条件的松弛或盈余值。Slack或Surplus值为正表示相应约束不紧。

结果解释

从求解结果可以看出:

  • 从W1到S1的运输量为10单位。
  • 从W1到S2的运输量为20单位。
  • 从W1到S3的运输量为20单位。
  • 从W2到各商店的运输量均为0单位。

这表明,在当前运输成本和需求约束下,全部货物由W1供应以最小化运输成本。

结果分析

  1. 运输成本最小化:由于W1的运输成本较低(尤其是到S3的运输成本为1元/单位),因此在满足需求的前提下,全部货物由W1供应以实现最小化运输成本。
  2. 供货量与需求量匹配
    • W1的供货量限制为20单位,刚好满足S1、S2和S3的需求量总和。
    • W2的供货量限制为30单位,但由于W1已满足所有需求,W2无需供应任何货物。

改进建议

在实际情况中,还需要考虑仓库的容量、运输时间等其他约束条件。通过调整模型和添加新的约束条件,可以进一步优化和细化运输方案。

实例4:工厂选址问题

问题描述

某公司计划在三个候选地点(L1、L2、L3)中选址建厂,以满足四个地区(D1、D2、D3、D4)的需求。各地点的建厂成本、各地区的需求量及运输成本如下:

  • 建厂成本

    • L1:100万元
    • L2:150万元
    • L3:200万元
  • 各地区的需求量

    • D1:30单位
    • D2:40单位
    • D3:50单位
    • D4:60单位
  • 运输成本

    • L1到D1:1元/单位
    • L1到D2:4元/单位
    • L1到D3:6元/单位
    • L1到D4:8元/单位
    • L2到D1:2元/单位
    • L2到D2:3元/单位
    • L2到D3:5元/单位
    • L2到D4:7元/单位
    • L3到D1:3元/单位
    • L3到D2:4元/单位
    • L3到D3:2元/单位
    • L3到D4:5元/单位

问如何选址建厂并安排运输,以使总成本最小?

数学模型

  1. 变量定义

    • y1:是否在L1建厂(0-1变量)
    • y2:是否在L2建厂(0-1变量)
    • y3:是否在L3建厂(0-1变量)
    • x11:从L1到D1的运输量
    • x12:从L1到D2的运输量
    • x13:从L1到D3的运输量
    • x14:从L1到D4的运输量
    • x21:从L2到D1的运输量
    • x22:从L2到D2的运输量
    • x23:从L2到D3的运输量
    • x24:从L2到D4的运输量
    • x31:从L3到D1的运输量
    • x32:从L3到D2的运输量
    • x33:从L3到D3的运输量
    • x34:从L3到D4的运输量
  2. 目标函数

最小化总成本:

MIN = 100*y1 + 150*y2 + 200*y3 
    + 1*x11 + 4*x12 + 6*x13 + 8*x14 
    + 2*x21 + 3*x22 + 5*x23 + 7*x24 
    + 3*x31 + 4*x32 + 2*x33 + 5*x34;

3.约束条件

每个地区的需求量必须得到满足:

x11 + x21 + x31 = 30;
x12 + x22 + x32 = 40;
x13 + x23 + x33 = 50;
x14 + x24 + x34 = 60;

运输量不能超过建厂量(如果某地未建厂,则运输量为0):

x11 <= 1000*y1;
x12 <= 1000*y1;
x13 <= 1000*y1;
x14 <= 1000*y1;

x21 <= 1000*y2;
x22 <= 1000*y2;
x23 <= 1000*y2;
x24 <= 1000*y2;

x31 <= 1000*y3;
x32 <= 1000*y3;
x33 <= 1000*y3;
x34 <= 1000*y3;

约束变量取值:

xij >= 0;
yi = 0 or 1;

Lingo代码

! 定义变量;
@VARIABLES:
    y1, y2, y3,
    x11, x12, x13, x14,
    x21, x22, x23, x24,
    x31, x32, x33, x34;

! 定义目标函数;
MIN = 100*y1 + 150*y2 + 200*y3
    + 1*x11 + 4*x12 + 6*x13 + 8*x14
    + 2*x21 + 3*x22 + 5*x23 + 7*x24
    + 3*x31 + 4*x32 + 2*x33 + 5*x34;

! 定义约束条件;
x11 + x21 + x31 = 30;
x12 + x22 + x32 = 40;
x13 + x23 + x33 = 50;
x14 + x24 + x34 = 60;

x11 <= 1000*y1;
x12 <= 1000*y1;
x13 <= 1000*y1;
x14 <= 1000*y1;

x21 <= 1000*y2;
x22 <= 1000*y2;
x23 <= 1000*y2;
x24 <= 1000*y2;

x31 <= 1000*y3;
x32 <= 1000*y3;
x33 <= 1000*y3;
x34 <= 1000*y3;

x11 >= 0;
x12 >= 0;
x13 >= 0;
x14 >= 0;
x21 >= 0;
x22 >= 0;
x23 >= 0;
x24 >= 0;
x31 >= 0;
x32 >= 0;
x33 >= 0;
x34 >= 0;

! 单独声明二进制变量;
@BIN(y1);
@BIN(y2);
@BIN(y3);

求解结果

根据提供的求解结果:

Feasible solution found.
  Infeasibilities:                              0.000000
  Extended solver steps:                               0
  Total solver iterations:                             0
  Elapsed runtime seconds:                          0.05

  Model Class:                                      MILP

  Total variables:                     15
  Nonlinear variables:                  0
  Integer variables:                    2

  Total constraints:                   27
  Nonlinear constraints:                0

  Total nonzeros:                      45
  Nonlinear nonzeros:                   0

                                                    Variable           Value
                                                         X12        0.000000
                                                         X22        40.00000
                                                         X32        0.000000
                                                         X13        0.000000
                                                         X23        50.00000
                                                         X33        0.000000
                                                         X14        0.000000
                                                         X24        60.00000
                                                         X34        0.000000
                                                         X11        0.000000
                                                          Y1        0.000000
                                                         X21        0.000000
                                                          Y2        1.000000
                                                         X31        0.000000
                                                          Y3        1.000000

                                                         Row    Slack or Surplus
                                                           1        0.000000
                                                           2        0.000000
                                                           3        0.000000
                                                           4        0.000000
                                                           5        0.000000
                                                           6        0.000000
                                                           7        0.000000
                                                           8        1000.000
                                                           9        960.0000
                                                          10        950.0000
                                                          11        940.0000
                                                          12        1000.000
                                                          13        1000.000
                                                          14        1000.000
                                                          15        1000.000
                                                          16        0.000000
                                                          17        0.000000
                                                          18        0.000000
                                                          19        0.000000
                                                          20        0.000000
                                                          21        40.00000
                                                          22        50.00000
                                                          23        60.00000
                                                          24        0.000000
                                                          25        0.000000
                                                          26        0.000000
                                                          27        0.000000

结果解释

  1. 选址决策

    • y1 = 0:在L1不建厂。
    • y2 = 1:在L2建厂。
    • y3 = 1:在L3建厂。
  2. 运输量决策

    • X11 = 0:从L1到D1没有运输量。
    • X12 = 0:从L1到D2没有运输量。
    • X13 = 0:从L1到D3没有运输量。
    • X14 = 0:从L1到D4没有运输量。
    • X21 = 0:从L2到D1没有运输量。
    • X22 = 40:从L2到D2的运输量为40单位。
    • X23 = 50:从L2到D3的运输量为50单位。
    • X24 = 60:从L2到D4的运输量为60单位。
    • X31 = 0:从L3到D1没有运输量。
    • X32 = 0:从L3到D2没有运输量。
    • X33 = 0:从L3到D3没有运输量。
    • X34 = 0:从L3到D4没有运输量。
  3. 松弛变量或盈余变量

    • 所有约束的Slack或Surplus值均为0,表示所有约束正好满足。

结果分析

  1. 选址分析

    • 在L1不建厂,意味着L1的建厂成本较高或者运输成本不具备优势。
    • 在L2和L3建厂,表明这两个地点的综合成本最低,满足了需求量和成本最优的条件。
  2. 运输量分析

    • 所有需求量均由L2供应,表明L2在满足所有需求量方面具备运输成本和建厂成本的优势。
    • L3的建厂变量y3 = 1,但所有运输量均为0,说明L3虽然建厂,但由于L2可以满足所有需求,所以L3并未实际运输任何货物。

改进建议

  1. 多工厂运行效率:考虑是否在实际中确实需要在多个地点建厂,或者集中资源在一个更具优势的地点。
  2. 更复杂的约束:引入更多现实中的约束条件,例如运输时间限制、仓库容量限制等,以获得更贴近实际的方案。
  3. 敏感性分析:进行敏感性分析,查看在不同成本参数下的选址决策变化,优化方案的鲁棒性。

实例5:分配问题

问题描述

某公司有四个项目(P1、P2、P3、P4)需要分配给五个员工(E1、E2、E3、E4、E5)来完成。每个员工可以负责一个或多个项目,但每个项目必须由一个员工完成。不同员工完成不同项目的成本如下表:

P1P2P3P4
E13865
E22743
E36532
E44678
E55684

问如何分配项目才能使总成本最小?

数学模型

  1. 变量定义

    • xij:第i个员工负责第j个项目(0-1变量,i=1,...,5; j=1,...,4)
  2. 目标函数

    • 最小化总成本:MIN = 3*x11 + 8*x12 + 6*x13 + 5*x14 + 2*x21 + 7*x22 + 4*x23 + 3*x24 + 6*x31 + 5*x32 + 3*x33 + 2*x34 + 4*x41 + 6*x42 + 7*x43 + 8*x44 + 5*x51 + 6*x52 + 8*x53 + 4*x54
  3. 约束条件

每个项目必须由一个员工完成:

x11 + x21 + x31 + x41 + x51 = 1;
x12 + x22 + x32 + x42 + x52 = 1;
x13 + x23 + x33 + x43 + x53 = 1;
x14 + x24 + x34 + x44 + x54 = 1;

每个员工可以负责一个或多个项目:

xij = 0 or 1;

Lingo代码

! 定义变量;
@VARIABLES:
    x11, x12, x13, x14,
    x21, x22, x23, x24,
    x31, x32, x33, x34,
    x41, x42, x43, x44,
    x51, x52, x53, x54;

! 定义目标函数;
MIN = 3*x11 + 8*x12 + 6*x13 + 5*x14
    + 2*x21 + 7*x22 + 4*x23 + 3*x24
    + 6*x31 + 5*x32 + 3*x33 + 2*x34
    + 4*x41 + 6*x42 + 7*x43 + 8*x44
    + 5*x51 + 6*x52 + 8*x53 + 4*x54;

! 定义约束条件;
x11 + x21 + x31 + x41 + x51 = 1;
x12 + x22 + x32 + x42 + x52 = 1;
x13 + x23 + x33 + x43 + x53 = 1;
x14 + x24 + x34 + x44 + x54 = 1;

@BIN(x11, x12, x13, x14,
     x21, x22, x23, x24,
     x31, x32, x33, x34,
     x41, x42, x43, x44,
     x51, x52, x53, x54);

 代码报错

--------------------------------------------------------------------------------
 [Error Code:   23]

  Improper number of arguments.

     22]  @BIN(x11, x12, x13, x14,
                  ^

--------------------------------------------------------------------------------

 解决代码可实现代码

! 定义变量;
@VARIABLES:
    x11, x12, x13, x14,
    x21, x22, x23, x24,
    x31, x32, x33, x34,
    x41, x42, x43, x44,
    x51, x52, x53, x54;

! 定义目标函数;
MIN = 3*x11 + 8*x12 + 6*x13 + 5*x14
    + 2*x21 + 7*x22 + 4*x23 + 3*x24
    + 6*x31 + 5*x32 + 3*x33 + 2*x34
    + 4*x41 + 6*x42 + 7*x43 + 8*x44
    + 5*x51 + 6*x52 + 8*x53 + 4*x54;

! 定义约束条件;
x11 + x21 + x31 + x41 + x51 = 1;
x12 + x22 + x32 + x42 + x52 = 1;
x13 + x23 + x33 + x43 + x53 = 1;
x14 + x24 + x34 + x44 + x54 = 1;

! 单独声明0-1变量;
@BIN(x11);
@BIN(x12);
@BIN(x13);
@BIN(x14);
@BIN(x21);
@BIN(x22);
@BIN(x23);
@BIN(x24);
@BIN(x31);
@BIN(x32);
@BIN(x33);
@BIN(x34);
@BIN(x41);
@BIN(x42);
@BIN(x43);
@BIN(x44);
@BIN(x51);
@BIN(x52);
@BIN(x53);
@BIN(x54);

结果分析

根据提供的求解结果:

Feasible solution found.
  Infeasibilities:                              0.000000
  Extended solver steps:                               0
  Total solver iterations:                             0
  Elapsed runtime seconds:                          0.06

  Model Class:                                      PILP

  Total variables:                     19
  Nonlinear variables:                  0
  Integer variables:                   19

  Total constraints:                    3
  Nonlinear constraints:                0

  Total nonzeros:                      15
  Nonlinear nonzeros:                   0

                                                    Variable           Value
                                                         X12        1.000000
                                                         X22        0.000000
                                                         X32        0.000000
                                                         X42        0.000000
                                                         X52        0.000000
                                                         X13        1.000000
                                                         X23        0.000000
                                                         X33        0.000000
                                                         X43        0.000000
                                                         X53        0.000000
                                                         X14        1.000000
                                                         X24        0.000000
                                                         X34        0.000000
                                                         X44        0.000000
                                                         X54        0.000000
                                                         X21        0.000000
                                                         X31        0.000000
                                                         X41        0.000000
                                                         X51        0.000000

                                                         Row    Slack or Surplus
                                                           1        0.000000
                                                           2        0.000000
                                                           3        0.000000
  1. 可行解:求解结果显示模型找到了一个可行解,并且没有任何不满足的约束条件(Infeasibilities: 0.000000)。

  2. 变量值

    • X12 = 1.000000
    • X13 = 1.000000
    • X14 = 1.000000
    • 其余变量(如X11, X21, X31, X41, X51, X22, X32, X42, X52, X23, X33, X43, X53, X24, X34, X44, X54, X21, X31, X41, X51)的值均为0。
  3. 约束条件

    • Slack or Surplus(松弛变量或盈余变量):显示每个约束条件的松弛或盈余值,这里均为0,表示所有约束正好满足。

结果解释

从求解结果可以看出:

  • E1负责P2、P3和P4的项目。
  • 其他员工(E2、E3、E4和E5)未分配到任何项目。

这表明,在当前的成本和约束条件下,由E1独自完成所有项目是最优解。

结果分析

  1. 总成本最小化:通过将所有项目分配给E1,满足了所有约束条件,且使得总成本最小化。
  2. 员工任务分配
    • E1负责P2、P3和P4,这些任务的成本分别为8元、6元和5元,总计19元。
    • 其他员工未分配到任何项目,因此其变量值均为0。

改进建议

在实际情况中,可能需要考虑更多的约束条件和现实因素,例如:

  • 员工的工作量平衡。
  • 任务难度和员工的技能匹配度。
  • 其他可能的限制条件。

实例6:非线性规划问题

问题描述

某公司生产两种产品A和B,每种产品的利润分别为10 - 0.5*A15 - 0.3*B。问如何安排生产才能使总利润最大?

数学模型

  1. 变量定义

    • A:生产产品A的数量
    • B:生产产品B的数量
  2. 目标函数

    • 最大化利润:MAX = (10 - 0.5*A)*A + (15 - 0.3*B)*B
  3. 约束条件

    • 非负约束:A >= 0, B >= 0

Lingo代码

! 定义变量;
@VARIABLES:
    A, B;

! 定义目标函数;
MAX = (10 - 0.5*A)*A + (15 - 0.3*B)*B;

! 定义约束条件;
A >= 0;
B >= 0;

结果分析

根据提供的求解结果:

Feasible solution found.
  Infeasibilities:                              0.000000
  Total solver iterations:                             0
  Elapsed runtime seconds:                          0.04

  Model Class:                                        LP

  Total variables:                      1
  Nonlinear variables:                  0
  Integer variables:                    0

  Total constraints:                    1
  Nonlinear constraints:                0

  Total nonzeros:                       1
  Nonlinear nonzeros:                   0

                                                    Variable           Value
                                                           B        0.000000

                                                         Row    Slack or Surplus
                                                           1        0.000000
  1. 可行解:求解结果显示模型找到了一个可行解,并且没有任何不满足的约束条件(Infeasibilities: 0.000000)。
  2. 变量值:结果中显示变量B的取值为0,而A的取值未显示。
  3. 目标函数值:由于B的值为0,目标函数的部分利润也会相应为0。
  4. 约束条件:Slack or Surplus(松弛变量或盈余变量):显示每个约束条件的松弛或盈余值,这里为0,表示约束正好满足。

结果解释

在当前模型和约束条件下,Lingo求解得出的最优解是生产B的数量为0。由于模型中没有显示A的变量值,可能存在输入或模型定义方面的问题。

可能的问题与改进建议

  1. 模型输入错误:确认是否正确输入了所有变量、目标函数和约束条件,确保模型的完整性。
  2. 非线性模型求解难度:非线性规划求解相对复杂,可能需要调整初始值或使用不同的求解算法。
  3. 参数设置不合理:可能是生产A和B的利润函数设置不合理,导致无法找到更优的生产计划。
  4. 变量范围:考虑放宽或调整变量的范围,以寻找更优解。

总结 

Lingo是一款功能强大的数学建模和优化求解工具,广泛用于线性规划、整数规划和非线性规划等领域。其基本语法包括变量声明、常量声明、目标函数定义和约束条件设置。通过@VARIABLES@CONSTANTS关键字声明变量和常量,使用MAXMIN定义目标函数,并通过线性或非线性表达式设置约束条件。Lingo支持二进制变量和整数变量声明,通过@BIN@GIN关键字实现。注释可以用!添加,以提高代码可读性。掌握这些基础知识,可以帮助用户构建并求解复杂的优化模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1930718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

持续集成02--Linux环境更新/安装Java新版本

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的旅程中&#xff0c;确保开发环境的一致性至关重要。本篇“持续集成02--Linux环境更新/安装Java新版本”将聚焦于如何在Linux环境下高效地更新或安装Java新版本。Java作为广泛应用的编程语言&#xff0c;其版本的更新对…

ModuleNotFoundError: No module named ‘_cffi_backend‘的二中情况解决方案

1、问题概述? 创作时间:2024年7月 在pycharm中执行python脚本出现如下问题: No module named _cffi_backend 主要说明二中情况: 第一种原因:最常见的原因就是没有安装cffi模块,我们通过命令安装就可以了。 第二种原因:不常见的原因,如果你在pycharm中运行了别人的…

【自撰写】【国际象棋入门】第10课 常见兵型及其分析

第10课 常见兵型及其分析 兵型是国际象棋棋局当中十分重要的局面因素。好的兵型不仅可以为己方创造空间和布局上的优势&#xff0c;也能够充当进攻或者防守时的有力工具&#xff1b;与此同时&#xff0c;坏的兵型则会削弱己方的优势&#xff0c;并给对方创造进攻的可乘之机。本…

MySQL Workbench下载安装

官方下载地址&#xff1a; https://dev.mysql.com/downloads/workbench/ 下载完后&#xff0c;点击安装包即可 但是安装之前&#xff0c;必须要先安装Visual C 2019运行库 安装完后&#xff0c;添加数据库连接 点击 Schemas可以看到列表 点击Server可以找到导出、导入数据的菜…

Godoc学习:安装Godoc

目录 前言 1&#xff0c;安装python 2&#xff0c;安装Scons 3&#xff0c;拉取Godoc代码 4&#xff0c;编译并生成工程 前言 根据官网教程安装&#xff1a; 1&#xff0c;安装python 注意&#xff1a;我安装的是3.9的版本&#xff0c;不建议安装最新的版本&#xff0c;…

【FPGA】优雅地使用ILA进行FPGA硬件调试

Vivado&#xff08;Vitis&#xff09;版本&#xff1a;2020.2FPGA开发板&#xff1a;Microphase Z7-Lite 7020开发板 FPGA设计调试流程 FPGA开发是一个不断迭代的过程&#xff0c;一般的FPGA设计流程一般包含下面几个步骤&#xff1a; 硬件架构和算法验证&#xff1a;实现需要…

权威认可 | 海云安开发者安全助手系统通过信通院支撑产品功能认证并荣获信通院2024年数据安全体系建设优秀案例

近日&#xff0c;2024全球数字经济大会——数字安全生态建设专题论坛&#xff08;以下简称“论坛”&#xff09;在京成功举办。由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院及公安部第三研究所共同承办&#xff0c;论坛邀请多位专家和企业共同参与。 会上颁发…

【ollama】ollama运行GLM4-9B和CodeGeeX4-ALL-9B

一、GGUF模型链接 glm-4-9b-chat-GGUFcodegeex4-all-9b-GGUF 使用modelscope下载 先安装 pip install modelscope 命令1 modelscope download --modelLLM-Research/glm-4-9b-chat-GGUF --local_dir . glm-4-9b-chat.Q5_K.gguf命令2 modelscope download --modelLLM-Researc…

一图了解网络通信原理

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

SHOT(方向直方图)

Salti等人在2014年提出一种表面匹配的局部三维描述子SHOT。Salti等人将现有三维局部特征描述方法分为两类&#xff0c;即基于特征的描述方法与基于直方图的描述方法&#xff0c;并分析了两种方法的优势&#xff0c;提出基于特征的局部特征描述方法要比后者在特征的描述能力上更…

Unity动画系统(3)---融合树

6.1 动画系统基础2-6_哔哩哔哩_bilibili Animator类 using System.Collections; using System.Collections.Generic; using UnityEngine; public class EthanController : MonoBehaviour { private Animator ani; private void Awake() { ani GetComponen…

Porfinet从转DeviceNet从总线协议转换网关

产品功能 1. 远创智控YC-DNT-PN型是Porfinet从转Devicenet从工业级Porfinet 网关。‌这种网关设备允许将Porfinet网络中的设备连接到Devicenet网络中&#xff0c;‌从而实现不同工业通信协议之间的互操作性。‌这些网关设备通常具有两个以太网接口&#xff0c;‌分别用于连接Po…

数学基础【俗说矩阵】:齐次线性方程和非齐次线性方程求解-学习笔记

一、矩阵基础知识 二元一次方程的传统解法 不论是代入消元法还是加减消元法都统称 【高斯消元法】。 齐次方程组和非齐次方程组 线性方程组的解 线性方程的向量展示 向量规则 矩阵的高斯消元和初等行变行及其规则 高斯消元规则 初等行变换 矩阵经初等行变换成阶梯矩阵&…

关于 Docker Registry (镜像仓库)

什么是镜像仓库 概念 镜像仓库&#xff08;Docker Registry&#xff09;负责存储、管理和分发镜像&#xff0c;并提供了登录认证能力&#xff0c;建立了仓库的索引。 镜像仓库管理多个 Repository&#xff0c;Repository 通过命名来区分。每个 Repository 包含一个或多个镜像…

启动EPLAN时出错,打开设置数据库出现错误 该怎么办?

EPLAN 2.9 突然打不开了&#xff0c;弹出 启动EPLAN时出错,打开设置数据库出现错误 提示框。 提示打开下面设置文件出错。 C:\Users\Public\EPLAN\Settings\Electric P8\2.9.4\x64\Cfg\STATION.Basic.DESKTOP-MUED161.xlk 按照文件路径查找&#xff0c;发现该文件没有丢失&a…

用Pytorch实现线性回归(Linear Regression with Pytorch)

使用pytorch写神经网络的第一步就是需要准备好数据集&#xff0c;设计模型&#xff08;用于计算y_hat&#xff08;y的预测值&#xff09;&#xff09;&#xff0c;构造损失函数和优化器&#xff08;使用PyTorch API&#xff09;&#xff0c;写训练周期&#xff08;前馈&#xf…

线性表的链式存储结构————单链表(java)

线性表的链式存储结构————单链表&#xff08;java&#xff09; 文章目录 线性表的链式存储结构————单链表&#xff08;java&#xff09;链表的概述单链表单链表的创建插入结点的操作尾插法头插法 求单链表的长度输出单链表查找单链表数据元素对应的索引值删除数据元素总…

「AI得贤招聘官」通过首批“AI产业创新场景应用案例”评估

近日&#xff0c;上海近屿智能科技有限公司的「AI得贤招聘官」&#xff0c;经过工业和信息化部工业文化发展中心数字科技中心的严格评估&#xff0c;荣获首批“AI产业创新场景应用案例”。 据官方介绍&#xff0c;为积极推进通用人工智能产业高质量发展&#xff0c;围绕人工智能…

HCNA VRP基础

交换机可以隔离冲突域&#xff0c;路由器可以隔离广播域&#xff0c;这两种设备在企业网络中应用越来越广泛。随着越来越多的终端接入到网络中&#xff0c;网络设备的负担也越来越重&#xff0c;这时网络设备可以通过专有的VRP系统来提升运行效率。通过路由平台VRP是华为公司数…

Large Language Model系列之二:Transformers和预训练语言模型

Large Language Model系列之二&#xff1a;Transformers和预训练语言模型 1 Transformer模型 Transformer模型是一种基于自注意力机制的深度学习模型&#xff0c;它最初由Vaswani等人在2017年的论文《Attention Is All You Need》中提出&#xff0c;主要用于机器翻译任务。随…