【数学建模】【lingo】lingo的基本操作
整体结构
lingo的代码主要分为预定义、数据的输⼊、⽬标函数、决策变量、约束条件五个板块。
注:
1、lingo代码需要以model开始,以end作为结束,但是在简单的模型中,这两个语句都可以省略。
2、每⾏代码后⾯都需要⼀个英⽂状态下的分号。
3、lingo中不区分⼤⼩写,变量名可以超过8个,但是不能超过32个,命名⽅式与其他编程语⾔要求⼀样,必须以字母开头,由字母、数字、和下划线组成,代码中的命名以清晰作为要求,即看到名称就可以辨认出这个变量所代表的意义。
4、lingo中的注释需要⽤“!”,并且在最后也需要加上分号。
5、lingo解优化模型时已经假定所有变量⾮负,如果想解除限制需要使⽤函数@free(x),这样x可以取到任意实数。
6、lingo的每个语句可以加标号,例如[OBJ],这样在输出的时候也会输出,使得我们便于识别输出结果的含义。
常⽤符号及语句
逻辑运算符
'''
#not# ! 否定该操作数的逻辑值;
#eq# ! 若两个运算数相等,则为true,否则为flase(equal);
#ne# ! 若两个运算符不相等,则为true,否则为flase(not equal);
#gt# ! 若左 > 右,则为true,否则为flase(greater than);
#ge# ! 若左 >= 右,则为true,否则为flase(greater than or equal than);
#lt# ! 若左 < 右,则为true,否则为flase(less than);
#le# ! 若左 <= 右,则为true,否则为flase(less than or equal than);
#and# ! 当两个参数都为true时,则为true,否则为flase(并且);
#or# ! 当两个参数都为flase,则为flase,否则为true(或者);'''
例如这种情况中,i本⾝的范围是1 ~ 20,⽽此处需要将其限制在1 ~ 2的范围内:
'''
@sum(link(i,j)|i#le#2:x(i,j))=1000;'''
关系运算符
关系运算符分为三种“=”, “<=”,“>=”。这三种运算符,也就是数学含义。
注:lingo中“<”,“>”分别表⽰⼩于等于和⼤于等于,如果需要严格⼩于或者严格⼤于,例如A < B,可以表达成
A + x <= B的形式,此处x是⼀个很⼩的正数,它的值依赖于模型中A⼩于B多少才符合要求。
数学函数
数学函数有很多,在这边仅列出⼏个常⽤的,在实际操作过程中如果有需要的可以⾃⾏上⽹查询
'''
abs(x) ! 返回x的绝对值;
exp(x) ! 返回常数e的x次⽅;
sin(x) ! 返回x的正弦值,x采⽤弧度制;
log(x) ! 返回x的⾃然对数;
cos(x) ! 返回x的余弦值;
lgm(x) ! 返回x的log的⾃然对数;
tan(x) ! 返回x的正切值;
sign(x) ! 如果x<0,返回-1,否则返回1;
smax(x1, x2, x3, x4, ...xn) ! 返回xn中的最⼤值;
smin(x1, x2, x3, x4, ...xn) ! 返回xn中的最⼩值;
floor(x) ! 向接近于0的⽅向取整;'''
输⼊输出
1、@text函数:该函数⽤于把数据部分分解输出到⽂本⽂件中。
'''
@text(['filename'])'''
filename是⽂件名,可以采⽤相对路径和绝对路径两种表达⽅式,如果忽略filename,那么数据就被输出到标准输出设备(⼤多情况是屏幕),右边为需要输出的集合。
⽤法实例:
model:
sets:text函数什么意思
days/mon..sun/: required,start;
endsets
data:
!每天所需的最少职员数;
required =20161316191412;
@text('')=days '⾄少需要的职员数为' start;
enddata
!最⼩化每周所需职员数;
min=@sum(days: start);
@for(days(J):
@sum(days(I)| I #le# 5:
start(@wrap(J+I+2,7)))>= required(J));
end
运⾏该代码可以在lingo所在的位置得到如下⼀个名为“out”的⽂本⽂件
2、@ole函数:从excel中引⼊或输出数据的接⼝函数
'''
x = @ole('路徑', '表格中的名字');'''
这边需要讲⼀下“表格中的名字”是什么意思,以excel为例,选中需要导⼊的数字,然后点击“公式”-“定义名称”,最后把名称改为你希望的名称即可。单击“名称管理器”可以查看所有的名称,并对其进⾏统⼀操作。
⽤法实例:
x =@OLE('D:/cost.xls',f)
这个代码意思是从D盘名为“cost”的excel表格中,获取表格名为“f”的数据,并将其赋值给x。
集合的概念:
sets:
supply/1..2/:s;
demand/1..3/:d;
link(supply, demand):road, g;
endsets
初始集合分别为⼀维数组supply和demand,其中取值范围分别为1 ~ 2和1 ~ 3,supply和deman分别为数组的类型名,后⾯代表变量名。
link:衍⽣集合将两个集合合起来形成⼀个⼆维集合,可以理解成表格的形式,例如此题中的road和g的形式就是⼀个2⾏3列的表格。@sum函数
@sum(数组类型名(下标):计算公式)
⾸先要知道在第⼀部分我们可以知道,求和是对i的求值,并且i为数组supply的下标范围,所以为
@sum(supply(i): g(i, j))
同理可得:
@sum(link(i, j): g(i, j)* L(i, j))
@for函数
@for(数组类型名(下标):具体操作)
我最初学的时候很难理解这个等式的意思,现在知道是:
在j分别=1、2、3的时候,对i = 1,2的情况进⾏累加求和判断达到相等的要求。
@for(demand(j):@sum(supply(i): g(i, j))= d(j))
运⾏结果分析
以这个运⾏结果为例
Global optimal solution
整个代码运⾏2次得到了如下结果
Objective value
⽬标函数的最值,也就是运⾏结果为29000.00
第⼀个表格
两个变量的值分别取到100.0000, 和30.00000的时候得到上⾯所说的⽬标函数的值。
Reduced cost:缩减成本系数,表⽰变量有微⼩变动的时候,⽬标函数的变化率,如果是最优解那就⾃动取零。
第⼆个表格
Slack or Surplus:松弛或者剩余,约束条件为“<=”时,右边减左边的差值称为松弛,对于“>=”的不等式,左边减右边的差值称为剩余,当约束条件的左右两边相等,也就是理想状态时,松弛或剩余的值为0,如果约束条件⽆法满⾜,则松弛或剩余的值为0。
Dual price:影⼦价格,表⽰对应约束有微⼩变动的时候,⽬标函数的变化率。
⽐如说第⼆⾏:因为松弛或者剩余的值为0,所以影⼦价格才有意义(如果不为0,那本⾝都不紧,⼗分松的情况下+1, -1就没有这个必要),假设第⼆⾏代表的不等式是:x2 <= 10,那影⼦价格50的含义就是,如果把10变成11,⽬标函数的结果就会+50。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论