First draft of exhaustive search.
This commit is contained in:
parent
8cd1623a76
commit
cdf19027c3
79
exhaustive_search.py
Normal file
79
exhaustive_search.py
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
import time
|
||||||
|
from itertools import permutations
|
||||||
|
from typing import Callable, Tuple
|
||||||
|
|
||||||
|
import numpy.typing as npt
|
||||||
|
|
||||||
|
from common import plot_plan, read_data
|
||||||
|
|
||||||
|
|
||||||
|
def exhaustive_search(distances: npt.NDArray) -> Tuple[float, Tuple]:
|
||||||
|
"""An implementation of exhaustive search.
|
||||||
|
|
||||||
|
This implementation takes a permutation iterator, then maps each
|
||||||
|
element to a tuple containing the travel distance of that permutation
|
||||||
|
and the permutation tuple itself. Finally the function returns the
|
||||||
|
tuple that contains the smallest travel distance.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
distances (npt.NDArray): An array containing distances to travel.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A tuple containing the shortest travel distance and its corresponding
|
||||||
|
permutation.
|
||||||
|
"""
|
||||||
|
|
||||||
|
size = len(distances)
|
||||||
|
|
||||||
|
return min( # Find the smallest travel distance from the array
|
||||||
|
map( # Map the permutation array to contain tuples (distance, permutation)
|
||||||
|
lambda perm: (
|
||||||
|
sum([distances[perm[i - 1], perm[i]] for i in range(size)]),
|
||||||
|
perm,
|
||||||
|
),
|
||||||
|
permutations(range(size)),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
cities, data = read_data("./european_cities.csv")
|
||||||
|
|
||||||
|
# A loop timing finding the optimal solution for different n
|
||||||
|
for n in range(6, 11):
|
||||||
|
# Time exhaustive search
|
||||||
|
t0 = time.time_ns()
|
||||||
|
distance, perm = exhaustive_search(data[:n, :n])
|
||||||
|
t1 = time.time_ns()
|
||||||
|
|
||||||
|
time_elapsed_ms = (t1 - t0) / 1_000_000.0
|
||||||
|
|
||||||
|
print(f"Exhaustive search for the {n} first cities:")
|
||||||
|
print(f"distance : {distance:>12.6f}km")
|
||||||
|
print(f"time to find solution: {time_elapsed_ms:>12.6f}ms\n")
|
||||||
|
|
||||||
|
|
||||||
|
""" Running example
|
||||||
|
|
||||||
|
oblig1 on main [?] via 🐍 v3.12.6 took 7s
|
||||||
|
❯ python exhaustive_search.py
|
||||||
|
Exhaustive search for the 6 first cities:
|
||||||
|
distance : 5018.810000km
|
||||||
|
time to find solution: 1.105330ms
|
||||||
|
|
||||||
|
Exhaustive search for the 7 first cities:
|
||||||
|
distance : 5487.890000km
|
||||||
|
time to find solution: 10.089604ms
|
||||||
|
|
||||||
|
Exhaustive search for the 8 first cities:
|
||||||
|
distance : 6667.490000km
|
||||||
|
time to find solution: 78.810508ms
|
||||||
|
|
||||||
|
Exhaustive search for the 9 first cities:
|
||||||
|
distance : 6678.550000km
|
||||||
|
time to find solution: 765.676230ms
|
||||||
|
|
||||||
|
Exhaustive search for the 10 first cities:
|
||||||
|
distance : 7486.310000km
|
||||||
|
time to find solution: 8281.795515ms
|
||||||
|
"""
|
||||||
Loading…
Reference in New Issue
Block a user