将GMPL转换为OPL的提示

时间:2018-08-25 19:33:55

标签: cplex glpk timetable

我已经花了一些时间使用GMPL语言将大型时间制表问题编码为一个项目,生成.lp文件并使用CBC解决它们。

然后,我开始使用CPLEX Interactive求解器在求解.lp文件时获得更快的结果。但是,然后,寻找一种更具动态性的语言和一个IDE,可以轻松地使我的模型与外部文件链接,并让我自定义输出文件,因此我决定使用OPL将整个代码移至ILOG CPLEX优化套件。

一旦我决定这样做,就会出现一些问题。

我采取的第一步是尝试将模型的一个小实例移至OPL。该实例基于集合和子集。例如,我需要声明一组“原始”集,以后将要混合到子集中。因此,假设我要输入所有的老师,科目和课程集,那么,它看起来像这样:

set TEACHER : = x,y,z;
set SUBJECTS : = a,b,c;
set COURSES : = i,j,k;

然后,我可以创建一个子集,该子集将教师与该教师在本学期将要开设的每门科目和课程联系起来:

set TEACHER_SUBJECTS_COURSES within {TEACHER, SUBJECTS, COURSES};
set TEACHER_SUBJECTS_COURSES := (x,a,i) (y,b,c,) (z,c,k);

一旦我声明了我需要的一切,我就可以声明一个变量,如果为解决方案选择了索引的某个实例,则该变量将为1,否则为0:

var x{t in TEACHER, d in DAY, (l,s) in LECTURE_SHIFT, (t,s,c)in TEACHER_SUBJECTS_CLASS}, binary;

然后,可以按照相同的思想对每个必需的约束进行编码。 这种构建模型的方式很有用,因为它没有考虑索引的所有可能组合,仅适用于机构中实际发生的所有可能实例。想法是,每个包含“ x”教师的变量都只会考虑与“ x”教师相关的学科和课程。

我的问题是,如何在两个集合之间创建这种“链接”,或者如何在CPLEX OPL中创建具有两个原始集合作为源的子集(或子子集)?

1 个答案:

答案 0 :(得分:0)

创建一个元组,以表示教师,学科和课程的组合。然后为有效组合构建这些元组的集合。