Мне не удалось найти полную реализацию алгоритма 2-opt в Python, поэтому я пытаюсь добавить недостающие части в код, найденный здесь , который я представляю ниже.
def two_opt(route):
best = route
improved = True
while improved:
improved = False
for i in range(1, len(route)-2):
for j in range(i+1, len(route)):
if j-i == 1: continue # changes nothing, skip then
new_route = route[:]
new_route[i:j] = route[j-1:i-1:-1] # this is the 2woptSwap
if cost(new_route) < cost(best): # what should cost be?
best = new_route
improved = True
route = best
return best
Чтобы завершить этот код, я создал небольшую программу для извлечения длинных / латовых координат из текстового файла и заполнения матрицы смежности стоимостью каждой точки. Полный код, включая образцы входных координат и матрицы смежности, можно найти в Проверка кода .
Поскольку я не знаю, что такое функция cost
из приведенного выше кода, моя идея заключалась в том, чтобы рассчитать все затраты от одной точки к другой и поместить в матрицу смежности: adj_matrix
. Это показывает, как далеко каждая точка от других.
Я попытался передать свою матрицу стоимости / смежности в функцию, чтобы использовать ее, однако я не могу рассчитать стоимость, учитывая мою матрицу смежности.
def main():
# code to read from file
# code to append co-ordinates to points and calculate the haversine distance between each point
route = random.sample(range(10), 10)
best = two_opt(route, adj_matrix) # passing my adjacency matrix
print(best)
ValueError: Значение истинности массива с более чем одним элементом является неоднозначным. Используйте a.any () или a.all ()
Еще один вопрос из двух вариантов Python: Генерация всех соседей для 2OPT в python
Любые предложения о том, как я могу найти правильную стоимость из матрицы смежности , будут оценены.