背景:班主任下周要开一个一对一见面会,要根据同学们的时间安排先后顺序.
收集数据
- 首先建一个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 代码
1 2 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)));
|