First draft of exhaustive search.
This commit is contained in:
parent
cdf19027c3
commit
117446ffb0
53
hill_climbing.py
Normal file
53
hill_climbing.py
Normal file
@ -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))))
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user