Change data representation in local search
This commit is contained in:
		
							parent
							
								
									b8b1fe9368
								
							
						
					
					
						commit
						d82fe81f78
					
				@ -1,10 +1,39 @@
 | 
				
			|||||||
from numpy.random import choice, seed
 | 
					from numpy.random import choice, seed
 | 
				
			||||||
 | 
					from pandas import DataFrame
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_first_random_solution(m, data):
 | 
					def get_row_distance(source, destination, data):
 | 
				
			||||||
 | 
					    row = data.query(
 | 
				
			||||||
 | 
					        """(source == @source and destination == @destination) or \
 | 
				
			||||||
 | 
					        (source == @destination and destination == @source)"""
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    return row["distance"].values[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def compute_distance(element, solution, data):
 | 
				
			||||||
 | 
					    accumulator = 0
 | 
				
			||||||
 | 
					    distinct_elements = solution.query(f"point != {element}")
 | 
				
			||||||
 | 
					    for _, item in distinct_elements.iterrows():
 | 
				
			||||||
 | 
					        accumulator += get_row_distance(
 | 
				
			||||||
 | 
					            source=element,
 | 
				
			||||||
 | 
					            destination=item.point,
 | 
				
			||||||
 | 
					            data=data,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    return accumulator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_first_random_solution(n, m, data):
 | 
				
			||||||
 | 
					    solution = DataFrame(columns=["point", "distance"])
 | 
				
			||||||
    seed(42)
 | 
					    seed(42)
 | 
				
			||||||
    random_indexes = choice(len(data.index), size=m, replace=False)
 | 
					    solution["point"] = choice(n, size=m, replace=False)
 | 
				
			||||||
    return data.loc[random_indexes]
 | 
					    solution["distance"] = solution["point"].apply(
 | 
				
			||||||
 | 
					        func=compute_distance, solution=solution, data=data
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    return solution
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def evaluate_element_swap(solution, old_element, new_element, data):
 | 
				
			||||||
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def element_in_dataframe(solution, element):
 | 
					def element_in_dataframe(solution, element):
 | 
				
			||||||
@ -22,14 +51,14 @@ def replace_worst_element(previous, data):
 | 
				
			|||||||
    while element_in_dataframe(solution=solution, element=random_element):
 | 
					    while element_in_dataframe(solution=solution, element=random_element):
 | 
				
			||||||
        random_element = data.sample().squeeze()
 | 
					        random_element = data.sample().squeeze()
 | 
				
			||||||
    solution.loc[worst_index] = random_element
 | 
					    solution.loc[worst_index] = random_element
 | 
				
			||||||
    return solution, worst_index
 | 
					    return solution
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_random_solution(previous, data):
 | 
					def get_random_solution(previous, data):
 | 
				
			||||||
    solution, worst_index = replace_worst_element(previous, data)
 | 
					    solution, worst_index = replace_worst_element(previous, data)
 | 
				
			||||||
    previous_worst_distance = previous["distance"].loc[worst_index]
 | 
					    previous_worst_distance = previous["distance"].loc[worst_index]
 | 
				
			||||||
    while solution.distance.loc[worst_index] <= previous_worst_distance:
 | 
					    while solution.distance.loc[worst_index] <= previous_worst_distance:
 | 
				
			||||||
        solution, _ = replace_worst_element(previous=solution, data=data)
 | 
					        solution = replace_worst_element(previous=solution, data=data)
 | 
				
			||||||
    return solution
 | 
					    return solution
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -43,8 +72,8 @@ def explore_neighbourhood(element, data, max_iterations=100000):
 | 
				
			|||||||
    return neighbour
 | 
					    return neighbour
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def local_search(m, data):
 | 
					def local_search(n, m, data):
 | 
				
			||||||
    first_solution = get_first_random_solution(m=m, data=data)
 | 
					    first_solution = get_first_random_solution(n, m, data)
 | 
				
			||||||
    best_solution = explore_neighbourhood(
 | 
					    best_solution = explore_neighbourhood(
 | 
				
			||||||
        element=first_solution, data=data, max_iterations=100
 | 
					        element=first_solution, data=data, max_iterations=100
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ def execute_algorithm(choice, n, m, data):
 | 
				
			|||||||
    if choice == "greedy":
 | 
					    if choice == "greedy":
 | 
				
			||||||
        return greedy_algorithm(n, m, data)
 | 
					        return greedy_algorithm(n, m, data)
 | 
				
			||||||
    elif choice == "local":
 | 
					    elif choice == "local":
 | 
				
			||||||
        return local_search(m, data)
 | 
					        return local_search(n, m, data)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        print("The valid algorithm choices are 'greedy' and 'local'")
 | 
					        print("The valid algorithm choices are 'greedy' and 'local'")
 | 
				
			||||||
        exit(1)
 | 
					        exit(1)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user