R 中的循环,用于 TSP 的 VNS

Loop in R, VNS for TSP

提问人:Han 提问时间:5/14/2023 最后编辑:Brian Tompsett - 汤莱恩Han 更新时间:5/15/2023 访问量:20

问:

我正在 R 中为 TSP(旅行推销员问题)执行 VNS 算法,但是我在选择多个邻居时遇到了麻烦。当我求解城市和一个邻居的第一个组合时,我不知道我应该写什么来使循环重新开始,选择多个邻居。有什么想法吗?

x<-c(1:7) #cambiar x por la solución, x es el vector de sitios a los que ir 
list<-list(ciudades) #cambiar x por la solución
max.inter=15
k<-400
interacciones<-0

#CREAMOS LAS POSIBILIDADES DE VECINOS K=1
for(i in 1:(length(ciudades)-1))  {list[[i+1]]<-append(ciudades[-c(i,i+1)],ciudades[c(i+1,i)],i-1)}#Cambiar x por la solución
comb<-t(as.data.frame(list))
rownames(comb)<-c(paste("combinación",1:length(ciudades)))
comb

#CALCULAMOS EL COSTE DE CADA UNA DE LAS POSIBILIDADES
coste<-c()
solu<-c()
for (i in 1:nrow(comb)){
  solu<-c()
  for (n in 1:nrow(comb)-1){
    solu<-append(solu,matriz[comb[i,n],comb[i,n+1]]) #Cambiar matriz por viaje
    #if (n==nrow(comb)-1){ solu<-append(solu,matriz[comb[i,n+1],comb[i,1]])}#Cambiar matriz por viaje
    if (n==nrow(comb)-1){ solu<-sum(solu)}
  }
  coste[i]<-solu  }
coste
repeat{
#Seleccionamos el mínimo de los costes y #lo ponemos como nueva solución
mejorsol<-coste[1]
if(mejorsol>coste[which.min(coste)] ){
  #coste<-coste[-1]
  mejorsol<-coste[which.min(coste)] 
  x<-comb[which.min(coste),]
  comb<-comb[which.min(coste),]
  
  #CREAMOS LAS POSIBILIDADES DE VECINOS K=1
  for(i in 1:(length(ciudades)-1))  {list[[i+1]]<-append(ciudades[-c(i,i+1)],ciudades[c(i+1,i)],i-1)}#Cambiar x por la solución
  comb<-t(as.data.frame(list))
  rownames(comb)<-c(paste("combinación",1:length(ciudades)))
  comb
  
  #CALCULAMOS EL COSTE DE CADA UNA DE LAS POSIBILIDADES
  coste<-c()
  solu<-c()
  for (i in 1:nrow(comb)){
    solu<-c()
    for (n in 1:nrow(comb)-1){
      solu<-append(solu,matriz[comb[i,n],comb[i,n+1]]) #Cambiar matriz por viaje
      #if (n==nrow(comb)-1){ solu<-append(solu,matriz[comb[i,n+1],comb[i,1]])}#Cambiar matriz por viaje
      if (n==nrow(comb)-1){ solu<-sum(solu)}
    }
    coste[i]<-solu  }
  coste

  }else{#Cambiar x por la solución
    comb<-comb[-which(coste==min(coste)),]
    #CREAMOS LAS POSIBILIDADES DE VECINOS K=2
    
    for (h in 1:k){
      
      list<-list()
      filas<-nrow(comb)*nrow(comb)
      for (h in 1:nrow(comb)){
        for (i in 1:(ncol(comb)-1)){
          list[[(nrow(comb)*h+i)-nrow(comb)]]<-append(comb[h,-c(k-1,k)],comb[h,c(k,k-1)],k-2)}}
      list<-list[!sapply(list,is.null)]
      comb<-t(as.data.frame(list))
      rownames(comb)<-c(paste("combinación",1:nrow(comb)))
      comb
      coste<-c()
      solu<-c()
      for (i in 1:nrow(comb)){
        solu<-c()
        for (n in 1:ncol(comb)-1){
          solu<-append(solu,matriz[comb[i,n],comb[i,n+1]]) #Cambiar matriz por viaje
          #if (n==ncol(comb)-1){ solu<-append(solu,matriz[comb[i,n+1],comb[i,1]])}#Cambiar matriz por viaje
          if (n==ncol(comb)-1){ solu<-sum(solu)}
        }
        coste[i]<-solu  }
      coste
      if(mejorsol<min(coste)) {next}
      
    }}#cierre del else 
interacciones<-interacciones+1
if(interacciones==max.inter){break}

}


coste
which.min(coste)
comb[which.min(coste),]
min(coste)

从一开始,我不知道如何做到这一点,如果 k=1 的解决方案没有改善我当前的解决方案,循环就会尝试使用 k>1。我知道当我从每个城市组合中更改城市时,我不会选择超过 2 个城市,但是我也不知道如何更改超过 2 个城市。else{}

R while-循环 旅行推销员

评论


答: 暂无答案