在CPLEX中构造混凝土配送问题人工节点子集遇阻求助
混凝土配送模型CPLEX实现:人工节点子集构造问题
我正在研究混凝土配送问题的模型构建,并在CPLEX中实现该模型,但在集合的子集构造环节遇到问题,需要构造图中所有人工节点的子集,以下是我的实现代码(已将变量和注释翻译为中文):
int st=...; {int} 起始位置集合 = asSet(1..st); int ft=...; {int} 结束位置集合 = asSet(1..ft); int m2=1; // 2类客户数量 int m4=1; // 4类客户数量 {int} 非单源未定义客户_类型2 = asSet(1..m2); {int} 非单源已定义客户_类型4 = asSet(m2..m4+m2); // 实际客户节点集合 {int} 客户集合 = 非单源未定义客户_类型2 union 非单源已定义客户_类型4 ; float 客户截止时间[客户集合]= ...; // 截止时间 float 客户需求量[客户集合]= ...; int 客户时间间隔[客户集合] = ...; float 默认装载量 = ...; float 单次运输装载量 = ... ; int 是否已定义[客户集合] = ...; int 人工客户节点总数 = 0; int 最大配送次数[x in 客户集合]; execute { for( var l in 客户集合){ if (是否已定义[l] == 1) 最大配送次数[l] = Opl.ftoi(Opl.ceil(默认装载量/客户需求量[l])); else 最大配送次数[l] = Opl.ftoi(Opl.ceil(客户需求量[l]/单次运输装载量)); // 计算人工客户节点总数 人工客户节点总数 = 人工客户节点总数 + 最大配送次数[l]; } } int 实际客户数 = card(客户集合); // 实际客户节点数量 {int} 客户人工节点集合[i in 客户集合] = asSet(1..最大配送次数[i]); // 构造人工客户节点 tuple 人工节点 {int 原节点编号 ; int 人工节点序号;} // 人工客户节点集合 {人工节点} 人工客户节点全集 = {<i,j> | i in 客户集合, j in 客户人工节点集合[i]}; int d = ...; {int} 仓库集合 = asSet(m4+m2..d+m4+m2); {int} 仓库人工节点集合 = asSet(1..人工客户节点总数); // 构造人工仓库节点 {人工节点} 人工仓库节点全集 = {<i,j> | i in 仓库集合, j in 仓库人工节点集合}; int 车辆数 = ...; // 车辆数量 {int} 车辆集合 = asSet(1..车辆数); // 车辆集合 // 构造人工起始位置节点 {人工节点} 人工起始位置集合 = {<i,j> | i in 车辆集合, j in 客户集合: j==1}; // 构造人工结束位置节点 {人工节点} 人工结束位置集合 = {<i,j> | i in 车辆集合, j in 客户集合: j==1}; {人工节点} 所有人工节点集合 = 人工起始位置集合 union 人工结束位置集合 union 人工仓库节点全集 union 人工客户节点全集;
代码中存在的关键问题修正说明
execute块中原代码未指定是否已定义的索引,修正为是否已定义[l] == 1,否则无法正确判断单个客户的定义状态- 原代码中
SetofArtCustomerNodes的索引范围是连续整数,但实际客户编号不一定连续,已修正为直接用客户集合的元素作为索引,确保每个客户对应正确的人工节点数量 人工客户节点全集的生成逻辑中原语法错误,修正为j in 客户人工节点集合[i],正确关联每个客户的人工节点序号
内容的提问来源于stack exchange,提问作者Melika.Ph
相关产品推荐
相关产品推荐

