我在进行混合线性优化问题的数学建模,利用的是CPLEX中的OPL语言编写,原数学问题很复杂,我将模型转换为编程语言后,CPLEX显示只有一处报错,但这个错误我不知道是什么原因,有没有人看一下。问题出现在工作限制那块代码。
/*********************************************
* OPL 22.1.1.0 Model
* Author: lz
* Creation Date: 2024年6月28日 at 下午5:29:21
*********************************************/
int nbMonths = 6;
range months = 1..nbMonths;
range tasks = 1..7;
range boatsTypes = 1..5; // 拖网船(1), 围网船(2), 笼捕船(3), 拖曳船(4), 加工船(5)
int boatCounts[boatsTypes] = [4, 2, 3, 1, 1]; // 各类船只数量
// 任务需求量(单位:百)
int demand[months][tasks] = [
[500, 1000, 300, 300, 800, 200, 100],
[600, 500, 200, 0, 400, 300, 150],
[300, 600, 0, 0, 500, 400, 100],
[200, 300, 400, 500, 200, 0, 100],
[0, 100, 500, 100, 1000, 300, 0],
[500, 500, 100, 300, 1100, 500, 60]
];
// 任务收益(单位:万元)
float revenue[tasks] = [100, 60, 80, 40, 110, 90, 30];
// 任务所需船只类型及时间(单位:小时)
float workHours[tasks][boatsTypes] = [
[0.5, 0.1, 0.2, 0.05, 0],
[0.7, 0.2, 0, 0.03, 0],
[0, 0, 0.8, 0, 0.01],
[0.3, 0, 0, 0.1, 0.05],
[0.2, 0.6, 0, 0, 0],
[0.5, 0, 0.6, 0.08, 0.05]
];
// 维护安排
tuple Maintenance {
int month;
int boatIndex;
int boatType;
}
{ Maintenance} Maintenances = {
{1, 1, 1}, {2, 1, 3}, {2, 2, 3}, {3, 1, 4},
{4, 1, 2}, {5, 2, 1}, {5, 3, 3}, {6, 1, 5}, {6, 2, 3}
};
// 决策变量
dvar boolean x[months][boatsTypes][tasks]; // 第i月第j艘k类船执行m任务
dvar float+ y[months][tasks]; // 第i月任务m的实际完成量(单位:百)
dvar float+ z[months][tasks]; // 第i月任务m的超额完成量(单位:百)
// 目标函数
maximize sum(i in months, m in tasks) (revenue[m] * y[i][m]) - 5 * z[i][m];
// 约束
subject to {
// 工作时间限制
forall(j in boatsTypes, i in months) {
sum(m in tasks) workHours[m][j] * x[i][j][m] <= (24 * 2 * 8) * (1 - exists( t in Maintenances : t.month == i && t.boatType == j));
}
// 任务需求与超额完成
forall(i in months, m in tasks) {
sum(j in boatsTypes) workHours[m][j] * x[i][j][m] == y[i][m] + z[i][m];
}
// 超额库存限制
forall(i in months, m in tasks) {
z[i][m] <= 100;
}
// 最终库存要求
forall(m in tasks) {
sum(i in 1..5) z[i][m] - sum(i in 2..6) z[i][m] == 50 - demand[6][m];
}
}
execute DISPLAY_RESULTS {
writeln("Optimal Plan Found!");
// 可以添加代码来显示或导出解的具体细节
}