Шаг 120.
Задачи ComputerScience на Python.
Другие задачи. Задача коммивояжера. Наивный подход. Поиск методом грубой силы

    На этом шаге мы рассмотрим реализацию такого поиска.

    Теперь мы можем сгенерировать все перестановки для списка городов, но это не совсем то же самое, что путь для задачи коммивояжера. Напомню, что в задаче о коммивояжере продавец должен в конце вернуться в тот город, с которого начал. Мы можем легко добавить первый город в перестановке в ее конец, используя генератор списков.

tsp_paths: List[Tuple[str, ...]] = [c + (c[0],) for c in city_permutations]

    Теперь мы готовы проверить все сгенерированные пути. Поиск методом грубой силы просматривает каждый путь в списке и, используя расстояние между двумя городами в таблице поиска (vt_distances), вычисляет суммарное расстояние для каждого пути. Функция выводит кратчайший путь и суммарное расстояние для него.

if __name__ == "__main__":
    best_path: Tuple[str, ...]
    min_distance: int = 99999999999 # произвольное большое число
    for path in tsp_paths:
        distance: int = 0
        last: str = path[0]
        for next in path[1:]:
            distance += vt_distances[last][next]
            last = next
        if distance < min_distance:
            min_distance = distance
            best_path = path
    print(f"Самый короткий путь между {best_path} составляет {min_distance} миль.")
Архив с файлом можно взять здесь.

    Наконец, мы можем перебрать методом грубой силы все города Вермонта и найти кратчайший путь через заданные пять городов. Результат работы программы должен выглядеть примерно так, а лучший путь показан на рисунке 1.

Самый короткий путь между 
('Ратленд', 'Берлингтон', 'Уайт-Ривер', 'Браттлборо', 'Беннингтон', 'Ратленд') 
составляет 318 миль.


Рис.1. Кратчайший путь для коммивояжера, позволяющий посетить все пять городов в штате Вермонт

    На следующем шаге мы рассмотрим переход на следующий уровень.




Предыдущий шаг Содержание Следующий шаг