controller.py 32 KB

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