准备数学建模比赛中,使用的是Lingo软件,将学习中遇到的问题做下总结:
资料总结链接:https://blog.youkuaiyun.com/yzu_120702117/article/details/38415153
1、关于数学函数使用过程的问题
model:
sets:
object/1 .. 3/: f;
endsets
data:
a, b = 3, 4;
x = ?;
enddata
@free(x);
f(1) = a*@sin(x);
f(2) = b*@cos(x);
f(3) = a*@sin(x) + b*@cos(x);
y = @smax(f(1), f(2), f(3));
end
思路:建立集合,并将函数值保存到每个成员中的 f 中。
目的:练习使用集合以及常用函数。
遇到的问题:每次输入大于1.57(这是弧度,对应的角度就是大于90),就报错如下:
意思就是说:f (2)的式子约束太多,不能表示出来,请减少变量约束;
其实也很好理解,当大于90时,cos(x)是小于0的,这时候就不能正常表示,需要free ( f ),让f可以为任意数。
代码加一句@for(object(i): @free(f(i)));
即可(这是针对集合的语句呦)。
2、关于经典例题–职员时序安排问题求解思路
题目:职员时序安排模型 一项工作一周七天都需要有人,每天(周一至周日)所需的最少职员数位20,16,13,19,14和12
,并要求每个职员一周连续工作5天
,试求每周所需最少的职员数
,并给出安排。注意这里我们考虑稳定后的情况。
- 按照决策变量,目标函数,约束条件的思路从题目中提取相关信息。
① 根据一周连续工作5天
,设决策变量为从周x开始的员工。(我用集合来表示:n(1)为周一开始工作的员工数目,…n(7)为周日开始工作的员工数目)
② 根据最少的职员数
,确定木匾函数为n(1) + … + n(7)的最小值。
③ 根据最少职员数位20,16,13,19,14和12
,确定约束条件。
N(1) + N(4) + N(5) + N(6) + N(7) >= 20;
N(1) + N(2) + N(5) + N(6) + N(7) >= 16;
N(1) + N(2) + N(3) + N(6) + N(7) >= 13;
N(1) + N(2) + N(3) + N(4) + N(7) >= 16;
N(1) + N(2) + N(3) + N(4) + N(5) >= 19;
N(2) + N(3) + N(4) + N(5) + N(6) >= 14;
N(3) + N(4) + N(5) + N(6) + N(7) >= 12;
- 这些分析完成之后,写代码就很简单了:
model:
sets:
!决策变量:设员工周x开始工作的员工数目为n(x);
workers/1 .. 7/:n;
endsets
!员工数目为整数;
@for(workers(i): @gin(n));
!目标函数;
min = @sum(workers(i):n);
!约束条件;
n(1) + n(4) + n(5) + n(6) + n(7) >=20;
n(1) + n(2) + n(5) + n(6) + n(7) >= 16;
n(1) + n(2) + n(3) + n(6) + n(7) >= 13;
n(1) + n(2) + n(3) + n(4) + n(7) >= 16;
n(1) + n(2) + n(3) + n(4) + n(5) >= 19;
n(6) + n(2) +