diff options
| author | JonZhao <[email protected]> | 2019-05-29 14:30:38 +0800 |
|---|---|---|
| committer | JonZhao <[email protected]> | 2019-05-29 14:30:38 +0800 |
| commit | 1dcc89d6f9481368be538ae7339c1793fb546398 (patch) | |
| tree | 5e43146089540d87bab69b5ba1e87422ec1ab002 /multiple_ant_colony_system.py | |
| parent | 8d459d62b4deed1212f613cad1967b36ca385d5a (diff) | |
| download | VRPTW-ACO-python-1dcc89d6f9481368be538ae7339c1793fb546398.tar.gz VRPTW-ACO-python-1dcc89d6f9481368be538ae7339c1793fb546398.tar.bz2 VRPTW-ACO-python-1dcc89d6f9481368be538ae7339c1793fb546398.zip | |
更新figure class:在重新绘制line的过程中,只移除之前绘制了的line;更新了配色方案
Diffstat (limited to 'multiple_ant_colony_system.py')
| -rw-r--r-- | multiple_ant_colony_system.py | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/multiple_ant_colony_system.py b/multiple_ant_colony_system.py index 9a9dcb1..888c84b 100644 --- a/multiple_ant_colony_system.py +++ b/multiple_ant_colony_system.py @@ -11,30 +11,24 @@ import time class MultipleAntColonySystem: - def __init__(self, graph: VrptwGraph, ants_num=10, max_iter=200, alpha=1, beta=2): + def __init__(self, graph: VrptwGraph, ants_num=10, beta=2, q0=0.1, whether_or_not_to_show_figure=True): super() # graph 结点的位置、服务时间信息 self.graph = graph # ants_num 蚂蚁数量 self.ants_num = ants_num - # max_iter 最大迭代次数 - self.max_iter = max_iter # vehicle_capacity 表示每辆车的最大载重 self.max_load = graph.vehicle_capacity - # 信息素强度 - self.Q = 1 - # alpha 信息素信息重要新 - self.alpha = alpha # beta 启发性信息重要性 self.beta = beta # q0 表示直接选择概率最大的下一点的概率 - self.q0 = 0.1 + self.q0 = q0 # best path self.best_path_distance = None self.best_path = None self.best_vehicle_num = None - self.whether_or_not_to_show_figure = True + self.whether_or_not_to_show_figure = whether_or_not_to_show_figure @staticmethod def stochastic_accept(index_to_visit, transition_prob): @@ -60,6 +54,19 @@ class MultipleAntColonySystem: @staticmethod def new_active_ant(ant: Ant, vehicle_num: int, local_search: bool, IN: np.numarray, q0: float, beta: int, stop_event: Event): + """ + 按照指定的vehicle_num在地图上进行探索,所使用的vehicle num不能多于指定的数量,acs_time和acs_vehicle都会使用到这个方法 + 对于acs_time来说,需要访问完所有的结点(路径是可行的),尽量找到travel distance更短的路径 + 对于acs_vehicle来说,所使用的vehicle num会比当前所找到的best path所使用的车辆数少一辆,要使用更少的车辆,尽量去访问结点,如果访问完了所有的结点(路径是可行的),就将通知macs + :param ant: + :param vehicle_num: + :param local_search: + :param IN: + :param q0: + :param beta: + :param stop_event: + :return: + """ # print('[new_active_ant]: start, start_index %d' % ant.travel_path[0]) # 在new_active_ant中,最多可以使用vehicle_num个车,即最多可以包含vehicle_num+1个depot结点,由于出发结点用掉了一个,所以只剩下vehicle个depot @@ -128,6 +135,18 @@ class MultipleAntColonySystem: @staticmethod 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一致 @@ -182,8 +201,18 @@ class MultipleAntColonySystem: @staticmethod 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): - - # 最多可以使用vehicle_num辆车,即在path中最多包含vehicle_num+1个depot中,找到路程最短的路径, + """ + 对于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 @@ -254,7 +283,10 @@ class MultipleAntColonySystem: new_graph.global_update_pheromone(global_best_path, global_best_distance) def run_multiple_ant_colony_system(self): - # _multiple_ant_colony_system,使用主线程来绘图 + """ + 开启另外的线程来跑multiple_ant_colony_system, 使用主线程来绘图 + :return: + """ path_queue_for_figure = Queue() multiple_ant_colony_system_thread = Thread(target=self._multiple_ant_colony_system, args=(path_queue_for_figure,)) multiple_ant_colony_system_thread.start() @@ -270,6 +302,11 @@ class MultipleAntColonySystem: path_queue_for_figure.put(PathMessage(None, None)) def _multiple_ant_colony_system(self, path_queue_for_figure: Queue): + """ + 调用acs_time 和 acs_vehicle进行路径的探索 + :param path_queue_for_figure: + :return: + """ # 在这里需要两个队列,time_what_to_do、vehicle_what_to_do, 用来告诉acs_time、acs_vehicle这两个线程,当前的best path是什么,或者让他们停止计算 global_path_to_acs_time = Queue() global_path_to_acs_vehicle = Queue() @@ -353,7 +390,9 @@ class MultipleAntColonySystem: start_time = time.time() print('-' * 50) - print('[macs]: vehicle num of found path (%d) better than best path\'s (%d)' % (found_path_used_vehicle_num, best_vehicle_num)) + print('[macs]: vehicle num of found path (%d) better than best path\'s (%d), found path distance is %f' + % (found_path_used_vehicle_num, best_vehicle_num, found_path_distance)) + print('-' * 50) self.best_path = found_path self.best_vehicle_num = found_path_used_vehicle_num |
