Ruby Имитация проблемы отжига

Я пытаюсь реализовать имитацию отжига на ruby ​​на основе TSP, в котором я пытался решить (я преобразовал этот код из Java). Однако оказывается, что отжиг ухудшает мои результаты! (PlayerPath дает мне путь, по которому я буду выполнять имитацию отжига - я получил путь, выполнив жадный алгоритм 1). Может ли кто-нибудь помочь мне проверить код и посмотреть, не ошибаюсь ли я, или просто симуляция отжига не всегда делает вещи лучше?

#BEGIN ANNEALING
    for i in 1..k
        temp = 10000000
        cooling = 0.003


    if (playerPath[i].length > 2) # if path is larger than 2

      bestPath = playerPath[i]
        while temp > 1
          newSolution = playerPath[i];

          firstPosition = rand(newSolution.length)
          secondPosition = rand(newSolution.length)
      if(firstPosition == 0 || firstPosition == newSolution.length-1)
        next
      end
      if(secondPosition == 0 || secondPosition == newSolution.length-1 )
        next
      end

      # swap cities
      tempStore = newSolution[firstPosition]
      newSolution[firstPosition] = newSolution[secondPosition]
      newSolution[secondPosition] = tempStore

      # Tabulation
      currentEnergy = calculate_distance(playerPath[i])
      neighbourEnergy = calculate_distance(newSolution)

      if(acceptanceProbability(currentEnergy,neighbourEnergy,temp) > rand)
          playerPath[i] = newSolution
          end

      if(calculate_distance(playerPath[i])< calculate_distance(bestPath))
        bestPath = playerPath[i];
      end

      temp *= (1-cooling);


        end

    end

  end


  #END ANNEALING

  #acceptanceProbability
def acceptanceProbability(energy, newEnergy,temperature) 
        # If the new solution is better, accept it
        if (newEnergy < energy)
            return 1.0
        end

        # If the new solution is worse, calculate an acceptance probability
        return Math.exp((energy - newEnergy) / temperature)

end

0 ответов

Другие вопросы по тегам