【发布时间】:2016-03-19 08:28:32
【问题描述】:
我正在使用 R 中的 TSP 包处理旅行推销员问题,但试图达到预定的起点和终点。
该软件包显然允许设置旅程的起点,如下所述: How to specify a starting city using the TSP package in R
想知道是否有人知道设置终点的方法。我了解 TSP 本质上是开放式的,因此可能无法预先设置端点。在这种情况下,我愿意接受另一种会产生类似结果的最近邻方法(按多元相似性/距离设置起点和终点的排序序列)。
这是一个简单的例子:
dat <- data.frame(X=sample(0:100,n)/100,Y=sample(0:100,n)/100,Z=sample(0:100,n)/100)
dat$SUM <- rowSums(dat)
startPoint <- which.min(dat$SUM) # Lowest sum
endPoint <- which.max(dat$SUM) # Highest sum
tsp <- solve_TSP(TSP(ddat), method="nearest_insertion", start=startPoint)
tsp[1]==startPoint
> TRUE
tsp[n]==endPoint
> FALSE
不幸的是,“nearest_insertion”方法(以及任何其他非随机方法)总是返回相同的路径,因此端点永远不会改变。所以我可以放弃 start= 选项,改为随机起点方法,然后将其放在 while() 循环中,并希望它最终收敛于一个解决方案:
while(tsp[1]!=startPoint | tsp[n]!=endPoint){
tsp <- solve_TSP(TSP(dist(dat[c("X","Y","Z")])), method="two_opt")
}
tsp[n]==endPoint
> TRUE
即使对于大数据,这似乎也能持续且非常快速地工作,而且我还没有遇到过随机生成的数据集挂起循环。但是使用更优雅(更少蛮力)的方法会很好。有什么想法吗?
【问题讨论】:
标签: r nearest-neighbor traveling-salesman