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

如何在OPL CPLEX中使用Tuple数据编写含车辆行驶时间的约束?

在OPL CPLEX中用Tuple行驶时间数据替换矩阵实现约束

你已经通过Tuple结构定义了道路的行驶时间数据,现在需要将约束中的Tm_ij[n][i][j]矩阵参数替换为Tuple里的travel_time字段,完成约束逻辑的编写。

1. 预定义节点间行驶时间映射(高效查询)

为了更便捷地获取任意节点间的行驶时间,建议先基于Tuple数据构建一个二维矩阵:

// 定义节点范围(根据你的数据,节点包含15、21、30,这里设置最大节点值)
int max_node = 30;
range Nodes = 1..max_node;

// 初始化二维矩阵,存储节点间行驶时间,默认值可根据业务逻辑调整
int travel_time_matrix[Nodes][Nodes] = 0;

// 遍历Tuple数据,填充矩阵
forall(r in Roadno) {
    travel_time_matrix[Roaddata[r].from_node][Roaddata[r].to_node] = Roaddata[r].travel_time;
}

2. 修改约束代码

根据你的约束逻辑,将Tm_ij[n][i][j]替换为Tuple对应的行驶时间,这里分两种实现方式:

方式一:使用预定义矩阵(推荐)

如果原约束中tau的范围是1到m到n的行驶时间,修改后的约束如下:

int NT = 24;

forall (s in M, m in B, n in B: m != n, tau in 1..travel_time_matrix[m][n], t in 1..NT - tau) {
    pos[s][m][t+tau] + pos[s][n][t] <= 1;
}

如果你的逻辑中tau就是固定的行驶时间(无需遍历1到该值),可以简化为:

int NT = 24;

forall (s in M, m in B, n in B: m != n, t in 1..NT - travel_time_matrix[m][n]) {
    pos[s][m][t + travel_time_matrix[m][n]] + pos[s][n][t] <= 1;
}

方式二:直接遍历Tuple匹配(无需预定义矩阵)

如果不想构建矩阵,可直接在约束中通过Tuple匹配节点对的行驶时间:

int NT = 24;

forall (s in M, m in B, n in B: m != n, r in Roadno: Roaddata[r].from_node == n && Roaddata[r].to_node == m, tau in 1..Roaddata[r].travel_time, t in 1..NT - tau) {
    pos[s][m][t+tau] + pos[s][n][t] <= 1;
}

注意这里要匹配Tuple中from_node为n、to_node为m的记录,对应约束中从n到m的行驶时间逻辑。

内容的提问来源于stack exchange,提问作者VANDANA KUMARI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:23:18