当前位置: 首页 > news >正文

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

目录

基础知识

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.000000Total solver iterations:                             0Elapsed runtime seconds:                          0.05Model Class:                                        LPTotal variables:                      2Nonlinear variables:                  0Integer variables:                    0Total constraints:                    2Nonlinear constraints:                0Total nonzeros:                       2Nonlinear nonzeros:                   0Variable           ValueA        0.000000B        0.000000Row    Slack or Surplus1        0.0000002        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.000000Total solver iterations:                             0Elapsed runtime seconds:                          0.04Model Class:                                        LPTotal variables:                      2Nonlinear variables:                  0Integer variables:                    0Total constraints:                    2Nonlinear constraints:                0Total nonzeros:                       2Nonlinear nonzeros:                   0Variable           ValueA        0.000000B        0.000000Row    Slack or Surplus1        0.0000002        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.000000Total solver iterations:                             0Elapsed runtime seconds:                          0.05Model Class:                                        LPTotal variables:                      6Nonlinear variables:                  0Integer variables:                    0Total constraints:                   10Nonlinear constraints:                0Total nonzeros:                      15Nonlinear nonzeros:                   0Variable           ValueX21        0.000000X22        0.000000X23        0.000000X11        10.00000X12        20.00000X13        20.00000Row    Slack or Surplus1        30.000002        0.0000003        0.0000004        0.0000005        10.000006        20.000007        20.000008        0.0000009        0.00000010        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.000000Extended solver steps:                               0Total solver iterations:                             0Elapsed runtime seconds:                          0.05Model Class:                                      MILPTotal variables:                     15Nonlinear variables:                  0Integer variables:                    2Total constraints:                   27Nonlinear constraints:                0Total nonzeros:                      45Nonlinear nonzeros:                   0Variable           ValueX12        0.000000X22        40.00000X32        0.000000X13        0.000000X23        50.00000X33        0.000000X14        0.000000X24        60.00000X34        0.000000X11        0.000000Y1        0.000000X21        0.000000Y2        1.000000X31        0.000000Y3        1.000000Row    Slack or Surplus1        0.0000002        0.0000003        0.0000004        0.0000005        0.0000006        0.0000007        0.0000008        1000.0009        960.000010        950.000011        940.000012        1000.00013        1000.00014        1000.00015        1000.00016        0.00000017        0.00000018        0.00000019        0.00000020        0.00000021        40.0000022        50.0000023        60.0000024        0.00000025        0.00000026        0.00000027        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.000000Extended solver steps:                               0Total solver iterations:                             0Elapsed runtime seconds:                          0.06Model Class:                                      PILPTotal variables:                     19Nonlinear variables:                  0Integer variables:                   19Total constraints:                    3Nonlinear constraints:                0Total nonzeros:                      15Nonlinear nonzeros:                   0Variable           ValueX12        1.000000X22        0.000000X32        0.000000X42        0.000000X52        0.000000X13        1.000000X23        0.000000X33        0.000000X43        0.000000X53        0.000000X14        1.000000X24        0.000000X34        0.000000X44        0.000000X54        0.000000X21        0.000000X31        0.000000X41        0.000000X51        0.000000Row    Slack or Surplus1        0.0000002        0.0000003        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.000000Total solver iterations:                             0Elapsed runtime seconds:                          0.04Model Class:                                        LPTotal variables:                      1Nonlinear variables:                  0Integer variables:                    0Total constraints:                    1Nonlinear constraints:                0Total nonzeros:                       1Nonlinear nonzeros:                   0Variable           ValueB        0.000000Row    Slack or Surplus1        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关键字实现。注释可以用!添加,以提高代码可读性。掌握这些基础知识,可以帮助用户构建并求解复杂的优化模型。

相关文章:

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

目录 基础知识 1. 变量声明 示例 2. 常量声明 语法格式 示例 3. 目标函数 语法格式 示例 4. 约束条件 语法格式 示例 5. 完整的Lingo模型示例 示例 解释 6. 整数变量声明 语法格式 示例 7. 非线性规划 示例 8. 多目标优化 语法格式 示例 9. 数据输入与…...

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中&#xff0c;然后在将用户的查询向量化&#xff0c;从向量数据库中召回相似性数据&#xff0c;构造成 context template, 放到 LLM 中进行查询…...

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

DockerCompose介绍,安装,使用

DockerCompose 1、Compose介绍 将单机服务-通过Dockerfile 构建为镜像 -docker run 成为一个服务 user 8080 net 7000 pay 8181 admin 5000 监控 .... docker run 单机版、一个个容器启动和停止问题&#xff1a; 前面我们使用Docker的时候&#xff0c;定义 Dockerfil…...

N叉树的前序遍历

Problem: 589. N 叉树的前序遍历 文章目录 思路解题过程Code 思路 前序遍历&#xff0c;遇到空节点返回 解题过程 对每个节点进行遍历 Code /* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node() {}Node(int _val) {val _val;}Nod…...

Linux C++ 054-设计模式之外观模式

