CPLEX Studio中TSP的dist数组是什么?如何为新成本矩阵填充?
CPLEX Studio中TSP的dist数组解析与填充方法
一、dist数组的定义与作用
在你提供的TSP模型里,dist是一个以有序城市对(edge)为索引的整数数组,核心作用是存储从城市i到城市j的旅行成本(比如距离、运输费用等)。它的索引集合Edges被定义为所有i≠j的有序城市对<i,j>,因此每个dist[<i,j>]都对应一条从i到j的单向边的成本。
二、用给定成本矩阵填充dist数组的方法
你提供的是5个城市的对称成本矩阵(矩阵中cost[i][j] = cost[j][i]),以下两种方式可以完成dist数组的填充:
方法1:在.dat数据文件中直接赋值
保持.mod文件原有结构,在对应的.dat文件中指定城市数量n,并逐个定义每个边的成本:
n = 5; dist = [ <1,2>:2, <1,3>:3, <1,4>:4, <1,5>:1, <2,1>:2, <2,3>:5, <2,4>:6, <2,5>:3, <3,1>:3, <3,2>:5, <3,4>:7, <3,5>:2, <4,1>:4, <4,2>:6, <4,3>:2, <4,5>:6, <5,1>:1, <5,2>:3, <5,3>:1, <5,4>:6 ];
方法2:在.mod模型文件中通过成本矩阵映射赋值
这种方式无需手动枚举所有边,直接通过给定的5x5成本矩阵映射生成dist数组,更简洁:
int n = 5; range Cities = 1..n; // 定义给定的5x5成本矩阵 int cost[Cities][Cities] = [ [99, 2, 3, 4, 1], [2, 99, 5, 6, 3], [3, 5, 99, 7, 2], [4, 6, 2, 99, 6], [1, 3, 1, 6, 99] ]; tuple edge { int i; int j; } setof(edge) Edges = {<i,j> | ordered i,j in Cities}; // 通过成本矩阵直接映射dist数组,自动匹配每个有序对的成本 int dist[Edges] = (i,j) => cost[i][j]; dvar boolean x[Edges];
注意事项
- 成本矩阵中的对角线值(99)对应城市到自身的成本,由于
Edges集合不包含<i,i>这种边,因此这些值不会被用到; - 若成本矩阵为非对称结构,只需确保每个有序对
<i,j>的成本和矩阵中的cost[i][j]对应即可。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

