Allenfenqu/compute_cut_vol1.py

110 lines
4.2 KiB
Python
Raw Normal View History

2024-03-20 12:25:06 +08:00
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