controller.py 34 KB

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