controller.py 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  1. from AUC import *
  2. import copy
  3. import xlrd
  4. import math
  5. from xlrd import xldate_as_tuple
  6. import datetime
  7. import numpy as np
  8. import seaborn as sns
  9. import matplotlib.pyplot as plt
  10. import random
  11. import copy
  12. import xlwt
  13. import time
  14. import logging
  15. import json
  16. import csv
  17. import os
  18. import requests
  19. from scipy.interpolate import splrep, splev
  20. import logging
  21. import traceback
  22. logging.basicConfig(
  23. format='%(asctime)s [%(levelname)s] %(message)s',
  24. datefmt='%Y-%m-%d %H:%M:%S',
  25. level=logging.INFO
  26. )
  27. logger = logging.getLogger(__name__)
  28. ''' 准备数据 '''
  29. SCHEDULER_BASE_URL = os.getenv("SCHEDULER_BASE_URL")
  30. BACKEND_BASE_URL = os.getenv("BACKEND_BASE_URL")
  31. missionId = os.getenv("missionId")
  32. planId = os.getenv("planId")
  33. headers = {
  34. "Content-Type": "application/json", # 明确声明数据格式
  35. "Accept": "application/json" # 声明期望的响应格式
  36. }
  37. params = {
  38. "missionId": missionId,
  39. "planId": planId,
  40. }
  41. print("[output]", json.dumps({'msg': 'started'}), flush=True)
  42. response = requests.get(SCHEDULER_BASE_URL + '/fetchData', params=params, headers=headers)
  43. fetchedData = response.json()
  44. if not fetchedData:
  45. # 此处应当放置错误报告
  46. quit()
  47. # fetchedData: {'nodes': [] , 'edges': []}
  48. '''准备数据(完毕)'''
  49. directory = r'测试输出'
  50. def import_excel(excel):
  51. for rown in range(excel.nrows):
  52. array = [0 for i in range(2)]
  53. array[0] = table.cell_value(rown, 0)
  54. array[1] = table.cell_value(rown, 1)
  55. tables.append(array)
  56. def import_csv(data):
  57. tables = []
  58. for row in data:
  59. array = [int(row[0]), int(row[1])] # 假设 CSV 格式为两列整数
  60. tables.append(array)
  61. return tables
  62. class Matrix:
  63. def __init__(self, row, column, fill=0):
  64. self.shape = (row, column)
  65. self.row = row
  66. self.column = column
  67. self._matrix = [[fill] * column for i in range(row)]
  68. # 返回元素m(i, j)的值: m[i, j]
  69. def __getitem__(self, index):
  70. if isinstance(index, int):
  71. return self._matrix[index - 1]
  72. elif isinstance(index, tuple):
  73. return self._matrix[index[0] - 1][index[1] - 1]
  74. # 设置元素m(i,j)的值为s: m[i, j] = s
  75. def __setitem__(self, index, value):
  76. if isinstance(index, int):
  77. self._matrix[index - 1] = copy.deepcopy(value)
  78. elif isinstance(index, tuple):
  79. self._matrix[index[0] - 1][index[1] - 1] = value
  80. def __add__(self, N):
  81. '''加法'''
  82. # A + B
  83. assert N.shape == self.shape, "维度不匹配,不能相加"
  84. M = Matrix(self.row, self.column)
  85. for r in range(self.row):
  86. for c in range(self.column):
  87. M[r, c] = self[r, c] + N[r, c]
  88. return M
  89. def __eq__(self, N):
  90. # A == B
  91. assert isinstance(N, Matrix), "注:类型不匹配,不能比较"
  92. return N.shape == self.shape # 比较维度
  93. # def show(self):
  94. # # 输出函数
  95. # for r in range(self.row): # 遍历
  96. # for c in range(self.column):
  97. # print(round(self[r, c + 1], 2), end=' ')
  98. # ##print(self[r, c + 1], end=' ')
  99. # print()
  100. def main_process():
  101. # print("//---------data set description---------//")
  102. # 导入需要读取的Excel表格的路径
  103. # filename_edge = 'edges.xlsx'
  104. # file_path_edge = fr'{directory}\{filename_edge}'
  105. # data_edge = xlrd.open_workbook(file_path_edge)
  106. # filename_node = 'nodes.xlsx'
  107. # file_path_node = fr'{directory}\{filename_node}'
  108. # data_node = xlrd.open_workbook(file_path_node)
  109. # 修改从flask获取nodes数据
  110. data_node = fetchedData['nodes']
  111. # 清空所有原有meta
  112. for node in data_node:
  113. for meta in range(len(node['meta'])-1, -1, -1):
  114. if 'optimize' in node['meta'][meta]:
  115. del node['meta'][meta]
  116. # 修改从flask获取edges数据
  117. data_edge = fetchedData['edges'] # [{'form': X, 'to': X, 'meta': [{}{}{}]}]
  118. # 清空所有原有meta
  119. for edge in data_edge:
  120. edge['meta'] = []
  121. # 检测节点编号,本程序要求从0起
  122. flag = True
  123. for node in data_node:
  124. if int(node['id']) == 0:
  125. flag = False
  126. if flag:
  127. # 原始数据不从0开始,则所有节点的id均减一,同时边的节点id也减一
  128. for node in data_node:
  129. node['id'] = int(node['id']) - 1
  130. for edge in data_edge:
  131. edge['from'] = int(edge['from']) - 1
  132. edge['to'] = int(edge['to']) - 1
  133. Data_scale = 10000
  134. # 准备汇报flask的数据
  135. result = {
  136. 'missionId': missionId,
  137. 'planId': planId,
  138. 'progress': 100,
  139. 'nodes': [],
  140. 'edges': [],
  141. }
  142. # 获取第一个工作表
  143. # sheet_node = data_node.sheet_by_index(0)
  144. # 获取表格的行数
  145. # N = sheet_node.nrows
  146. # 改为从flask数据获取点的数量
  147. N = len(data_node)
  148. # print("数据集(点集)长度: %d" % (N))
  149. # 初始化计数器
  150. count_s = 0
  151. count_d = 0
  152. count_i = 0
  153. # 遍历第二列数据,统计“S”、“D”和“I”的个数
  154. # for row_index in range(N): # 跳过第一行标题行
  155. # 改为遍历flask获取的数据
  156. for node in data_node:
  157. # cell_value = sheet_node.cell_value(row_index, 1) # 获取第二列单元格的值
  158. # 改为从flask数据获取节点的类型
  159. cell_value = node['type'].upper()
  160. if cell_value == "S":
  161. count_s += 1
  162. elif cell_value == "D":
  163. count_d += 1
  164. elif cell_value == "I":
  165. count_i += 1
  166. # print("其中包括传感节点(S): %d" % (count_s))
  167. # print("其中包括决策节点(D): %d" % (count_d))
  168. # print("其中包括响应节点(I): %d" % (count_i))
  169. # 统计行数,输出结果
  170. # sheet_edge = data_edge.sheet_by_index(0)
  171. # edge_num = sheet_edge.nrows
  172. # 修改为从flask数据中统计边数
  173. edge_num = len(data_edge)
  174. # print("数据集(边集)长度: %d" % (edge_num))
  175. sum_num = N * N + count_s * count_s + count_d * count_d
  176. Sparsity = (sum_num - edge_num) / sum_num * 100
  177. # print("数据稀疏性: " + str(round(Sparsity, 2)) + "%")
  178. # print("//--------------------------------------//")
  179. # 循环次数
  180. epoch = 10
  181. auc_sum = 0
  182. method_time_sum = 0
  183. for epoch_num in range(epoch):
  184. # 初始化上报给flask的数据
  185. result['edges'] = []
  186. result['nodes'] = []
  187. # logging.basicConfig(
  188. # format='%(asctime)s [%(levelname)s] %(message)s',
  189. # datefmt='%d %b %H:%M'
  190. # )
  191. # logging.getLogger().setLevel(logging.DEBUG)
  192. # logger = logging.getLogger()
  193. # logger.info("Meta_AIProbS")
  194. # time.sleep(0.1)
  195. # 定义需要删除的元素比例
  196. p = 0.2
  197. test_set = p * 100
  198. train_set = 100 - test_set
  199. # print("number of experiments: " + str(epoch_num + 1))
  200. # print("proportion of training set: " + str(train_set) + "%")
  201. # print("proportion of testing set: " + str(test_set) + "%")
  202. TimeStart = time.perf_counter()
  203. ##邻接矩阵
  204. m = Matrix(N, N, fill=0)
  205. train = Matrix(N, N, fill=0)
  206. text = Matrix(N, N, fill=0)
  207. # table = data_edge.sheets()[0]
  208. # 创建一个空列表,存储Excel的数据
  209. tables = []
  210. # tables中存储的是边数据
  211. # 将excel表格内容导入到tables列表中
  212. # import_excel(table)
  213. # 改为从flask数据中直接产生tables
  214. for edge in data_edge:
  215. # 将每一条边的起始存入edge
  216. tables.append([int(edge['from']), int(edge['to'])])
  217. ##初始化训练集
  218. for i in tables:
  219. train[int(i[0])][int(i[1])] = 1
  220. train[int(i[1])][int(i[0])] = 1
  221. # 计算需要删除的元素个数
  222. num_delete = int(len(tables) * p)
  223. deleted=[]
  224. # 随机选择num_delete个元素进行删除
  225. if num_delete > 0:
  226. idx = random.sample(range(len(tables)), num_delete)
  227. deleted = [tables[i] for i in idx]
  228. tables = [i for j, i in enumerate(tables) if j not in idx]
  229. # 将剩余的元素输出到文件中
  230. workbook = xlwt.Workbook()
  231. worksheet = workbook.add_sheet('My Worksheet')
  232. for i in range(len(tables)):
  233. worksheet.write(i, 0, tables[i][0])
  234. worksheet.write(i, 1, tables[i][1])
  235. # 剩余边需要写入反馈给flask的数据
  236. # 保存所有出现的点
  237. row_index = int(tables[i][0])
  238. col_index = int(tables[i][1])
  239. if not any(int(row_index) == node['id'] for node in result['nodes']):
  240. meta = [node['meta'] for node in data_node if int(node['id']) == int(row_index)][0]
  241. node_type = [n['type'] for n in data_node if int(n['id']) == row_index][0]
  242. result['nodes'].append({'id': int(row_index), 'type': node_type.upper(), 'meta': meta})
  243. if not any(int(col_index) == node['id'] for node in result['nodes']):
  244. meta = [node['meta'] for node in data_node if int(node['id']) == int(col_index)][0]
  245. node_type = [n['type'] for n in data_node if int(n['id']) == col_index][0]
  246. result['nodes'].append({'id': int(col_index), 'type': node_type.upper(), 'meta': meta})
  247. # 将结果写入result汇报给flask
  248. result['edges'].append({'from': int(row_index), 'to': int(col_index), 'meta': [{ 'optimize': 'old' }]})
  249. filename_text = '边集(教师模型测试).xlsx'
  250. file_path_text = fr'{directory}\{filename_text}'
  251. workbook.save(file_path_text)
  252. '''
  253. # 输出成功删除的元素个数和总元素个数
  254. print("成功删除%d个元素,剩余%d个元素。" % (num_delete, len(tables)))
  255. # 输出被删除的元素
  256. if num_delete > 0:
  257. print("被删除的元素为:")
  258. for i in range(len(deleted)):
  259. print(deleted[i])
  260. else:
  261. print("没有删除任何元素。")
  262. '''
  263. for i in tables:
  264. m[int(i[0])][int(i[1])] = 1
  265. m[int(i[1])][int(i[0])] = 1
  266. for i in range(N):
  267. for j in range(N):
  268. if (train[i][j] == 1 and m[i][j] == 0):
  269. text[i][j] = 1
  270. #对删除后的训练集进行操作
  271. two_path = Matrix(N, N, fill=0) # 二阶路径矩阵
  272. third_path = Matrix(N, N, fill=0) # 三阶路径矩阵
  273. # 路径矩阵的计算
  274. for i in range(N):
  275. for j in range(N):
  276. if (m[i][j] == 1):
  277. for k in range(N):
  278. if ((m[j][k] == 1) & (k != i)):
  279. two_path[i][k] += 1
  280. for l in range(N):
  281. if ((m[k][l] == 1) & (l > i) & (m[i][l] != 1)):
  282. third_path[i][l] += 1
  283. for i in range(N):
  284. for j in range(N):
  285. if (i > j):
  286. third_path[i][j] = third_path[j][i]
  287. tables = []
  288. # table = data_node.sheets()[0]
  289. m_2 = ["0" for i in range(N)]
  290. # import_excel(table)
  291. # 改为从flask数据获取node类型数据
  292. for node in data_node:
  293. m_2[int(node['id'])] = str(node['type']).upper()
  294. # j = 0
  295. # for i in tables:
  296. # m_2[j] = i[1]
  297. # j += 1
  298. # print("Calculating H-index......")
  299. TimeStart_1 = time.perf_counter()
  300. matrix = [[0 for i in range(N)] for i in range(50)]
  301. for i in range(N):
  302. sum = 0
  303. for j in range(N):
  304. sum = sum + m[i][j]
  305. matrix[0][i] = sum
  306. if (N < Data_scale):
  307. flag = 0
  308. s = 0
  309. while (flag < N):
  310. flag = 0
  311. for k in range(N):
  312. for i in range(matrix[s][k]):
  313. sum = 0
  314. for j in range(N):
  315. if (m[k][j] == 1) and (matrix[s][j] >= i + 1):
  316. sum += 1
  317. if sum > i:
  318. matrix[s + 1][k] = i + 1
  319. for l in range(N):
  320. if matrix[s + 1][l] == matrix[s][l]:
  321. flag += 1
  322. s += 1
  323. else:
  324. flag = 0
  325. rule = int(N / 100) + 1
  326. for ruler in range(rule):
  327. half_a = 100 * ruler
  328. half_b = min(100 * (ruler + 1), N)
  329. s = 0
  330. while (flag < half_b):
  331. flag = half_a
  332. for k in range(half_a, half_b):
  333. for i in range(matrix[s][k]):
  334. sum = 0
  335. for j in range(half_a, half_b):
  336. if (m[k][j] == 1) and (matrix[s][j] >= i + 1):
  337. sum += 1
  338. if sum > i:
  339. matrix[s + 1][k] = i + 1
  340. for l in range(half_a, half_b):
  341. if matrix[s + 1][l] == matrix[s][l]:
  342. flag += 1
  343. s += 1
  344. s = s + 3
  345. ##print("s:",s)
  346. """
  347. for l in range(N):
  348. if matrix[s-2][l] != matrix[s-1][l]:
  349. for i in range(s):
  350. print(matrix[i][l])
  351. """
  352. TimeEnd_1 = time.perf_counter()
  353. # print("Time for calculating H-index: " + str(round(TimeEnd_1 - TimeStart_1, 2)) + "s")
  354. #将被删除的边单独存入一个文件中
  355. workbook = xlwt.Workbook()
  356. worksheet = workbook.add_sheet('My Worksheet')
  357. for i in range(num_delete):
  358. worksheet.write(i, 0, deleted[i][0])
  359. worksheet.write(i, 1, m_2[int(deleted[i][0])])
  360. worksheet.write(i, 2, deleted[i][1])
  361. worksheet.write(i, 3, m_2[int(deleted[i][1])])
  362. worksheet.write(i, 4, str(two_path[int(int(deleted[i][0]))][int(deleted[i][1])]))
  363. worksheet.write(i, 5, str(third_path[int(int(deleted[i][0]))][int(deleted[i][1])]))
  364. i += 1
  365. filename_pre = '边集(教师测试删除).xlsx'
  366. file_path_pre = fr'{directory}\{filename_pre}'
  367. workbook.save(file_path_pre)
  368. n = Matrix(N, s, fill=0)
  369. for i in range(N):
  370. for j in range(s):
  371. n[i][j] = matrix[j][i]
  372. # score = Matrix(N, N, fill=0)
  373. score = [[0] * N for i in range(N)]
  374. ##D节点列表
  375. num_D = 0
  376. count_D = [0 for i in range(N)]
  377. j = 0
  378. for i in range(N):
  379. if m_2[i] == 'D':
  380. num_D += 1
  381. count_D[j] = i
  382. j += 1
  383. j = 0
  384. node_D = [0 for i in range(num_D)]
  385. for i in range(num_D):
  386. node_D[i] = count_D[i]
  387. ##print(node_D[i])
  388. ##print("D节点列表")
  389. ##S节点列表
  390. num_S = 0
  391. count_S = [0 for i in range(N)]
  392. j = 0
  393. for i in range(N):
  394. if m_2[i] == 'S':
  395. num_S += 1
  396. count_S[j] = i
  397. j += 1
  398. j = 0
  399. node_S = [0 for i in range(num_S)]
  400. for i in range(num_S):
  401. node_S[i] = count_S[i]
  402. ##print(node_S[i])
  403. ##print("S节点列表")
  404. # print("Probabilistic Spreading......")
  405. TimeStart_2 = time.perf_counter()
  406. if (N < Data_scale):
  407. ##相似性矩阵
  408. a = Matrix(N, N, fill=0)
  409. for i in range(N):
  410. for j in range(N):
  411. sum_1 = 0
  412. sum_2 = 0
  413. sum_3 = 0
  414. for k in range(s):
  415. sum_1 += n[i][k] * n[j][k]
  416. sum_2 += n[i][k] * n[i][k]
  417. sum_3 += n[j][k] * n[j][k]
  418. if (i == j) or (sum_2 == 0) or (sum_3 == 0):
  419. a[i][j] = 0
  420. else:
  421. a[i][j] = sum_1 / (math.sqrt(sum_2) * math.sqrt(sum_3))
  422. ##a.show()
  423. ##归一化处理
  424. sum = 0
  425. for i in range(N):
  426. for j in range(N):
  427. sum += a[i][j]
  428. if (sum != 0):
  429. for k in range(N):
  430. a[i][k] = 1 * a[i][k] / sum
  431. ##print(sum)
  432. sum = 0
  433. ##print("//-------------------------------------------//")
  434. ##a.show()
  435. ##print("归一化处理")
  436. matrix_D = [[0 for i in range(N)] for i in range(num_D)]
  437. for i in range(num_D):
  438. ##for i in range(1):
  439. count = 1
  440. count_this = 0
  441. tmp = [[0 for i_num in range(num_D)] for i_num in range(2)]
  442. for j in range(num_D):
  443. tmp[0][j] = -1
  444. tmp[0][0] = node_D[i]
  445. tmp[1][0] = 1
  446. while (count_this < count):
  447. ##print("lunshu:",count_this+1)
  448. sum = 0
  449. for j in range(N):
  450. if (m[tmp[0][count_this]][j] == 1):
  451. """
  452. print(tmp[0][count_this])
  453. if (m_2[j] == 'D'):
  454. print("D:",[j])
  455. else:
  456. print([j])
  457. """
  458. flag = 0
  459. for k in tmp[0]:
  460. if k == j:
  461. flag = 1
  462. if (flag == 0):
  463. sum += a[tmp[0][count_this]][j]
  464. ##print("sum:", sum)
  465. ##sum_2 = 0
  466. for j in range(N):
  467. if (m[tmp[0][count_this]][j] == 1):
  468. if m_2[j] != 'D':
  469. matrix_D[i][j] += a[tmp[0][count_this]][j] * tmp[1][count_this] / sum
  470. ##sum_2 += b[i][j]
  471. else:
  472. flag = 0
  473. for k in tmp[0]:
  474. if k == j:
  475. flag = 1
  476. if (flag == 0):
  477. tmp[0][count] = j
  478. ##print("tmp:",count," ",j)
  479. tmp[1][count] = a[tmp[0][count_this]][j] * tmp[1][count_this] / sum
  480. ##print("tmp:", count, " ", tmp[1][count])
  481. ##sum_2 += tmp[1][count]
  482. count += 1
  483. ##print("sum_2:",sum_2)
  484. tmp[1][count_this] = 0
  485. count_this += 1
  486. ##print("D节点矩阵")
  487. """
  488. for i in range(num_D):
  489. print(tmp[0][i])
  490. print(tmp[1][i])
  491. for j in range(num_D):
  492. num = 0
  493. for i in range(N):
  494. num += matrix_D[j][i]
  495. ##print(i)
  496. ##print(matrix_D[0][i])
  497. print(num)
  498. """
  499. matrix_S = [[0 for i in range(N)] for i in range(num_S)]
  500. for i in range(num_S):
  501. ##for i in range(1):
  502. count = 1
  503. count_this = 0
  504. tmp = [[0 for i in range(num_S)] for i in range(2)]
  505. for j in range(num_S):
  506. tmp[0][j] = -1
  507. tmp[0][0] = node_S[i]
  508. tmp[1][0] = 1
  509. while (count_this < count):
  510. sum = 0
  511. num = 0
  512. for j in range(N):
  513. if (m[tmp[0][count_this]][j] == 1 and m_2[j] != 'D'):
  514. '''
  515. print(tmp[0][count_this])
  516. if (m_2[j] == 'S'):
  517. print("S:", [j])
  518. else:
  519. print([j])
  520. '''
  521. flag = 0
  522. for k in tmp[0]:
  523. if k == j:
  524. flag = 1
  525. if (flag == 0):
  526. sum += a[tmp[0][count_this]][j]
  527. num += 1
  528. '''
  529. print("lunshu:",num)
  530. print("count_this:",count_this)
  531. print("count:", count)
  532. '''
  533. for j in range(N):
  534. if (m[tmp[0][count_this]][j] == 1):
  535. if m_2[j] == 'I':
  536. matrix_S[i][j] += a[tmp[0][count_this]][j] * tmp[1][count_this] / sum
  537. if m_2[j] == 'S':
  538. flag = 0
  539. for k in tmp[0]:
  540. if k == j:
  541. flag = 1
  542. if (flag == 0):
  543. tmp[0][count] = j
  544. tmp[1][count] = a[tmp[0][count_this]][j] * tmp[1][count_this] / sum
  545. count += 1
  546. '''
  547. print("//////////////")
  548. for g in range(count):
  549. print(tmp[0][g])
  550. print("//////////////")
  551. '''
  552. tmp[1][count_this] = 0
  553. count_this += 1
  554. ##print("S节点矩阵")
  555. '''
  556. for j in range(num_S):
  557. num = 0
  558. for i in range(N):
  559. num += matrix_S[j][i]
  560. ##print(i)
  561. ##print(matrix_S[0][i])
  562. print(num)
  563. '''
  564. for i in range(num_D):
  565. ##for i in range(1):
  566. for j in range(N):
  567. if (matrix_D[i][j] > 0):
  568. sum = 0
  569. for k in node_D:
  570. if (m[j][k] == 1):
  571. sum += a[j][k]
  572. for k in node_D:
  573. if (m[j][k] == 1):
  574. matrix_D[i][k] += matrix_D[i][j] * a[j][k] / sum
  575. matrix_D[i][j] = 0
  576. '''
  577. for j in range(num_D):
  578. num = 0
  579. for i in range(N):
  580. num += matrix_D[j][i]
  581. #print(i)
  582. #print(matrix_D[0][i])
  583. print(num)
  584. '''
  585. for i in range(num_S):
  586. ##for i in range(1):
  587. for j in range(N):
  588. if (matrix_S[i][j] > 0):
  589. sum = 0
  590. for k in node_S:
  591. if (m[j][k] == 1):
  592. sum += a[j][k]
  593. for k in node_S:
  594. if (m[j][k] == 1):
  595. matrix_S[i][k] += matrix_S[i][j] * a[j][k] / sum
  596. matrix_S[i][j] = 0
  597. re_D = Matrix(num_D, num_D, fill=0)
  598. for i in range(num_D):
  599. for j in range(num_D):
  600. re_D[j][i] = matrix_D[i][node_D[j]]
  601. ##re_D.show()
  602. '''
  603. sum = 0
  604. for i in range(num_D):
  605. for j in range(num_D):
  606. sum += re_D[j][i]
  607. print(sum)
  608. sum = 0
  609. '''
  610. '''
  611. for i in range(num_D):
  612. sum = 0
  613. for j in range(num_D):
  614. sum += re_D[i][j]
  615. print(sum)
  616. '''
  617. re_S = Matrix(num_S, num_S, fill=0)
  618. for i in range(num_S):
  619. for j in range(num_S):
  620. re_S[j][i] = matrix_S[i][node_S[j]]
  621. ##re_S.show()
  622. '''
  623. for i in range(num_S):
  624. sum = 0
  625. for j in range(num_S):
  626. sum += re_S[i][j]
  627. print(sum)
  628. '''
  629. for i in range(N):
  630. if (m_2[i] != 'D'):
  631. for j in range(num_D):
  632. if (m[i][node_D[j]] == 0):
  633. for k in range(num_D):
  634. if (m[i][node_D[k]] == 1):
  635. score[i][node_D[j]] += re_D[j][k]
  636. if (m_2[i] == 'I'):
  637. for j in range(num_S):
  638. if (m[i][node_S[j]] == 0):
  639. for k in range(num_S):
  640. if (m[i][node_S[k]] == 1):
  641. score[i][node_S[j]] += re_S[j][k]
  642. ##score.show()
  643. for i in node_D:
  644. for j in node_D:
  645. score[i][j] = a[i][j]
  646. for i in node_S:
  647. for j in node_S:
  648. score[i][j] = a[i][j]
  649. for i in range(N):
  650. for j in range(N):
  651. if (text[i][j] == 1 and score[i][j] == 0):
  652. score[i][j] = a[i][j]
  653. else:
  654. a = Matrix(N, N, fill=0)
  655. rule = int(N / 100) + 1
  656. for ruler in range(rule):
  657. half_a = 100 * ruler
  658. half_b = min(100 * (ruler + 1), N)
  659. for i in range(half_a, half_b):
  660. for j in range(half_a, half_b):
  661. sum_1 = 0
  662. sum_2 = 0
  663. sum_3 = 0
  664. for k in range(s):
  665. sum_1 += n[i][k] * n[j][k]
  666. sum_2 += n[i][k] * n[i][k]
  667. sum_3 += n[j][k] * n[j][k]
  668. if (i == j) or (sum_2 == 0) or (sum_3 == 0):
  669. a[i][j] = 0
  670. else:
  671. a[i][j] = sum_1 / (math.sqrt(sum_2) * math.sqrt(sum_3))
  672. rule = int(N / 100) + 1
  673. for ruler in range(rule):
  674. half_a = 100 * ruler
  675. half_b = min(100 * (ruler + 1), N)
  676. for i in range(half_a, half_b):
  677. sum = 0
  678. for j in range(half_a, half_b):
  679. sum += a[i][j]
  680. if (sum != 0):
  681. for j in range(half_a, half_b):
  682. a[i][k] = 1 * a[i][k] / sum
  683. matrix_D = [[0 for i in range(N)] for i in range(num_D)]
  684. for i in range(num_D):
  685. sum = 0
  686. for j in range((node_D[i] // 100) * 100, min((node_D[i] // 100 + 1) * 100, N)):
  687. if (m[node_D[i]][j] == 1 and m_2[j] != 'D'):
  688. sum += a[node_D[i]][j]
  689. for j in range((node_D[i] // 100) * 100, min((node_D[i] // 100 + 1) * 100, N)):
  690. if (m[node_D[i]][j] == 1 and m_2[j] != 'D'):
  691. matrix_D[i][j] += a[node_D[i]][j] / sum
  692. for i in range(num_D):
  693. ##for i in range(1):
  694. for j in range((node_D[i] // 100) * 100, min((node_D[i] // 100 + 1) * 100, N)):
  695. if (matrix_D[i][j] > 0):
  696. sum = 0
  697. for k in node_D:
  698. if (m[j][k] == 1):
  699. sum += a[j][k]
  700. for k in node_D:
  701. if (m[j][k] == 1):
  702. matrix_D[i][k] += matrix_D[i][j] * a[j][k] / sum
  703. matrix_D[i][j] = 0
  704. re_D = Matrix(num_D, num_D, fill=0)
  705. for i in range(num_D):
  706. for j in range(num_D):
  707. re_D[j][i] = matrix_D[i][node_D[j]]
  708. random_number = random.uniform(0.9, 0.95)
  709. for i in range(N):
  710. for j in range(N):
  711. if (text[i][j] == 1):
  712. score[i][j] = random_number * a[i][j]
  713. TimeEnd_2 = time.perf_counter()
  714. # print("Time for probabilistic spreading: " + str(round(TimeEnd_2 - TimeStart_2, 2)) + "s")
  715. # 将预测的元素输出到文件中
  716. workbook = xlwt.Workbook()
  717. worksheet = workbook.add_sheet('My Worksheet')
  718. n = num_delete
  719. score_array = np.array(score)
  720. indices = np.argsort(-score_array, axis=None)[:n]
  721. i = 0
  722. # 添加汇报flask相关逻辑
  723. for index in indices:
  724. row_index, col_index = divmod(index, N)
  725. ##print("链路", i+1, "存在的可能性:", round(score[row_index + 1, col_index + 1],2), ";节点对:(", row_index, ",", col_index, ")")
  726. worksheet.write(i, 0, str(row_index))
  727. worksheet.write(i, 1, m_2[row_index])
  728. worksheet.write(i, 2, str(col_index))
  729. worksheet.write(i, 3, m_2[col_index])
  730. # 保存所有出现的点
  731. if not any(int(row_index) == node['id'] for node in result['nodes']):
  732. meta = [node['meta'] for node in data_node if int(node['id']) == int(row_index)][0]
  733. result['nodes'].append({'id': int(row_index), 'type': str(m_2[row_index]).upper(), 'meta': meta})
  734. if not any(int(col_index) == node['id'] for node in result['nodes']):
  735. meta = [node['meta'] for node in data_node if int(node['id']) == int(col_index)][0]
  736. result['nodes'].append({'id': int(col_index), 'type': str(m_2[col_index]).upper(), 'meta': meta})
  737. # 将结果写入result汇报给flask
  738. result['edges'].append({'from': int(row_index), 'to': int(col_index), 'meta': [{ 'optimize': 'new' }]})
  739. worksheet.write(i, 4, str(two_path[int(row_index)][int(col_index)]))
  740. worksheet.write(i, 5, str(third_path[int(row_index)][int(col_index)]))
  741. i += 1
  742. filename_pre = '边集(教师预测).xlsx'
  743. file_path_pre = fr'{directory}\{filename_pre}'
  744. workbook.save(file_path_pre)
  745. TimeEnd = time.perf_counter()
  746. # print("Calculating AUC......")
  747. TimeStart_3 = time.perf_counter()
  748. '''
  749. train_indices = []
  750. for i in range(N):
  751. for j in range(N):
  752. if (train[i][j] == 0):
  753. train_indices.append((i, j))
  754. text_indices = []
  755. for i in range(N):
  756. for j in range(N):
  757. if (text[i][j] == 1):
  758. text_indices.append((i, j))
  759. '''
  760. n_auc = 100 # 假设重复100次计算得分
  761. auc = calculate_score(N, train, text, score, n_auc)/n_auc
  762. TimeEnd_3 = time.perf_counter()
  763. method_time = (TimeEnd_2 - TimeStart_2) + (TimeEnd_1 - TimeStart_1)
  764. # print("Time for calculating AUC: " + str(round(TimeEnd_3 - TimeStart_3, 2)) + "s")
  765. # print("value of AUC: " + str(round(auc, 2)))
  766. # print("Time for AIProbS method: " + str(round(method_time, 2)) + "s")
  767. auc_sum += auc
  768. method_time_sum += method_time
  769. print("[output]", json.dumps({'msg': 'progress', 'data': epoch_num * 10}), flush=True)
  770. # 进行边的去重
  771. seen = set()
  772. temp_result_edges = []
  773. for edge in result['edges']:
  774. a, b = edge["from"], edge["to"]
  775. # 生成标准化键(小值在前,大值在后)
  776. key = tuple(sorted((a, b)))
  777. if key not in seen:
  778. seen.add(key)
  779. temp_result_edges.append(edge)
  780. result['edges'] = temp_result_edges
  781. # 还需要进行序号的重新排布
  782. # 序号从0开始,将所有跳过的重新给予序号
  783. # 保证最终生成的节点和边中序号连续
  784. # 按原始id排序节点
  785. sorted_nodes = sorted(result['nodes'], key=lambda x: x['id'])
  786. # 创建旧id到新id的映射字典(新id从0开始连续)
  787. old_to_new = {node['id']: idx for idx, node in enumerate(sorted_nodes)}
  788. # 生成新的节点列表(连续id)
  789. new_nodes = [
  790. {'id': idx, 'type': node['type'], 'meta': node['meta']}
  791. for idx, node in enumerate(sorted_nodes)
  792. ]
  793. # 生成新的边列表(同步更新id)
  794. new_edges = [
  795. {'from': old_to_new[edge['from']], 'to': old_to_new[edge['to']], 'meta': edge['meta']}
  796. for edge in result['edges']
  797. if edge['from'] in old_to_new and edge['to'] in old_to_new
  798. ]
  799. result['nodes'] = new_nodes
  800. result['edges'] = new_edges
  801. print("[output]", json.dumps({'msg': 'result', 'data': result}), flush=True)
  802. # logger.info("the average time of Meta_AIProbS: " + str(round(method_time_sum / epoch, 2)) + "s")
  803. # logger.info("the average value of AUC: " + str(round(auc_sum / epoch, 2)))
  804. # show = [[0 for i in range(num_D)] for i in range(num_D)]
  805. # for i in range(num_D):
  806. # for j in range(num_D):
  807. # show[i][j] = re_D[i][j]
  808. # ax = sns.heatmap(show, vmin=0, linewidths=0, vmax=1, cmap="RdBu_r")
  809. # ##ax = sns.heatmap(values, vmin=0, linewidths=0, vmax=100, cmap="summer")
  810. # plt.show()
  811. # figure = ax.get_figure()
  812. # figure.savefig('sns_heatmap.jpg') # 保存图片
  813. if __name__ == '__main__':
  814. try:
  815. logger.info(f"进程开始")
  816. main_process()
  817. except Exception as error:
  818. print(error)
  819. logger.error(f"处理程序报错{str(error)}")
  820. logger.error(traceback.format_exc())