diff --git a/hill_climbing.py b/hill_climbing.py new file mode 100644 index 0000000..7babb0d --- /dev/null +++ b/hill_climbing.py @@ -0,0 +1,53 @@ +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)))) +