R语言TSP包计算旅行商问题路径长度结果异常求助
问题原因与解决方案
核心问题在于你误用了ETSP()函数:它的作用是处理欧几里得空间中的坐标点,而非预先计算好的距离矩阵。你传入的3×3矩阵被ETSP()当成了3个三维坐标点(每行对应一个点的x/y/z坐标),随后TSP包基于这些坐标重新计算了欧几里得距离,而非使用你提供的距离数据,这才导致最终路径长度和手动计算结果不符。
具体验证
比如,ETSP()会把你的数据解析为三个点:
- 点1:
(0, 28635.76, 16496.41) - 点2:
(28635.76, 0, 22032.14) - 点3:
(16496.41, 22032.14, 0)
它会计算这些点之间的欧几里得距离(比如点1到点2的距离是sqrt((0-28635.76)^2 + (28635.76-0)^2 + (16496.41-22032.14)^2)),这个数值远大于你原始的28635.76,最终总路径长度自然会变成98559.14。
正确的代码实现
要使用你预先计算的距离矩阵,应该用TSP()函数来创建TSP对象,而非ETSP():
library(data.table) library(TSP) # 你的距离矩阵 datalist <- data.table(V1=c(0, 28635.76, 16496.41), V2=c(28635.76, 0, 22032.14), V3 = c(16496.41, 22032.14, 0)) # 转换为矩阵格式(TSP()要求输入为矩阵) dist_matrix <- as.matrix(datalist) # 使用TSP()创建对象,而非ETSP() tspObj <- TSP(dist_matrix) tour <- solve_TSP(tspObj, start = 1, method = "two_opt") # 输出路径长度,会和你手动计算的67164.31一致 tour_length(tour)
补充说明
TSP()函数专门用于处理自定义距离矩阵的场景,要求矩阵是对称的、对角线元素为0(你的数据完全符合这个要求),而ETSP()则是为欧几里得空间的坐标点设计的,会自动推导距离。
内容的提问来源于stack exchange,提问作者Adamek
相关产品推荐
相关产品推荐

