from vrptw_base import VrptwGraph from multiple_ant_colony_system import MultipleAntColonySystem if __name__ == '__main__': file_path = './solomon-100/c101.txt' ants_num = 10 beta = 2 q0 = 0.1 show_figure = True graph = VrptwGraph(file_path) macs = MultipleAntColonySystem(graph, ants_num=ants_num, beta=beta, q0=q0, whether_or_not_to_show_figure=show_figure) macs.run_multiple_ant_colony_system()
def acs_vehicle(new_graph: VrptwGraph, vehicle_num: int, ants_num: int, q0: float, beta: int, global_path_queue: Queue, path_found_queue: Queue, stop_event: Event): """ :param new_graph: :param vehicle_num: :param ants_num: :param q0: :param beta: :param global_path_queue: :param path_found_queue: :param stop_event: :return: """ print('[acs_vehicle]: start, vehicle_num %d' % vehicle_num) global_best_path = None global_best_distance = None current_path, current_path_distance, _ = new_graph.nearest_neighbor_heuristic( max_vehicle_num=vehicle_num) current_index_to_visit = list(range(new_graph.node_num)) for ind in set(current_path): current_index_to_visit.remove(ind) ants_pool = ThreadPoolExecutor(ants_num) ants_thread = [] ants = [] IN = np.zeros(new_graph.node_num) while True: print('[acs_vehicle]: new iteration') if stop_event.is_set(): print('[acs_vehicle]: receive stop event') return for k in range(ants_num): ant = Ant(new_graph, 0) thread = ants_pool.submit( MultipleAntColonySystem.new_active_ant, ant, vehicle_num, False, IN, q0, beta, stop_event) ants_thread.append(thread) ants.append(ant) for thread in ants_thread: thread.result() for ant in ants: if stop_event.is_set(): print('[acs_vehicle]: receive stop event') return IN[ant.index_to_visit] = IN[ant.index_to_visit] + 1 if len(ant.index_to_visit) < len(current_index_to_visit): current_path = copy.deepcopy(ant.travel_path) current_index_to_visit = copy.deepcopy(ant.index_to_visit) current_path_distance = ant.total_travel_distance IN = np.zeros(new_graph.node_num) if ant.index_to_visit_empty(): print( '[acs_vehicle]: found a feasible path, send path info to macs' ) path_found_queue.put( PathMessage(ant.travel_path, ant.total_travel_distance)) new_graph.global_update_pheromone(current_path, current_path_distance) if not global_path_queue.empty(): info = global_path_queue.get() while not global_path_queue.empty(): info = global_path_queue.get() print('[acs_vehicle]: receive global path info') global_best_path, global_best_distance, global_used_vehicle_num = info.get_path_info( ) new_graph.global_update_pheromone(global_best_path, global_best_distance) ants_thread.clear() for ant in ants: ant.clear() del ant ants.clear()
def acs_time(new_graph: VrptwGraph, vehicle_num: int, ants_num: int, q0: float, beta: int, global_path_queue: Queue, path_found_queue: Queue, stop_event: Event): """ :param new_graph: :param vehicle_num: :param ants_num: :param q0: :param beta: :param global_path_queue: :param path_found_queue: :param stop_event: :return: """ print('[acs_time]: start, vehicle_num %d' % vehicle_num) global_best_path = None global_best_distance = None ants_pool = ThreadPoolExecutor(ants_num) ants_thread = [] ants = [] while True: print('[acs_time]: new iteration') if stop_event.is_set(): print('[acs_time]: receive stop event') return for k in range(ants_num): ant = Ant(new_graph, 0) thread = ants_pool.submit( MultipleAntColonySystem.new_active_ant, ant, vehicle_num, True, np.zeros(new_graph.node_num), q0, beta, stop_event) ants_thread.append(thread) ants.append(ant) for thread in ants_thread: thread.result() ant_best_travel_distance = None ant_best_path = None for ant in ants: if stop_event.is_set(): print('[acs_time]: receive stop event') return if not global_path_queue.empty(): info = global_path_queue.get() while not global_path_queue.empty(): info = global_path_queue.get() print('[acs_time]: receive global path info') global_best_path, global_best_distance, global_used_vehicle_num = info.get_path_info( ) if ant.index_to_visit_empty() and ( ant_best_travel_distance is None or ant.total_travel_distance < ant_best_travel_distance): ant_best_travel_distance = ant.total_travel_distance ant_best_path = ant.travel_path new_graph.global_update_pheromone(global_best_path, global_best_distance) if ant_best_travel_distance is not None and ant_best_travel_distance < global_best_distance: print( '[acs_time]: ants\' local search found a improved feasible path, send path info to macs' ) path_found_queue.put( PathMessage(ant_best_path, ant_best_travel_distance)) ants_thread.clear() for ant in ants: ant.clear() del ant ants.clear()
from vrptw_base import VrptwGraph from multiple_ant_colony_system import MultipleAntColonySystem if __name__ == '__main__': file_path = './solomon-100/c101.txt' ants_num = 10 beta = 2 q0 = 0.1 show_figure = True graph = VrptwGraph(file_path, mode=1) macs = MultipleAntColonySystem(graph, ants_num=ants_num, beta=beta, q0=q0, mode=1, whether_or_not_to_show_figure = show_figure) macs.run_multiple_ant_colony_system()
def acs_vehicle(new_graph: VrptwGraph, vehicle_num: int, ants_num: int, q0: float, beta: int, global_path_queue: Queue, path_found_queue: Queue, stop_event: Event): """ 对于acs_vehicle来说,所使用的vehicle num会比当前所找到的best path所使用的车辆数少一辆,要使用更少的车辆,尽量去访问结点,如果访问完了所有的结点(路径是可行的),就将通知macs :param new_graph: :param vehicle_num: :param ants_num: :param q0: :param beta: :param global_path_queue: :param path_found_queue: :param stop_event: :return: """ # vehicle_num设置为比当前的best_path少一个 print('[acs_vehicle]: start, vehicle_num %d' % vehicle_num) global_best_path = None global_best_distance = None # 使用nearest_neighbor_heuristic算法初始化path 和distance current_path, current_path_distance, _ = new_graph.nearest_neighbor_heuristic(max_vehicle_num=vehicle_num) # 找出当前path中未访问的结点 current_index_to_visit = list(range(new_graph.node_num)) for ind in set(current_path): current_index_to_visit.remove(ind) ants_pool = ThreadPoolExecutor(ants_num) ants_thread = [] ants = [] IN = np.zeros(new_graph.node_num) while True: print('[acs_vehicle]: new iteration') if stop_event.is_set(): print('[acs_vehicle]: receive stop event') return for k in range(ants_num): ant = Ant(new_graph, 0) thread = ants_pool.submit(MultipleAntColonySystem.new_active_ant, ant, vehicle_num, False, IN, q0, beta, stop_event) ants_thread.append(thread) ants.append(ant) # 这里可以使用result方法,等待线程跑完 for thread in ants_thread: thread.result() for ant in ants: if stop_event.is_set(): print('[acs_vehicle]: receive stop event') return IN[ant.index_to_visit] = IN[ant.index_to_visit]+1 # 蚂蚁找出来的路径与current_path进行比较,是否能使用vehicle_num辆车访问到更多的结点 if len(ant.index_to_visit) < len(current_index_to_visit): current_path = copy.deepcopy(ant.travel_path) current_index_to_visit = copy.deepcopy(ant.index_to_visit) current_path_distance = ant.total_travel_distance # 并且将IN设置为0 IN = np.zeros(new_graph.node_num) # 如果这一条路径是feasible的话,就要发到macs_vrptw中 if ant.index_to_visit_empty(): print('[acs_vehicle]: found a feasible path, send path info to macs') path_found_queue.put(PathMessage(ant.travel_path, ant.total_travel_distance)) # 更新new_graph中的信息素,global new_graph.global_update_pheromone(current_path, current_path_distance) if not global_path_queue.empty(): info = global_path_queue.get() while not global_path_queue.empty(): info = global_path_queue.get() print('[acs_vehicle]: receive global path info') global_best_path, global_best_distance, global_used_vehicle_num = info.get_path_info() new_graph.global_update_pheromone(global_best_path, global_best_distance) ants_thread.clear() for ant in ants: ant.clear() del ant ants.clear()
def acs_time(new_graph: VrptwGraph, vehicle_num: int, ants_num: int, q0: float, beta: int, global_path_queue: Queue, path_found_queue: Queue, stop_event: Event): """ 对于acs_time来说,需要访问完所有的结点(路径是可行的),尽量找到travel distance更短的路径 :param new_graph: :param vehicle_num: :param ants_num: :param q0: :param beta: :param global_path_queue: :param path_found_queue: :param stop_event: :return: """ # 最多可以使用vehicle_num辆车,即在path中最多包含vehicle_num+1个depot中,找到路程最短的路径, # vehicle_num设置为与当前的best_path一致 print('[acs_time]: start, vehicle_num %d' % vehicle_num) # 初始化信息素矩阵 global_best_path = None global_best_distance = None ants_pool = ThreadPoolExecutor(ants_num) ants_thread = [] ants = [] while True: print('[acs_time]: new iteration') if stop_event.is_set(): print('[acs_time]: receive stop event') return for k in range(ants_num): ant = Ant(new_graph, 0) thread = ants_pool.submit(MultipleAntColonySystem.new_active_ant, ant, vehicle_num, True, np.zeros(new_graph.node_num), q0, beta, stop_event) ants_thread.append(thread) ants.append(ant) # 这里可以使用result方法,等待线程跑完 for thread in ants_thread: thread.result() ant_best_travel_distance = None ant_best_path = None # 判断蚂蚁找出来的路径是否是feasible的,并且比全局的路径要好 for ant in ants: if stop_event.is_set(): print('[acs_time]: receive stop event') return # 获取当前的best path if not global_path_queue.empty(): info = global_path_queue.get() while not global_path_queue.empty(): info = global_path_queue.get() print('[acs_time]: receive global path info') global_best_path, global_best_distance, global_used_vehicle_num = info.get_path_info() # 路径蚂蚁计算得到的最短路径 if ant.index_to_visit_empty() and (ant_best_travel_distance is None or ant.total_travel_distance < ant_best_travel_distance): ant_best_travel_distance = ant.total_travel_distance ant_best_path = ant.travel_path # 在这里执行信息素的全局更新 new_graph.global_update_pheromone(global_best_path, global_best_distance) # 向macs发送计算得到的当前的最佳路径 if ant_best_travel_distance is not None and ant_best_travel_distance < global_best_distance: print('[acs_time]: ants\' local search found a improved feasible path, send path info to macs') path_found_queue.put(PathMessage(ant_best_path, ant_best_travel_distance)) ants_thread.clear() for ant in ants: ant.clear() del ant ants.clear()