You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:01:05