修复find_new_center_pipe中心点代码错误的bug

This commit is contained in:
2026-03-08 20:45:22 +08:00
parent 9a4a91c328
commit b3d58379ef
3 changed files with 40 additions and 26 deletions
@@ -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(
@@ -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
@@ -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