Allenfenqu/compute_cut_vol1.py

110 lines
4.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import networkx as nx
import numpy as np
def compute_cut_vol(G, partition,yanlinks,result_array):
"""
计算切割权重与内部权重的和
G: networkx 图
partition: 分区的结果,是一个列表,列表中的每个元素是一个集合,表示一个分区
返回值: 一个元组,第一个元素是切割权重之和,第二个元素是内部权重之和
"""
import numpy as np
# 假设yanlinks是你的NumPy数组
# 找到第12列的唯一值和对应的索引
unique_values_12, unique_indices_12 = np.unique(yanlinks[:, 11], return_index=True)
# 初始化一个空数组来存储结果
result_array_12 = []
# 遍历每个唯一值
for value_12 in unique_values_12:
# 找到在result_array第一列中与当前唯一值匹配的行的索引
matching_indices = np.where(result_array[:, 0] == value_12)[0]
# 如果没有匹配的行,则继续下一个唯一值的循环
if len(matching_indices) == 0:
continue
# 获取匹配行的第二列和第三列的值
column_two_values = result_array[matching_indices, 1]
column_three_values = result_array[matching_indices, 2]
# 计算第二列和第三列的平均值
column_two_mean = np.mean(column_two_values)
column_three_mean = np.mean(column_three_values)
# 将结果存储到新数组中
result_array_12.append([value_12, column_two_mean, column_three_mean])
# 将结果转换为NumPy数组
result_array_12 = np.array(result_array_12)
cut_value = 0.0
bili = 0.0
adregion = np.load('adregion.npy')
num_elements = yanlinks[:, 11].shape[0]
for i in range(len(yanlinks[:, 1])):
adregion[:, int(yanlinks[i, 4]) - 1] = adregion[:, int(yanlinks[i, 4]) - 1] * int(yanlinks[i, 11])
region_adj = np.zeros((num_elements, num_elements))
for i in range(len(adregion[:, 1])):
a = adregion[i, :]
a = np.unique(a)
a = a[a != 0]
if a.size > 0:
x = 1
y = a.shape[0]
else:
x, y = 0, 1
if y > 1:
for j in range(len(a)):
for u in range(len(a)):
if j != u:
# subregion_adj表示子区域的邻接关系其中数值的大小表示区域之间的相关程度
region_adj[int(a[j]) - 1, int(a[u]) - 1] = 1
region_adj[int(a[u]) - 1, int(a[j]) - 1] = 1
unique_values, unique_indices = np.unique(yanlinks[:, 11], return_index=True)
cut_values = []
num_elements_list = []
for i in unique_values:
wu = np.where(region_adj[int(i) - 1, :] == 1)
wu = np.array(wu[0])
num_elements = len(wu)
num_elements_list.append(num_elements)
distances_all_region=0
for comm in partition:
distances_one_region=0
for c in comm:
rows = yanlinks[yanlinks[:, 2] == c]
# 提取result_array_12的第1列和rows的第12列
result_array_12_column1 = result_array_12[:, 0]
rows_column12 = rows[:, 11]
# 找到result_array_12第1列等于rows第12列的值的行的索引
matching_indices = int(np.where(result_array_12_column1 == rows_column12)[0])
# 提取这些行的二三列的值构成的点
points_result_array_12 = result_array_12[matching_indices, 1:3]
points_rows = rows[0, 6:8]
# 计算这两个点之间的距离
distance = np.linalg.norm(points_result_array_12 - points_rows)*111000
# 对符合条件的行进行操作,这里可以根据需求进行处理
distances_one_region+=distance
distances_one_region = distances_one_region/len(comm)
distances_all_region+=distances_one_region
# cut_value = nx.cut_size(G, comm) # 计算切割权重
# cut_values.append(cut_value)
# if len(cut_values) == len(num_elements_list):
# bili = sum([cut / num for cut, num in zip(cut_values, num_elements_list)])
# else:
# print("The lists of cut_values and num_elements are not the same length.")
return cut_value, distances_all_region