目录
专栏:数学建模学习笔记
基础知识
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. 目标函数
目标函数是模型的核心部分,用于定义需要最小化或最大化的表达式。使用MIN
或MAX
关键字来定义目标函数。
语法格式
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;
:定义了一个约束条件,表示x
和y
的和不能超过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;
:定义了一个约束条件,表示x
和y
的和不能超过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小时,问如何安排生产才能获得最大利润?
数学模型
-
变量定义:
A
:生产产品A的数量B
:生产产品B的数量
-
目标函数:
- 最大化利润:
MAX = 10*A + 15*B
- 最大化利润:
-
约束条件:
- 时间约束:
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会在输出区显示求解结果,包括目标函数值和各变量的最优取值。根据输出结果分析模型的优化效果和各变量的实际意义。