如何在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
相关产品推荐
相关产品推荐