Linux C 054-设计模式之外观模式 本节关键字&#xff1a;Linux、C、设计模式、外观模式 相关库函数&#xff1a; 概念 外观模式&#xff08;Facade&#xff09;&#xff0c;亦称“过程模式”。主张按照描述和判断资料来评价课程&#xff0c;关键的活动是在课程实施的全过程中…...

Linux - 冯-诺依曼体系结构、初始操作系统

目录 冯•诺依曼体系 结构推导 内存提高效率的方法 数据的流动过程 体系结构相关知识 初始操作系统 定位 设计目的 操作系统之上之下分别有什么 管理精髓&#xff1a;先描述&#xff0c;再组织 冯•诺依曼体系 结构推导 计算机基本工作流程图大致如下&#xff1a; 输入设备&a…...

成功适配!极验设备指纹HarmonyOS 鸿蒙版官方下载

近日&#xff0c;华为开发者大会&#xff08;HDC 2024&#xff09;在东莞召开。在大会开幕日的首场主题演讲中&#xff0c;华为宣布当前已有TOP5000应用成为鸿蒙原生应用&#xff0c;350&#xff0b;SDK已适配HarmonyOS NEXT版本。其中&#xff0c;极验作为其重要伙伴&#xff…...

【C++】字符串学习 知识点+代码记录

一.知识点总结 1. C风格字符串&#xff08;字符数组&#xff09; 字符数组存储字符串&#xff1a;C风格的字符串实际上是字符数组&#xff0c;以空字符\0作为结尾标志。字符串字面量与字符数组&#xff1a;字符串字面量如"Hello"被编译器视为const char*类型&#…...

尝试理解docker网络通信逻辑

一、docker是什么 Docker本质是一个进程,宿主机通过namespace隔离机制提供进程需要运行基础环境&#xff0c;并且通过Cgroup限制进程调用资源。Docker的隔离机制包括 network隔离&#xff0c;此次主要探讨网络隔离mount隔离hostname隔离user隔离pid隔离进程通信隔离 二、doc…...

数据仓库哈哈

数据仓库 基本概念数据库&#xff08;database&#xff09;和数据仓库&#xff08;Data Warehouse&#xff09;的异同 整体架构分层架构方法论ER模型&#xff08;建模理论&#xff09;维度模型 何为分层第一层&#xff1a;数据源&#xff08;ODS ER模型&#xff09;设计要点日志…...

K最近邻(K-Nearest Neighbors, KNN)

K最近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;理论知识推导 KNN算法是一个简单且直观的分类和回归方法&#xff0c;其基本思想是&#xff1a;给定一个样本点&#xff0c;找到训练集中与其最近的K个样本点&#xff0c;根据这些样本点的类别&#xff08;分类问题&am…...

深度学习损失计算

文章目录 深度学习损失计算1.如何计算当前epoch的损失&#xff1f;2.为什么要计算样本平均损失&#xff0c;而不是计算批次平均损失&#xff1f; 深度学习损失计算 1.如何计算当前epoch的损失&#xff1f; 深度学习中的损失计算&#xff0c;通常为数据集的平均损失&#xff0…...

论文翻译:通过云计算对联网多智能体系统进行预测控制

通过云计算对联网多智能体系统进行预测控制 文章目录 通过云计算对联网多智能体系统进行预测控制摘要前言通过云计算实现联网的多智能体控制系统网络化多智能体系统的云预测控制器设计云预测控制系统的稳定性和一致性分析例子结论 摘要 本文研究了基于云计算的网络化多智能体预…...

Java核心(五)多线程

线程并行的逻辑 一个线程问题 起手先来看一个线程问题&#xff1a; public class NumberExample {private int cnt 0;public void add() {cnt;}public int get() {return cnt;} }public static void main(String[] args) throws InterruptedException {final int threadSiz…...

IDEA快速生成项目树形结构图

下图用的IDEA工具&#xff0c;但我觉得WebStorm 应该也可以 文章目录 进入项目根目录下&#xff0c;进入cmd输入如下指令&#xff1a; 只有文件夹 tree . > list.txt 包括文件夹和文件 tree /f . > list.txt 还可以为相关包路径加上注释...

【CPO-TCN-BiGRU-Attention回归预测】基于冠豪猪算法CPO优化时间卷积双向门控循环单元融合注意力机制

基于冠豪猪算法CPO&#xff08;Correlation-Preservation Optimization&#xff09;优化的时间卷积双向门控循环单元&#xff08;Bidirectional Gated Recurrent Unit&#xff0c;BiGRU&#xff09;融合注意力机制&#xff08;Attention&#xff09;的回归预测需要详细的实现和…...

面试高级 Java 工程师:2024 年的见闻与思考

面试高级 Java 工程师&#xff1a;2024 年的见闻与思考 由于公司业务拓展需要&#xff0c;公司招聘一名高级java工程研发工程师&#xff0c;主要负责新项目的研发及老项目的维护升级。我作为一名技术面试官&#xff0c;参与招聘高级 Java 工程师&#xff0c;我见证了技术领域的…...

