CPLEX三维参数建模求助:房间容量参数与时段索引映射问题
CPLEX建模:参数计算与时段映射问题解决
1. 计算参数c_im(房间容量/学生组人数)
c_im是由已知输入参数衍生的静态值,不需要使用execute块(execute主要用于求解后处理或动态逻辑),直接在模型初始化时定义即可:
// 定义c_im,计算房间i容量与学生组m人数的比值 float c[1..a][1..e] = [i][m] => capacity[i] / number[m];
如果需要整数结果(比如表示可容纳的学生组数量),可以用ceil()或floor()函数处理:
int c[1..a][1..e] = [i][m] => ceil(capacity[i] / number[m]);
2. 时段(j,k)与全局时段的映射及H参数调整
一周5天(b=5)、每天4个时段(c=4),总计20个全局时段,有两种处理方式:
方案一:直接用[j][k][l]索引(推荐)
将H参数的索引改为[天j][时段k][教师l],直接对应业务逻辑,无需额外映射:
// 教师l在第j天第k时段的状态(1=开心,2=一般,3=其他) int H[1..b][1..c][1..d] = ...;
方案二:保留全局timeperiod映射
如果一定要用timeperiod范围,定义映射函数将(j,k)转换为全局时段编号,修正之前的语法问题:
range timeperiod = 1..20; int H[timeperiod][1..d] = ...; // 教师l在全局时段的状态 // 映射函数:第j天第k时段对应全局时段编号 int getTimePeriod(int j, int k) = k + (j-1)*4;
使用时通过H[getTimePeriod(j,k)][l]调用即可。
3. 目标函数编写
结合上述参数,目标函数的正确写法如下:
对应方案一的目标函数
minimize sum(i in 1..a, j in 1..b, k in 1..c, l in 1..d, m in 1..e, n in 1..f) c[i][m] * H[j][k][l] * x[i][j][k][l][m][n];
对应方案二的目标函数
minimize sum(i in 1..a, j in 1..b, k in 1..c, l in 1..d, m in 1..e, n in 1..f) c[i][m] * H[getTimePeriod(j,k)][l] * x[i][j][k][l][m][n];
修改后的完整代码片段
//Parameter int a = ...; // 房间集合,索引i int b = 5; // 天数,索引j(固定为5) int c = 4; // 每天时段数,索引k(固定为4) int d = ...; // 教师集合,索引l int e = ...; // 学生组集合,索引m int f = ...; // 课程集合,索引n int capacity [1..a] = ...; // 房间容量 int number [1..e] = ...; // 学生组人数 // 计算c_im参数 float c[1..a][1..e] = [i][m] => capacity[i] / number[m]; // 定义H参数(方案一) int H[1..b][1..c][1..d] = ...; /* 方案二(可选) range timeperiod = 1..20; int H[timeperiod][1..d] = ...; int getTimePeriod(int j, int k) = k + (j-1)*4; */ dvar boolean x [1..a][1..b][1..c][1..d][1..e][1..f]; // 目标函数 minimize sum(i in 1..a, j in 1..b, k in 1..c, l in 1..d, m in 1..e, n in 1..f) c[i][m] * H[j][k][l] * x[i][j][k][l][m][n]; // 后续添加约束条件...
内容的提问来源于stack exchange,提问作者Yoom
相关产品推荐
相关产品推荐

