因为需要,才去学。
感觉有用的
1. LINGO不区分字母的大小写。
2. 可以用CON1表示行号,无论是目标函数还是约束条件,LINGO都表示行号(名字),以便查找。
3. 派生集合有顺序问题。
4. LINGO模型一般由五段构成:集合段、数据段、初始段、目标与约束段、计算段(CALC...ENDCALC).
5. 集合成员无论用何种字符标记,它的索引都是从1开始连续计数,属性之间必须用逗号隔开。
6. 成员列表被忽略时,派生集成员由父集成员所有的组合(笛卡尔乘积)构成,称此为稠密集。限制派生集成员使它成为父集成员所有组合构成的集合中的一个子集,称此派生集为稀疏集。
7. 一个稀疏集的成员列表有两种方式生成:
1. 显示罗列;
2. 设置成员资格过滤器。
8. 把一些逻辑条件视为过滤器,在LINGO生成派生集的成员时将逻辑条件为假的成员从稠密集中过滤掉。
9. 用竖线(|)来标记一个成员资格过滤器的开始。&n视为派生集的第n个基本父集的索引。
10. 集合通常是指一类同类型的事物;集合成员表明集合中的成员名称和规模,在数学表达式中一般是跟下标联系的;属性往往是指一类事物的不同特征,是具体的运算对象;变量一般是指属性数组中的元素(属性加上相应的下标/集合元素);变量名指模型展开后的变量名,也是带有相应的下标(集合元素)的。
11. 在本该放数的地方输入一个问号(?)来处理实时数据。
12. 在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性未知,两个逗号之间可以有空格。
13. 子模型中不再含有集合段、数据段、初始段。
14. 集合循环函数:
@sum @for @prod @max @min
15. 集成员可以不放在集定义中,可以在数据部分来定义。
16. 初始部分是个可选部分,在初始部分输入的值仅被LINGO求解器当做初始点来用,并且仅仅对非线性模型有用。
17. @for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束。 冒号前面得是集的名字,后面是约束的表达式。
每次都有种错觉,感觉看别人做的我也可以做的出来。。。。。但是真的自己上手时发现啥都不会。。。。。第一步都解决不了——把方程给列出来。。。。。囧~。
若干天没用这个软件,突然之间有个地方不通的突然通了,然后突然感受到了集的强大所在,运气真好~哈哈~
练习的地方:LINGO学习笔记
困惑地方
1.@wrap(index,limit): 该函数返回 j=index-k*limit, 其中k是一个整数,取适当值保证 j 落在区间 [1,limit] 内。该函数相当于Index模 limit 再加1。该函数在循环、多阶段计划编制中特别有用。(好吧,我承认很有用,不过怎么去理解和使用这个函数呢?还有,那个k是什么鬼。。。。)
对这个函数的困惑来自于网上的题目,是一道关于安排医院医护人员上班工作时间分配问题,看了答案感觉问题并不大,可惜并没有人去解释结果代表着什么意思,为什么这样来的。
题目如下:
一项工作一周 7 天都需要有人(比如护士工作), 每天(周一至周日) 所需的最少职员数为 20、 16、 13、 16、 19、 14 和 12, 并要求每个职员一周连续工作 5 天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。
答案如下:
model:
sets:
days/mon..sun/: required,start;
endsets
data:
!每天所需的最少职员数;
required = 20 16 13 16 19 14 12;
enddata
!最小化每周所需职员数;
min=@sum(days: start);
@for(days(J):
@sum(days(I) | I #le# 5:
start(@wrap(J+I+2,7))) >= required(J));
end
自己的理解:代码段@for(day(J)>=requied(J)),这个是题目给出的,显而易见的,对于当天而言,即
days(J): @sum(days(I) | I #le# 5:start(@wrap(J+I+2,7)))
有个约束条件,每个人要连续工作五天,所以要对当天值班的人进行成员过滤,当天的值班的人为,start(@wrap(J+I+2,7))的和
% 现在突然不感兴趣了~~