我的第一个LINGO程序

背景:班主任下周要开一个一对一见面会,要根据同学们的时间安排先后顺序.

收集数据

  • 首先建一个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\mathbf{C}=(c\_{ij})\_{38\times93} 表示收集到的数据,其中c_ij{0,1}c\_{ij}\in \{0,1\}
  • X=(x_ij)_38×93\mathbf{X}=(x\_{ij})\_{38\times93} 表示最终的安排,其中x_ij{0,1}x\_{ij}\in \{0,1\}

约束条件

  • 每个人只去一次,也必须去一次:

    _j=193x_ij=1\sum\_{j=1}^{93}x\_{ij}=1

  • 每个时间最多只有一个同学去:

_i=138x_ij1\sum\_{i=1}^{38}x\_{ij}\leqslant 1

  • 每个同学只在自己有空的时间去:

    x_ijc_ijx\_{ij}\leqslant c\_{ij}

  • 目标函数,尽量早去

    min_i,jx_ijj\min \sum\_{i,j}x\_{ij}*j

一些说明

  • LINGO不区分大小写
  • LINGO 不区分<和<=,不区分>和>=,都视为包含等号.
  • 我事前把矩阵C\mathbf{C}对应的区域在EXCEL中取名为data
  • 同时将另一个空白的38行,93列的区域命名为data2 ,用于导出结果X\mathbf{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)));

我的第一个LINGO程序
https://blog.askk.cc/2018/04/19/my-first-LINGO-program/
作者
sukanka
发布于
2018年4月19日
许可协议