! 定义变量
Sets
Courses /1..9/ '课程编号'
CourseTypes /1..3/ '课程类别'
Prerequisites /3, 4, 5, 6, 8, 9/ '有先决条件的课程'
Parameters
Credit /1:5, 2:4, 3:4, 4:3, 5:4, 6:3, 7:2, 8:2, 9:3/ '课程学分'
Difficulty /1..9/ '课程难度,值介于0和1之间' '例如:[ 0.2, 0.3, 0.5, 0.4, 0.6, 0.3, 0.1, 0.2, 0.4 ]'
InterestMatrix /1..9, 1..3/ :=
[ 1, 2, 3 ],
[ 2, 3, 1 ],
[ 3, 1, 2 ]; '兴趣权重矩阵,你可以根据实际数据进行替换'
Min_Interest := 1; '你可以根据实际情况调整这个阈值'
DifficultyWeight := 0.5; '调整难度对总学分的影响程度,值介于0和1之间'
Var
Select(Courses) '是否选修课程,1表示选修,0表示不选修'
CourseOrder(Courses) '课程完成顺序'
Maximize
TotalCredit: Sum(Courses, (Credit[Course] - Difficulty[Course] * DifficultyWeight) * Select[Course]); '总学分,考虑课程难度'
Subject To
// 先决条件约束
Constraint_Pre(Course)$(Course in Prerequisites) :
Sum(Courses, Select[PreCourse] * (CourseOrder[PreCourse] < CourseOrder[Course])) >= 1;
// 类别约束
Constraint_Category1: Sum(Courses, Select[Course] * (CourseTypes[Course] = 1)) = 3;
Constraint_Category2: Sum(Courses, Select[Course] = 2 * (CourseTypes[Course] = 2)) = 2;
Constraint_Category3: Sum(Courses, Select[Course] = 2 * (CourseTypes[Course] = 3)) = 2;
// 学习顺序
Constraint_Order(Course)$(Course in {1, 2, 7, 3, 5, 6, 8, 9}) :
CourseOrder[Course] <= CourseOrder[1];
// 变量取值范围
0 <= Select(Courses) <= 1;
CourseOrder(Courses) >= 1;
// 初始条件
Select[1] = 1;
Select[2] = 1;
CourseOrder[1] = 1;
CourseOrder[2] = 2;
CourseOrder[7] = 3;
// 利用兴趣权重
Constraint_Interest(Course)$(Course in Courses) :
Sum(Students, InterestMatrix[Course, Students] * Select[Course]) >= Min_Interest;
Display
TotalCredit, Select;
End