背景:班主任下周要开一个一对一见面会,要根据同学们的时间安排先后顺序.
收集数据
- 首先建一个excel表格,将93个候选时间排成一行,38个同学按学号排成一列,得到一个38$\times$93的矩阵.
- 将表格共享,每个同学在自己有空的时间填1,无空的时间填0.
- 回收表格.将得到的38$\times$93矩阵在Excel中命名为data
建立模型
本模型只有约束条件,无目标函数.最终的安排也为一个38$\times$93矩阵
- 每个同学只去一次,也必须去一次.
- 每个时间最多只有一个同学去.
- 每个同学只在自己有空的时间去.
- 去或不去是0,1变量,1表示去,0表示不去.
- (目标函数)期望同学们尽早去见面会.
数学化表达
符号约定
- C=(c_ij)_38×93 表示收集到的数据,其中c_ij∈{0,1}
- X=(x_ij)_38×93 表示最终的安排,其中x_ij∈{0,1}
约束条件
∑_i=138x_ij⩽1
- 
每个同学只在自己有空的时间去: x_ij⩽c_ij 
- 
目标函数,尽量早去 min∑_i,jx_ij∗j 
一些说明
- LINGO不区分大小写
- LINGO 不区分<和<=,不区分>和>=,都视为包含等号.
- 我事前把矩阵C对应的区域在EXCEL中取名为data
- 同时将另一个空白的38行,93列的区域命名为data2,用于导出结果X
LINGO 代码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | !模型:见面会安排;sets:
 time/1..93/;
 student/1..38/;
 !Student 为行,time为列;
 timetable(student,time):c,x;
 endsets
 data:
 !导入数据将data的数据传输给C;
 c=@ole('D:\Users\ASUS\Desktop\data.xlsx','data');
 !输出结果输出X到data2;
 @ole('D:\Users\ASUS\Desktop\data.xlsx','data2')=x;
 enddata
 !期望尽早安排完;
 min= @sum(timetable(i,j):j*x(i,j));
 !只在有空的时间去;
 @for(timetable(i,j):x(i,j)<= c(i,j));
 !每个人只去一次;
 @for(student(i):@sum(time(j):x(i,j))=1);
 !每个时间最多有一个人;
 @for(time(j):@sum(student(i):x(i,j))<=1);
 !去或不去为0,1变量;
 @for(timetable(i,j):@bin(x(i,j)));
 
 |