Rename algorithms in main module
This commit is contained in:
parent
c5bccf2f29
commit
74528b8c39
|
@ -1,10 +1,14 @@
|
||||||
from numpy.random import choice, seed
|
from numpy.random import choice, seed
|
||||||
|
|
||||||
|
|
||||||
def get_first_random_solution(m, data):
|
def get_first_random_solution(n, m):
|
||||||
seed(42)
|
seed(42)
|
||||||
random_indexes = choice(len(data.index), size=m, replace=False)
|
solution = zeros(shape=n, dtype=bool)
|
||||||
return data.loc[random_indexes]
|
random_indices = choice(n, size=m, replace=False)
|
||||||
|
put(solution, ind=random_indices, v=True)
|
||||||
|
return solution
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def element_in_dataframe(solution, element):
|
def element_in_dataframe(solution, element):
|
||||||
|
@ -42,8 +46,8 @@ def explore_neighbourhood(element, data, max_iterations=100000):
|
||||||
return neighbour
|
return neighbour
|
||||||
|
|
||||||
|
|
||||||
def local_search(m, data):
|
def genetic_algorithm(n, m, data):
|
||||||
first_solution = get_first_random_solution(m=m, data=data)
|
first_solution = get_first_random_solution(n=n, m=m)
|
||||||
best_solution = explore_neighbourhood(
|
best_solution = explore_neighbourhood(
|
||||||
element=first_solution, data=data, max_iterations=100
|
element=first_solution, data=data, max_iterations=100
|
||||||
)
|
)
|
||||||
|
|
18
src/main.py
18
src/main.py
|
@ -1,17 +1,17 @@
|
||||||
from preprocessing import parse_file
|
from preprocessing import parse_file
|
||||||
from greedy import greedy_algorithm
|
from genetic_algorithm import genetic_algorithm
|
||||||
from local_search import local_search
|
from memetic_algorithm import memetic_algorithm
|
||||||
from sys import argv
|
from sys import argv
|
||||||
from time import time
|
from time import time
|
||||||
|
|
||||||
|
|
||||||
def execute_algorithm(choice, n, m, data):
|
def execute_algorithm(choice, n, m, data):
|
||||||
if choice == "greedy":
|
if choice == "genetic":
|
||||||
return greedy_algorithm(n, m, data)
|
return genetic_algorithm(n, m, data)
|
||||||
elif choice == "local":
|
elif choice == "memetic":
|
||||||
return local_search(m, data)
|
return memetic_algorithm(m, data)
|
||||||
else:
|
else:
|
||||||
print("The valid algorithm choices are 'greedy' and 'local'")
|
print("The valid algorithm choices are 'genetic' and 'memetic'")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,8 +28,8 @@ def show_results(solutions, time_delta):
|
||||||
def usage(argv):
|
def usage(argv):
|
||||||
print(f"Usage: python {argv[0]} <file> <algorithm choice>")
|
print(f"Usage: python {argv[0]} <file> <algorithm choice>")
|
||||||
print("algorithm choices:")
|
print("algorithm choices:")
|
||||||
print("greedy: greedy algorithm")
|
print("genetic: genetic algorithm")
|
||||||
print("local: local search algorithm")
|
print("memetic: memetic algorithm")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
from numpy.random import choice, seed
|
||||||
|
|
||||||
|
|
||||||
|
def get_first_random_solution(m, data):
|
||||||
|
seed(42)
|
||||||
|
random_indexes = choice(len(data.index), size=m, replace=False)
|
||||||
|
return data.loc[random_indexes]
|
||||||
|
|
||||||
|
|
||||||
|
def element_in_dataframe(solution, element):
|
||||||
|
duplicates = solution.query(
|
||||||
|
f"(source == {element.source} and destination == {element.destination}) or (source == {element.destination} and destination == {element.source})"
|
||||||
|
)
|
||||||
|
return not duplicates.empty
|
||||||
|
|
||||||
|
|
||||||
|
def replace_worst_element(previous, data):
|
||||||
|
solution = previous.copy()
|
||||||
|
worst_index = solution["distance"].astype(float).idxmin()
|
||||||
|
random_element = data.sample().squeeze()
|
||||||
|
while element_in_dataframe(solution=solution, element=random_element):
|
||||||
|
random_element = data.sample().squeeze()
|
||||||
|
solution.loc[worst_index] = random_element
|
||||||
|
return solution, worst_index
|
||||||
|
|
||||||
|
|
||||||
|
def get_random_solution(previous, data):
|
||||||
|
solution, worst_index = replace_worst_element(previous, data)
|
||||||
|
previous_worst_distance = previous["distance"].loc[worst_index]
|
||||||
|
while solution.distance.loc[worst_index] <= previous_worst_distance:
|
||||||
|
solution, _ = replace_worst_element(previous=solution, data=data)
|
||||||
|
return solution
|
||||||
|
|
||||||
|
|
||||||
|
def explore_neighbourhood(element, data, max_iterations=100000):
|
||||||
|
neighbourhood = []
|
||||||
|
neighbourhood.append(element)
|
||||||
|
for _ in range(max_iterations):
|
||||||
|
previous_solution = neighbourhood[-1]
|
||||||
|
neighbour = get_random_solution(previous=previous_solution, data=data)
|
||||||
|
neighbourhood.append(neighbour)
|
||||||
|
return neighbour
|
||||||
|
|
||||||
|
|
||||||
|
def memetic_algorithm(m, data):
|
||||||
|
first_solution = get_first_random_solution(m=m, data=data)
|
||||||
|
best_solution = explore_neighbourhood(
|
||||||
|
element=first_solution, data=data, max_iterations=100
|
||||||
|
)
|
||||||
|
return best_solution
|
Loading…
Reference in New Issue