in4050-oblig1/hill_climbing.py

54 lines
1.6 KiB
Python

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))))