【数学建模】技术革新——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会在输出区显示求解结果,包括目标函数值和各变量的最优取值。根据输出结果分析模型的优化效果和各变量的实际意义。

评论 86
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李很执着

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值