From b3d58379efcf95f8b20deb4ba5f116969660e5b8 Mon Sep 17 00:00:00 2001 From: Jiang Date: Sun, 8 Mar 2026 20:45:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dfind=5Fnew=5Fcenter=5Fpipe?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E7=82=B9=E4=BB=A3=E7=A0=81=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../burst_location/burst_locator.py | 8 ++-- .../burst_location/network_partitioner.py | 44 ++++++++++++------- .../burst_location/similarity_calculator.py | 14 +++--- 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/app/algorithms/burst_location/burst_locator.py b/app/algorithms/burst_location/burst_locator.py index 43e3f88..fc51e02 100644 --- a/app/algorithms/burst_location/burst_locator.py +++ b/app/algorithms/burst_location/burst_locator.py @@ -690,11 +690,11 @@ def DN_search_multi_simple_add_flow_count_new( dpressure = (pressure_predict - pressure_monitor).mean() dpressure = dpressure.abs() simulation_times = simulation_times + len(dpressure.index) - similarity_sp = pd.Series(dtype=object) + similarity_sp = pd.Series(dtype=float) for each_node in dpressure.index: pipe = node_pipe_dic[each_node][0] similarity_sp.loc[pipe] = dpressure.loc[each_node] - similarity_sp = similarity_sp.sort_values(ascending=False) + similarity_sp = similarity_sp.sort_values(ascending=False, kind="mergesort") t2 = datetime.now() final_area_pipe = [] @@ -722,11 +722,11 @@ def DN_search_multi_simple_add_flow_count_new( dpressure = (pressure_predict - pressure_monitor).mean() dpressure = dpressure.abs() - similarity_sp = pd.Series(dtype=object) + similarity_sp = pd.Series(dtype=float) for each_node in dpressure.index: pipe = node_pipe_dic[each_node][0] similarity_sp.loc[pipe] = dpressure.loc[each_node] - similarity_sp = similarity_sp.sort_values(ascending=False) + similarity_sp = similarity_sp.sort_values(ascending=False, kind="mergesort") t2 = datetime.now() dt = (t2 - t1).seconds final_candidates_csv = _write_last_round_candidates_csv( diff --git a/app/algorithms/burst_location/network_partitioner.py b/app/algorithms/burst_location/network_partitioner.py index 57fd7b4..a399252 100644 --- a/app/algorithms/burst_location/network_partitioner.py +++ b/app/algorithms/burst_location/network_partitioner.py @@ -25,8 +25,8 @@ def pick_center_pipe(node_x, node_y, candidate_pipe, pipe_start_node, pipe_end_n start_nodes = pipe_start_node[candidate_pipe_list] end_nodes = pipe_end_node[candidate_pipe_list] - x_vals = (node_x[start_nodes].to_numpy() + node_x[start_nodes].to_numpy()) / 2.0 - y_vals = (node_y[end_nodes].to_numpy() + node_y[end_nodes].to_numpy()) / 2.0 + x_vals = (node_x[start_nodes].to_numpy() + node_x[end_nodes].to_numpy()) / 2.0 + y_vals = (node_y[start_nodes].to_numpy() + node_y[end_nodes].to_numpy()) / 2.0 mean_x = float(np.mean(x_vals)) mean_y = float(np.mean(y_vals)) distance = np.abs(x_vals - mean_x) + np.abs(y_vals - mean_y) @@ -122,8 +122,14 @@ def metis_grouping_pipe_weight( w_f = w_f + w_new[i] # (edgecuts, parts) = pymetis.part_graph(nparts=group_num, adjacency=adjacency_list_new) + # metis_options = pymetis.Options() + # metis_options.seed = 42 (edgecuts, parts) = pymetis.part_graph( - nparts=group_num, adjncy=final_adjacency_list, xadj=xadj, eweights=w_f + nparts=group_num, + adjncy=final_adjacency_list, + xadj=xadj, + eweights=w_f, + # options=metis_options, ) # (edgecuts, parts) = pymetis.part_graph(nparts=group_num, adjacency=adjacency_list_new) candidate_group_list = [[] * 1 for i in range(group_num)] @@ -249,6 +255,9 @@ def visualize_metis_partition( """ fig = plt.figure("metis_partition_convergence", figsize=(22.51, 12.48)) fig.clf() + ax = fig.add_subplot(111) + if not block: + plt.ion() # 生成颜色映射(自动扩展颜色数量) colors = plt.cm.tab20(np.linspace(0, 1, len(pipe_groups))) @@ -256,7 +265,7 @@ def visualize_metis_partition( # --- 绘制背景管网(灰色半透明) --- for edge in G.edges(): start_node, end_node = edge - plt.plot( + ax.plot( [node_x[start_node], node_x[end_node]], [node_y[start_node], node_y[end_node]], color="lightgray", @@ -274,7 +283,7 @@ def visualize_metis_partition( for pipe in group: start = pipe_start_node_all[pipe] end = pipe_end_node_all[pipe] - line = plt.plot( + line = ax.plot( [node_x[start], node_x[end]], [node_y[start], node_y[end]], color=color, @@ -290,7 +299,7 @@ def visualize_metis_partition( if center in pipe_start_node_all and center in pipe_end_node_all: start = pipe_start_node_all[center] end = pipe_end_node_all[center] - plt.plot( + ax.plot( [node_x[start], node_x[end]], [node_y[start], node_y[end]], color="red", @@ -304,7 +313,7 @@ def visualize_metis_partition( # 分组图例 if legend_handles: group_labels = [f"Group {i + 1}" for i in range(len(pipe_groups))] - plt.legend( + ax.legend( legend_handles, group_labels, loc="upper right", @@ -322,7 +331,7 @@ def visualize_metis_partition( y = ( node_y[pipe_start_node_all[center]] + node_y[pipe_end_node_all[center]] ) / 2 - plt.text( + ax.text( x, y, f"C{i + 1}", @@ -334,15 +343,20 @@ def visualize_metis_partition( ) # --- 图形美化 --- - plt.title(title or "Water Network Partitioning Overview", fontsize=14, pad=20) - plt.xlabel("X Coordinate", fontsize=10) - plt.ylabel("Y Coordinate", fontsize=10) - plt.grid(True, alpha=0.2, linestyle=":") - plt.tight_layout() + ax.set_title(title or "Water Network Partitioning Overview", fontsize=14, pad=20) + ax.set_xlabel("X Coordinate", fontsize=10) + ax.set_ylabel("Y Coordinate", fontsize=10) + ax.grid(True, alpha=0.2, linestyle=":") + fig.tight_layout() - # 显示图形 + # 显示图形并强制刷新,避免迭代显示滞后一轮。 plt.show(block=block) - if pause_seconds is not None: + if not block: + fig.canvas.draw_idle() + fig.canvas.flush_events() + pause_value = 0.001 if pause_seconds is None else max(0.0, float(pause_seconds)) + plt.pause(max(0.001, pause_value)) + elif pause_seconds is not None: plt.pause(max(0.0, float(pause_seconds))) return fig diff --git a/app/algorithms/burst_location/similarity_calculator.py b/app/algorithms/burst_location/similarity_calculator.py index ffea001..6ada573 100644 --- a/app/algorithms/burst_location/similarity_calculator.py +++ b/app/algorithms/burst_location/similarity_calculator.py @@ -577,7 +577,7 @@ def cal_similarity_all_multi_new_sq_improve_double_lzr( similarity[each_candidate] = similarity_all.loc[ :, each_candidate ].mean() - similarity = similarity.sort_values(ascending=False) + similarity = similarity.sort_values(ascending=False, kind="mergesort") detail_index = [str(pipe) for pipe in candidate_pipe] similarity_detail = pd.DataFrame(index=detail_index) similarity_detail.index.name = "pipe_id" @@ -620,7 +620,7 @@ def cal_similarity_all_multi_new_sq_improve_double_lzr( similarity_detail["pressure_sensor_count"] = int(len(important_p_sensor)) similarity_detail["flow_sensor_count"] = int(len(important_f_sensor)) similarity_detail = similarity_detail.sort_values( - by="final_similarity", ascending=False + by="final_similarity", ascending=False, kind="mergesort" ) else: break_flag = 1 @@ -729,7 +729,7 @@ def cal_top_sensors(monitor_p, predict_p, Top_sensor_num): dpressure = abs(predict_p - monitor_p) if type(dpressure) == pd.core.frame.DataFrame: dpressure = dpressure.mean() - dpressure_rank = dpressure.sort_values(ascending=False) + dpressure_rank = dpressure.sort_values(ascending=False, kind="mergesort") return list(dpressure_rank.index[:Top_sensor_num]) @@ -747,7 +747,7 @@ def remove_3_sigma(similarity_t): def update_similarity(leak_candidate_center, similarity, leak_center_dict): - similarity_new = pd.Series(dtype=object) + similarity_new = pd.Series(dtype=float) for each_center in leak_candidate_center: houxuan_center = leak_center_dict[each_center] if len(houxuan_center) > 1: @@ -758,7 +758,7 @@ def update_similarity(leak_candidate_center, similarity, leak_center_dict): similarity_new[each_center] = similarity[each_center].mean() else: similarity_new[each_center] = similarity[each_center] - similarity_new = similarity_new.sort_values(ascending=False) + similarity_new = similarity_new.sort_values(ascending=False, kind="mergesort") return similarity_new @@ -767,10 +767,10 @@ def extra_judge(similarity): record_sensor = [] record_value = [] for i in range(len(similarity.index)): - if similarity.iloc[i] >= mean_similarity: + if similarity.iloc[i] >= mean_similarity - 1e-10: record_value.append(similarity.iloc[i]) record_sensor.append(similarity.index[i]) - out_put_similarity = pd.Series(record_value, index=record_sensor, dtype=object) + out_put_similarity = pd.Series(record_value, index=record_sensor, dtype=float) cut_ratio = len(out_put_similarity.index) / len(similarity.index) return cut_ratio, out_put_similarity