from typing import Tuple import numpy as np import numpy.typing as npt import copy from common import plot_plan, read_data original_perm = None def hill_climbing(distances: npt.NDArray) -> Tuple[float, npt.NDArray]: size = len(distances) perm = np.arange(size) np.random.shuffle(perm) print(perm) global original_perm original_perm = copy.deepcopy(perm) current_route: float = np.sum([distances[perm[i - 1], perm[i]] for i in range(size)]) found_improvement = True while found_improvement: found_improvement = False tmp_improvement: float = current_route improvement_index: int = -1 for i in range(size): perm[i - 1], perm[i] = perm[i], perm[i - 1] tmp_route: float = np.sum([distances[perm[i - 1], perm[i]] for i in range(size)]) if tmp_route < tmp_improvement: tmp_improvement = tmp_route improvement_index = i found_improvement = True perm[i - 1], perm[i] = perm[i], perm[i - 1] if found_improvement: current_route = tmp_improvement perm[improvement_index - 1], perm[improvement_index] = ( perm[improvement_index], perm[improvement_index - 1], ) print(perm) return (current_route, perm) if __name__ == "__main__": cities, data = read_data("./european_cities.csv") distance, perm = hill_climbing(data[:10,:10]) plot_plan(list(map(lambda i: cities[i], list(perm)))) plot_plan(list(map(lambda i: cities[i], list(original_perm))))