设计模式大白话之装饰者模式

想象一下&#xff0c;你走进一家咖啡馆&#xff0c;点了一杯美式咖啡。但是&#xff0c;你可能还想根据自己的口味添加一些东西&#xff0c;比如奶泡、巧克力粉、焦糖酱或是肉桂粉。每次你添加一种配料&#xff0c;你的咖啡就会变得更丰富&#xff0c;同时价格也会相应增加。 在…...

动手学深度学习6.3 填充和步幅-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;填充和步幅_哔哩哔哩_bilibili 代码实现_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.3. 填充和…...

函数的形状怎么定义?

在TypeScript中&#xff0c;函数的形状可以通过多种方式定义&#xff0c;以下是几种主要的方法&#xff1a; 1、函数声明&#xff1a;使用function关键字声明函数&#xff0c;并直接在函数名后的括号内定义参数&#xff0c;通过冒号&#xff08;:&#xff09;指定参数的类型&a…...

Windows 虚拟机服务器项目部署

目录 一、部署JDK下载JDK安装JDK1.双击 jdk.exe 安装程序2.点击【下一步】3.默认安装位置&#xff0c;点击【下一步】4.等待提取安装程序5.默认安装位置&#xff0c;点击【下一步】6.等待安装7.安装成功&#xff0c;点击【关闭】 二、部署TomcatTomcat主要特点包括&#xff1a;…...

JDBC(2)基础篇2——增删改查及常见问题

目录 一、基于PreparedStatement实现CRUD 1.查询单行单列 2.查询单行多列 3.查询多行多列 4.新增 5.修改 6.删除 7.总结 二、常见问题 1.资源的管理 2.SQL语句问题 3.SQL语句未设置参数问题 4.用户名或密码错误问题 5.通信异常 总结 一、基于PreparedStatement实…...

JVM知识点梳理

目录标题 1.类加载机制1.1 Java 运行时一个类是什么时候被加载的?1.2 JVM 一个类的加载过程?1.3 一个类被初始化的过程?1.4 继承时父子类的初始化顺序是怎样的?1.5 究竟什么是类加载器?1.6 JVM 有哪些类加载器?1.7 JVM 中不同的类加载器加载哪些文件?1.8 JVM 三层类加载…...

产品经理-一份标准需求文档的8个模块(14)

一份标准优秀的产品需求文档包括&#xff1a; ❑ 封面&#xff1b; ❑ 文档修订记录表&#xff1b; ❑ 目录&#xff1b; ❑ 引言&#xff1b; ❑ 产品概述&#xff1a;产品结构图 ❑ 详细需求说明&#xff1a;产品逻辑图、功能与特性简述列表、交互/视觉设计、需求详细描述&am…...

如何用一个例子向10岁小孩解释高并发实时服务的单线程事件循环架构

I/O密集型进程和CPU密集型进程 聊天应用程序、MMO&#xff08;大型多人在线&#xff09;游戏、金融交易系统、等实时服务需要处理大量并发流量和实时数据。 这些服务是I/O密集型的&#xff0c;因为它们花费大量资源处理输入输出操作&#xff0c;例如高吞吐量、低延迟网络通信…...

如何为帕金森病患者选择合适的步行辅助设备?

选择步行辅助设备的步骤和建议 为帕金森病患者选择合适的步行辅助设备时&#xff0c;应考虑以下几个关键因素&#xff1a; 患者的具体症状和需求&#xff1a;帕金森病患者的步行困难可能包括冻结步态、平衡能力下降和肌肉僵硬。选择设备时&#xff0c;应考虑这些症状&#xff…...

【排序算法】1.冒泡排序-C语言实现

冒泡排序&#xff08;Bubble Sort&#xff09;是最简单和最通用的排序方法&#xff0c;其基本思想是&#xff1a;在待排序的一组数中&#xff0c;将相邻的两个数进行比较&#xff0c;若前面的数比后面的数大就交换两数&#xff0c;否则不交换&#xff1b;如此下去&#xff0c;直…...

Unity最新第三方开源插件《Stateful Component》管理中大型项目MonoBehaviour各种序列化字段 ,的高级解决方案

上文提到了UIState, ObjectRefactor等,还提到了远古的NGUI, KBEngine-UI等 这个算是比较新的解决方法吧,但是抽象出来,问题还是这些个问题 所以你就说做游戏是不是先要解决这些问题? 而不是高大上的UiImage,DoozyUI等 Mono管理引用基本用法 ① 添加Stateful Component …...

Spark SQL----INSERT TABLE

Spark SQL----INSERT TABLE 一、描述二、语法三、参数四、例子4.1 Insert Into4.2 Insert Overwrite 一、描述 INSERT语句将新行插入表中或覆盖表中的现有数据。插入的行可以由值表达式指定&#xff0c;也可以由查询结果指定。 二、语法 INSERT [ INTO | OVERWRITE ] [ TABL…...