我一直致力于解决旅行商问题。我试图实施的解决方案是尽可能接近最大值加载我的车辆,因为回程非常昂贵。
我有一个大型数据集,格式如下:
pkgid Latitude Longitude Weight
42127 8.205561907 34.54574863 37.0660242
42069 7.640153828 34.03634169 31.91148072
96632 7.700233671 33.85385033 24.27309403
93160 7.756960678 35.36007723 22.3526782
39075 6.881522479 34.19903152 19.56993506
62579 7.622385316 33.78590124 16.7793145
93784 7.523606197 35.32735063 16.18484202
81204 7.597161645 33.81316073 11.54433538
我的解决方案是将最远的点向南,并抓住附近的邻居,直到我的车辆满了。我有一个有效的代码片段,但速度很慢(每个循环秒数)。我可以使用kmeans或类似的方法,但没有好的方法来保证满载或切断聚类与度量(我知道)。所以我自己写了。
##NN Algorithm
pkg <- data.frame(fread("muh_data"))
pkg$TripId=0
NN<-data.frame(setorder(pkg,Latitude))
loc<-1
weight<-0
current_point<-c(NN[1,3],NN[1,2])
TripID=1
while (dim(NN)[1]>0)
{
while ((weight<1000)&(dim(NN)[1]>0)){
NN<-NN[-c(loc),]
if(dim(NN)[1]==0)
{break}
NN$NN<-distHaversine(current_point,cbind(NN$Longitude,NN$Latitude))
loc<-which.min(NN$NN)
current_point=c(NN[loc,3],NN[loc,2])
whichpkg<-NN[loc,1]
if ((weight+pkg[loc,4]>1000)|(dim(NN)[1])==0){
break}
weight=weight+pkg[loc,4]
pkg[pkg$pkgid==whichpkg,5]<-TripID
}
print(TripID) ##just a visual check where I am at--should end at ~3500
TripID=TripID+1
weight=0
loc<-1
}
有关加快速度的任何提示吗?
答案 0 :(得分:1)
首先使用分析器(Rprof)查找花费的时间。接下来尝试用矩阵替换数据帧 - 访问时数据帧非常慢。然后你可能知道在哪里集中注意力。