前言:我是看的这个教程。
【【数模常用软件Lingo教程】O奖讲解数模规划问题利器Lingo一小时速成】https://www.bilibili.com/video/BV17T4y1K7sL?p=3&vd_source=1e49cb28b33d3c8796cd2de6b1d560d9
内有些图来源于这个up,纯想省事,侵权删。
1.介绍lingo
1.1 基本概念
LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,由美国LINDO系统公司(Lindo System Inc.)推出的,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。
其特色在于内置建模语言,提供十几个内部函数,可以允许决策变量是整数(即整数规划,包括 0-1 整数规划),方便灵活,而且执行速度非常快。能方便与EXCEL,数据库等其他软件交换数据。LINGO18.0为最新版本。
1.2 lingo函数
1.2.1 基本运算符
算术运算符:
逻辑运算符:
在lingo中,逻辑运算符主要用于集循环函数的条件表达式中,控制在函数中哪些集成员被包含,哪些被排斥。在创建稀疏集是用在成员资格过滤器中。
一共有9中逻辑运算符
#not# | 否定该操作数的逻辑值。一元运算符 |
#eq# | 若两个运算符相等,则返回true;否则false |
#ne# | 不相等,true;否则false |
#gt# | 左严格大于右为true |
#ge# | 左大于等于右时为true |
#lt# | 左严格小于右为true |
#le# | 左小于等于右为true |
#and# | 仅当两个参数为true时 为true |
#or# | 仅当两个参数为false时 为false |
运算符优先级
由高到低-------->
#not#
#eq# #ne# #gt# #ge# #lt# #le#
#and# #or#
< > =
字母缩写辅助:
g:greater
e:equal
l:less
n:not
t:than
关系运算符
在lingo中,关系运算符主要用于在模型中,用来指定一个表达式的左边是否等于、小于等于或者大于等于右边,形成模型的一个约束条件。关系元素安抚与逻辑运算符截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该关系是否被满足:满足为真,不满足为假。
lingo有三种关系运算符:“=” “<”和“>”。lingo"<"表示小于等于关系,“>”表示大于等于。lingo并不支持严格小于和严格大于关系运算符。然而,如果需要雅阁小于和严格大于,可以加上一点条件。
比如说想要a<b;可以在lingo输入a<b+0.001。
1.2.2 数学运算符
三角函数和常规的数学函数
常用数学运算符:
@abs(x) | 返回x的绝对值 |
@sin(x) | 返回x的正弦值,x采用弧度制 |
@cos(x) | 返回x的余弦值 |
@exp(x) | 返回常数e的x次方 |
@log(x) | 返回x的自然对数 |
@lgm(x) | 返回gamma函数的额自然对数 |
@tan(x) | 返回正切值 |
@sign(x) | x<0 返回-1;否则,返回1 |
@smin(x1,x2,x3,...,xn) | 返回最小值 |
@smax(x1,x2,x3,...,xn) | 返回最大值 |
@floor(x) | 返回整数x的整数部分 |
@qrand(seed) | 产生服从(0,1)区间的拟随机数 |
@rand(seed) | 产生服从(0,1)区间的拟随机数 |
1.2.3 金融函数
lingo提供的两种金融函数
1.2.4 概率函数
1.2.5 界定函数
变量界定函数实现对变量取值范围的附加限制,共 4 种
@bin(x)限制 x 为 0 或 1;
@bnd(L,x,U)限制 L≤x≤U;
@free(x)取消对变量 x 的默认下界为 0 的限制,即 x 可以取任意实数;
@gin(x)限制 x 为整数。
1.2.6 其他函数
1.3 lingo注意事项
- lingo中模型一“model:”开始,以“end”结束,对于简单的模型,可以省略。
- lingo中每行后面均增加了一个分号“;”;
- 所有符号都需要英文状态下输入;
- min=函数,max=函数,表示求函数的最小,最大值;
- lingo中变量不区分大小写,变量名可以超过8个,但不能超过32个,需以字母开头;
- 用lingo解优化模型时已假定所有变量非负,如果想要解除这个限制可以用函数@free(x),这样x可以取到任意实数。
- 变量可以放在约束条件右端,同时数字也可以放在约束条件左边;
- lingo模型语句由一系列语句组成,每一个语句都必须以“;”结尾;
- lingo中以“!”开始的是说明语句,说明语句也以“;”结尾
2.实例讲解
2.1工厂生产线问题
2.1.1题目
2.1.2 lingo代码
model:
max=200*x1+300*x2;
x1<100;
x2<120;
x1+2*x2<160;
end
按这个正中靶心图像,然后运行,也可以ctrl+u。
2.1.3 结果
这个界面我们看这个图,来自这位大佬的解释 LINGO语法及软件操作_infinite_with的博客-CSDN博客
解释:
简单总结:
slack or surplus是大的减小的,小于号就是slack(松弛),大于号就是surplus(剩余)
行数开始是从model 求目标值函数开始,即max=200*x1+300*x2;
dual price就是影子价格,如果放松这个约束条件,还能增加多少利润