From 87ee65087fe52af3ba6b8342135eb9dd05298e01 Mon Sep 17 00:00:00 2001 From: weixin_46229132 Date: Fri, 4 Apr 2025 10:59:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9100=5F100=5F6=E7=9A=84dqn?= =?UTF-8?q?=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Duel_Double_DQN/utils.py | 4 +- env_partion_dist.py | 72 +++++++----- human_action.py | 3 +- solutions/dqn_params_100_100_6.json | 74 +++++++++++++ ...=> trav_ga_params_100_100_6_parallel.json} | 104 +++++++++--------- visualization.py | 2 +- 6 files changed, 175 insertions(+), 84 deletions(-) create mode 100644 solutions/dqn_params_100_100_6.json rename solutions/{trav_ga_params_100_100_5_parallel.json => trav_ga_params_100_100_6_parallel.json} (80%) diff --git a/Duel_Double_DQN/utils.py b/Duel_Double_DQN/utils.py index b37e84c..e8c6d29 100644 --- a/Duel_Double_DQN/utils.py +++ b/Duel_Double_DQN/utils.py @@ -47,7 +47,7 @@ def save_best_solution(info_lt): # 读取已有的最优解 try: - with open('solutions/dqn_params_50_50_3.json', 'r') as f: + with open('solutions/dqn_params_100_100_6.json', 'r') as f: saved_solution = json.load(f) saved_time = saved_solution['best_time'] except FileNotFoundError: @@ -63,7 +63,7 @@ def save_best_solution(info_lt): 'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S') } - with open('solutions/dqn_params_50_50_3.json', 'w') as f: + with open('solutions/dqn_params_100_100_6.json', 'w') as f: json.dump(best_solution, f, indent=4) print(f"发现新的最优解!时间: {best_info['best_time']}") diff --git a/env_partion_dist.py b/env_partion_dist.py index 2f992df..e034578 100644 --- a/env_partion_dist.py +++ b/env_partion_dist.py @@ -18,13 +18,13 @@ class PartitionEnv(gym.Env): ############################## # 可能需要手动修改的超参数 ############################## - self.params = 'params_50_50_3' - self.ORI_ROW_CUTS = [0, 0.2, 0.4, 0.7, 1] - self.ORI_COL_CUTS = [0, 0.5, 1] - self.CUT_NUM = 4 - self.BASE_LINE = 9051.16 - self.MAX_ADJUST_STEP = 50 - self.ADJUST_THRESHOLD = 0.1 + self.params = 'params_100_100_6' + self.ORI_ROW_CUTS = [0, 0.2, 0.5, 0.7, 1] + self.ORI_COL_CUTS = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] + self.CUT_NUM = 12 + self.BASE_LINE = 19616.68 + self.MAX_ADJUST_STEP = 80 + # self.ADJUST_THRESHOLD = 0.1 # self.mTSP_STEPS = 10000 # 切分位置+/-0.01 @@ -73,26 +73,41 @@ class PartitionEnv(gym.Env): return state def step(self, action): - if action == 1: - self.row_cuts[1] += 0.01 - elif action == 2: - self.row_cuts[1] -= 0.01 - elif action == 3: - self.row_cuts[2] += 0.01 - elif action == 4: - self.row_cuts[2] -= 0.01 - elif action == 5: - self.row_cuts[3] += 0.01 - elif action == 6: - self.row_cuts[3] -= 0.01 - elif action == 7: - self.col_cuts[1] += 0.01 - elif action == 8: - self.col_cuts[1] -= 0.01 - elif action == 0: + # if action == 1: + # self.row_cuts[1] += 0.01 + # elif action == 2: + # self.row_cuts[1] -= 0.01 + # elif action == 3: + # self.row_cuts[2] += 0.01 + # elif action == 4: + # self.row_cuts[2] -= 0.01 + # elif action == 5: + # self.row_cuts[3] += 0.01 + # elif action == 6: + # self.row_cuts[3] -= 0.01 + # elif action == 7: + # self.col_cuts[1] += 0.01 + # elif action == 8: + # self.col_cuts[1] -= 0.01 + # elif action == 0: + # pass + cut_index, signal = (action + 1) // 2, (action + 1) % 2 + if action == 0: pass + elif cut_index <= 3: + if signal == 0: + self.row_cuts[cut_index] += 0.01 + else: + self.row_cuts[cut_index] -= 0.01 + else: + if signal == 0: + self.col_cuts[cut_index-3] += 0.01 + else: + self.col_cuts[cut_index-3] -= 0.01 - if self.row_cuts[0] < self.row_cuts[1] < self.row_cuts[2] < self.row_cuts[3] < self.row_cuts[4] and self.col_cuts[0] < self.col_cuts[1] < self.col_cuts[2]: + # 检查row_cuts和col_cuts是否按升序排列 + if (all(self.row_cuts[i] < self.row_cuts[i+1] for i in range(len(self.row_cuts)-1)) and + all(self.col_cuts[i] < self.col_cuts[i+1] for i in range(len(self.col_cuts)-1))): # 调整是合法的,验证分区情况是否满足条件 rectangles = self.if_valid_partition() @@ -107,7 +122,8 @@ class PartitionEnv(gym.Env): # else: # # 根据最佳路径计算当前时间 # best_time = self.get_best_time(self.best_path, rectangles) - self.best_path = [0, 1, 3, 5, 9, 7, 8, 10, 2, 4, 6, 0] + self.best_path = [0, 17, 10, 9, 8, 7, 6, 5, 0, 28, 29, 30, 19, 20, 18, 16, 43, 27, 40, 39, 38, 37, + 36, 26, 45, 14, 13, 12, 11, 22, 21, 23, 24, 41, 44, 25, 34, 35, 33, 32, 31, 42, 15, 4, 3, 2, 1, 0] best_time = self.get_best_time(self.best_path, rectangles) else: @@ -239,13 +255,13 @@ class PartitionEnv(gym.Env): # 使用tanh归一化,确保time_diff=0时,normalized_diff=0 # tanh在变量值为2时,就非常接近1了。最大的time_diff为400 - normalized_diff = np.tanh(time_diff / 200) # 20是缩放因子,可调整 + normalized_diff = np.tanh(time_diff / 5000) # 20是缩放因子,可调整 # 计算轮次权重(折扣因子) # step_weight = 1 / (1 + np.exp(-self.adjust_step/10)) # 计算最终奖励 - reward = normalized_diff + reward = normalized_diff # * step_weight # 10是缩放因子 return reward diff --git a/human_action.py b/human_action.py index 8421c64..5bf9c8f 100644 --- a/human_action.py +++ b/human_action.py @@ -13,8 +13,7 @@ print('state:', state) # action_series = [1] * 30 # action_series = [[0.2], [0.4], [0.7], [0.5]] # action_series = [[-0.08], [-0.08], [0], [0]] -action_series = [3, 5, 3, 5, 1, 1, 3, 5, 1, 5, 3, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, - 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1] +action_series = [0, 0, 3, 4, 24, 20] for i in range(100): action = action_series[i] diff --git a/solutions/dqn_params_100_100_6.json b/solutions/dqn_params_100_100_6.json new file mode 100644 index 0000000..5da2434 --- /dev/null +++ b/solutions/dqn_params_100_100_6.json @@ -0,0 +1,74 @@ +{ + "best_time": 19557.574055662244, + "row_cuts": [ + 0, + 0.2, + 0.5, + 0.7, + 1 + ], + "col_cuts": [ + 0, + 0.1, + 0.19, + 0.3, + 0.4, + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1 + ], + "best_path": [ + 0, + 17, + 10, + 9, + 8, + 7, + 6, + 5, + 0, + 28, + 29, + 30, + 19, + 20, + 18, + 16, + 43, + 27, + 40, + 39, + 38, + 37, + 36, + 26, + 45, + 14, + 13, + 12, + 11, + 22, + 21, + 23, + 24, + 41, + 25, + 44, + 34, + 35, + 33, + 32, + 31, + 42, + 15, + 4, + 3, + 2, + 1, + 0 + ], + "timestamp": "2025-04-04 10:47:47" +} \ No newline at end of file diff --git a/solutions/trav_ga_params_100_100_5_parallel.json b/solutions/trav_ga_params_100_100_6_parallel.json similarity index 80% rename from solutions/trav_ga_params_100_100_5_parallel.json rename to solutions/trav_ga_params_100_100_6_parallel.json index 3d68b01..d16466d 100644 --- a/solutions/trav_ga_params_100_100_5_parallel.json +++ b/solutions/trav_ga_params_100_100_6_parallel.json @@ -1,5 +1,12 @@ { "row_boundaries": [ + 0.0, + 0.2, + 0.5, + 0.7, + 1.0 + ], + "col_boundaries": [ 0.0, 0.1, 0.2, @@ -12,63 +19,58 @@ 0.9, 1.0 ], - "col_boundaries": [ - 0.0, - 0.2, - 0.4, - 0.7, - 1.0 - ], "car_paths": [ [ - 17, - 5, - 4, - 0, - 1, - 2, - 6, - 10, - 14 - ], - [ - 18, - 13, + 16, 9, 8, - 12, - 16, - 20, - 32, - 21 - ], - [ - 22, - 26, - 30, - 34, - 39, - 35, - 31, - 27, - 19 - ], - [ - 25, - 24, - 28, - 36, - 33, - 37, - 38, - 29 - ], - [ - 15, - 23, 7, + 6, + 5, + 4 + ], + [ + 27, + 28, + 29, + 18, + 19, + 17, + 15 + ], + [ + 26, + 39, + 38, + 37, + 36, + 35, + 25 + ], + [ + 13, + 12, 11, - 3 + 10, + 21, + 20, + 22, + 23 + ], + [ + 24, + 33, + 34, + 32, + 31, + 30 + ], + [ + 14, + 3, + 2, + 1, + 0 ] ] } \ No newline at end of file diff --git a/visualization.py b/visualization.py index e183909..7ac0434 100644 --- a/visualization.py +++ b/visualization.py @@ -200,7 +200,7 @@ if __name__ == "__main__": # 需要修改的超参数 # --------------------------- params_file = 'params_100_100_6' - solution_file = r'solutions\greedy_params_100_100_6.json' + solution_file = r'solutions\trav_ga_params_100_100_6_parallel.json' with open(params_file + '.yml', 'r', encoding='utf-8') as file: params = yaml.safe_load(file)