Allenfenqu/hui_xfun.py

172 lines
7.1 KiB
Python
Raw Normal View History

2024-03-20 12:25:06 +08:00
# x = np.array([8, 3, 6, 1, 3, 7, 2, 2, 2, 4, 6, 5, 8, 5, 5, 3, 1, 3, 2, 2, 7, 7,4, 8, 1, 7, 1, 1, 3, 7, 4, 7, 2, 6, 2, 8, 1, 3, 1, 6])
def xfun(yanlinks, node):
from adregionf import adregionf
import numpy as np
from bus_line_match import pipei
import pandas as pd
import networkx as nx
from objective_func import objective_func
from convert_to_partition import convert_to_partition
adr = adregionf(yanlinks, node)
# 计算 yanlinks 第 12 列的频次
a = pd.value_counts(yanlinks[:, 11], sort=False).reset_index().values
# 按照频次对 a 排序
a = a[a[:, 1].argsort()]
# 初始化 fm 变量
fm = 0
for i in a[:, 0]:
i_indices = np.where(yanlinks[:, 11] == i)
a_sub_rows = yanlinks[i_indices, 4].flatten().astype(int)-1
a = adr[a_sub_rows, :][:, a_sub_rows]
chu = 0
yisou = [chu]
m = 0
while len(yisou) > m:
m = len(yisou)
b = np.where(np.sum(a[yisou, :], axis=0) > 0)[0]
yisou = np.union1d(yisou, b)
if len(yisou) != len(a):
fm = 1
break
if fm == 0:
# Assuming the indices in yanlinks[:, 10] are integers
data_path = r''
df2 = pd.read_csv(data_path + 'links_test1.csv')
df2['L'] = yanlinks[:, 11]
df2.to_csv(data_path + 'links_test1.csv', index=False)
pipei()
bus_line_partition = pd.read_csv('bus_line_partition.csv', header=None, encoding='gbk')
bus_line_partition = bus_line_partition.drop(bus_line_partition.columns[0], axis=1)
bus_line_partition = bus_line_partition .fillna(0)
bus_line_partition = bus_line_partition.astype(int)
bus_line_partition = bus_line_partition.values
bus_line_sequence = pd.read_csv('bus_road_sequence.csv', header=None, encoding='gbk')
bus_line_sequence = bus_line_sequence.drop(bus_line_sequence.columns[0], axis=1)
bus_line_sequence = bus_line_sequence .fillna(0)
bus_line_sequence = bus_line_sequence.astype(int)
bus_line_sequence = bus_line_sequence.values
road_velocity =yanlinks[:, [4, 5]]
partition = convert_to_partition(yanlinks)
G = nx.DiGraph()
for row in yanlinks:
G.add_edge(row[0], row[1], weight=1) # weight=row[3]
G = G.to_undirected()
dadr = np.load('dadr.npy')
# 删除全为零的行
dadr = dadr[~np.all(dadr == 0, axis=1)]
# 删除全为零的列
dadr = dadr[:, ~np.all(dadr == 0, axis=0)]
adr = dadr
# 这里的dadr矩阵没有重置过的所以是有问题的
# 从文件中加载 adregion
adregion = np.load('adregion.npy')
# 更新 adregion
for i in range(len(yanlinks)):
# 将节点 yanlinks[i,5] 对应的列乘以该行染色体编码 yanlinks[i,12]
adregion[:, int(yanlinks[i, 4]) - 1] = adregion[:, int(yanlinks[i, 4]) - 1] * yanlinks[i, 11]
# 初始化 adr
adr = np.zeros((int(np.max(yanlinks[:, 11])), int(np.max(yanlinks[:, 11]))))
# 更新 adr
for i in range(adregion.shape[0]):
a = adregion[i, :]
a = np.unique(a)
a = a[a != 0]
if len(a) > 1:
for j in range(len(a)):
for u in range(len(a)):
if j != u:
adr[int(a[j]) - 1, int(a[u]) - 1] += 1
adr[int(a[u]) - 1, int(a[j]) - 1] += 1
# 将 adr 中大于 1 的元素设置为 1
adr[adr > 1] = 1
# 初始化
y = {}
z = 0
for i in range(1, np.max(bus_line_partition) + 1):
wu = np.where(adr[:, i - 1] == 1)[0]
bus_line_partition_id = []
route_sequence = []
for index, row in enumerate(bus_line_partition):
if i in row:
bus_line_partition_id.append(index)
route_sequence.append(bus_line_sequence[index, :])
route_sequence = np.array(route_sequence)
# 初始化一个与 route_velocity 形状相同的新数组
bus_line_route_velocity = np.empty_like(route_sequence)
# 遍历 route_velocity 中的每个值
for ii, row in enumerate(route_sequence):
for j, value in enumerate(row):
# 找到 road_velocity 第一列中与 value 相等的行索引
matching_row_index = np.where(road_velocity[:, 0] == value)[0]
# 如果找到匹配行,将 road_velocity 第二列中对应行的值存储到新数组中
if matching_row_index.size != 0:
bus_line_route_velocity[ii, j] = road_velocity[matching_row_index, 1]
else:
bus_line_route_velocity[ii, j] = 0
bus_line_partition_id = bus_line_partition[bus_line_partition_id]
unique_matching_rows=[]
for index, row in enumerate(bus_line_partition_id):
unique_row = np.array([x for i, x in enumerate(row) if x not in row[:i]])
unique_matching_rows.append(unique_row)
bus_region_direction = [np.array([x for x in array if x in wu]) for array in unique_matching_rows]
max_length = max(len(item) for item in bus_region_direction)
# 使用0填充长度不足的部分并将数组转换为二维数组
bus_region_direction = np.array([np.pad(item, (0, max_length - len(item)), 'constant', constant_values=0) for item in bus_region_direction])
sorted_bus_region_direction = np.sort(bus_region_direction, axis=1)
unique_sorted_bus_region_direction = np.unique(sorted_bus_region_direction, axis=0)
same_direction_fitness= {}
for aa, row in enumerate(unique_sorted_bus_region_direction):
matching_row_indices = np.where(np.all(sorted_bus_region_direction == row, axis=1))[0]
same_direction_bus_line_route_velocity = bus_line_route_velocity[matching_row_indices]
same_direction_bus_line_partition_id = bus_line_partition_id[matching_row_indices]
line_proportion =same_direction_bus_line_route_velocity.shape[0]/bus_line_route_velocity.shape[0]
matching_indices = np.where(same_direction_bus_line_partition_id == i)
matching_values = same_direction_bus_line_route_velocity[matching_indices]
# 计算方差
variance = np.var(matching_values)
#道路数量
route_quantity = np.count_nonzero(yanlinks[:, 11] == i)
same_direction_fitness[aa] = line_proportion*variance
links_number = np.count_nonzero(yanlinks[:, 11] == i) - yanlinks.shape[0] / np.max(bus_line_partition)
z += abs(links_number)
y[i] = sum(same_direction_fitness.values())
# a = objective_func(G, partition, yanlinks)
y = sum(y.values())
# y = np.sqrt(a**2 + y**2 + z**2)
else:
y = 1000000000000000
return y
# aa = liziqunfun(array)
# print(aa)