lingo基础入门Day 5
文章目录
lingo的原始集合的定义
-
通过列举全部元素所定义的是原始(Primary Set),又被称为基本集合。
-
通过原始集合派生所定义的集合是派生集合(Derived Set)。
-
原始集合和派生集合都在集合段中定义。
-
集合段以SETS:开始,以ENDSETS结束。
-
定于原始集合的语法:
集合名[/集合的元素列表/] [集合的属性列表];
集合的命名
标识符的命名规范
- 起始字符只能说字母或者下划线,后续字符只能是字母、数字或者下划线。
- 标识符最长为32个字符。
- 标识符不区分大小写。
集合的元素命名
集合元素的命名也要遵循标识符的命名规范。
集合元素命名有特例:集合元素可以是整数。
集合的元素列表
显式罗列:
将集合的每一个元素都完完整整的写出来的方式。
ITEM/1 2 3 4 5 6/;
隐式罗列:
集合中的元素有一定的递增规律,写成起始元素…终止元素的形式
ITEM/1..6/;
隐式罗列的全部列表形式:
格式 | 实例 | 集合元素 |
---|---|---|
1…n | 1…6 | 1 2 3 4 5 6 |
alphM…alphN | a…h | a b c d e f g h |
stringM…stringN | truck6…truck11 | |
dayM…dayN | MON…FRI | MON TUE WED THU FRI |
monthM…monthN | OCT…JAN | OCT NOV DEC JAN |
monthyearM…monthyearN | OCT2001…JAN2002 | OCT2001 NOV2001 DEC2001 JAN2002 |
集合的属性列表
集合的属性列表就是下标是该集合类型的向量的列表,属性之间只能用逗号分割开来(而不能用空格分隔)
ITEM/1..60/: WEIGHT, PROFIT,X;
PROJECT/A1..A10/:INCOME,RISK;
WHAREHOUSE/1..8/:CAPACITY
数据段中定义集合元素
举例1:
!Name: 背包问题模型
!Date: 2022-03-16
!Desc: 10件货物的背包问题
;
MODEL:
SETS:
ITEM/1 2 3 4 5 6 7 8 9 10/:WEIGHT, PROFIT,X;
ENDSETS
DATA:
WEIGHT = 6 3 4 5 1 2 3 5 4 2
PROFIT = 540 200 180 350 60 150 280 450 320 120;
ENDDATA
MAX = @SUM(ITEM(I):PROFIT(I)*x(I));
@SUM(ITEM(I)): WEIGHT(I)*X(I))<=30;
@FOR(ITEM(I):@BIN(X(I)));
END
举例2:
MODEL:
SETS:
ITEM:WEIGHT, PROFIT,X;
ENDSETS
DATA:
ITEM = 1 2 3 4 5 6 7 8 9 10;
WEIGHT = 6 3 4 5 1 2 3 5 4 2;
PROFIT = 540 200 180 350 60 150 280 450 320 120;
ENDDATA
MAX = @SUM(ITEM(I):PROFIT(I)*x(I));
@SUM(ITEM(I)): WEIGHT(I)*X(I))<=30;
@FOR(ITEM(I):@BIN(X(I)));
END
给常量赋值的三种形式
在数据段中给常量赋值,赋值的形式只有三种:
- 每个向量单独赋予初值
- 相同的集合的属性(相同结构的向量)共同赋予初值
- 集合与集合的属性共同赋予初值
相同结合属性共同赋值
SETS:
ITEM:WEIGHT,PROFIT,X;
ENDSETS
DATA:
ITEM = 1 2 3 4 5 6 7 8 9 10;
WEIGHT PROFIT =
6 540
3 200
4 180
5 350
1 60
2 150
3 280
5 450
4 320
2 120
;
ENDDATA
集合与集合共同属性共同赋予初值
SETS:
ITEM:WEIGHT,PROFIT,X;
ENDSETS
DATA:
ITEM WEIGHT PROFIT =
1 6 540
2 3 200
3 4 180
4 5 350
5 1 60
6 2 150
7 3 280
8 5 450
9 4 320
10 2 120
;
ENDDATA
集合遍历函数
函数名 | 返回值 |
---|---|
@FOR(s:e) | 对集合s中的每一个元素都生成一个约束条件表达式,具体约束由e描述 |
@SUM(s:e) | 对集合s中的每一个元素,计算表达式e的值,然后返回这些值的和 |
@MAX(s:e) | 对集合s中的每一个元素,计算表达式e的值,然后返回这些值的最大值 |
@MIN(s:e) | 对集合s中的每一个元素,计算表达式e的值,然后返回这些值的最小值 |
@PROD(s:e) | 对集合s中的每一个元素,计算表达式e的值,然后返回这些值的乘积 |
举例:
@FOR(ITEM(I):@BIN(X(I)));
@SUN(ITEM(I): X(I));
集合遍历函数的简化
如果在集合遍历函数中只有一个集合,而且上对该集合的所有元素进行相同的操作,可以省略其中的集合元素变量(或下标变量)。
@FOR(ITEM(I):@BIN(X(I)));
@FOR(ITEM: @BIN(X));
@SUM(ITEM(I):WEIGHT(I)*X(I))<=30;
@SUM(ITEM: WEIGHT*X)<=30;
NUM=@SUM(ITEM(I):X(I));
NUM=@SUM(ITEM: X);
总结
本小节主要讲了lingo定义原始集合及其属性的语法规则,还有在数据段给常量赋值的多种形式、还有集合遍历函数及其简化形式、纯粹的语法问题,虽然简单但仍需要认真掌握。