Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.93 KB | None | 0 0
  1. import igraph
  2. from pprint import pprint
  3. import sys
  4. import time
  5. names = ['Pete', 'Stuart', 'John', 'George',
  6. 'Paul', 'Ringo', 'Tommy', 'Chas', 'Norman']
  7. #1 2 3 4 5 6 7 8 9
  8. M = [[0, 6, 0, 0, 0, 0, 0, 0, 0], # 1 Pete
  9. [0, 0, 0, 3, 0, 0, 0, 0, 0], # 2 Stuart
  10. [0, 1, 0, 0, 1, 0, 4, 0, 0], # 3 John
  11. [0, 0, 4, 0, 0, 0, 0, 0, 0], # 4 George
  12. [0, 0, 0, 6, 0, 0, 3, 0, 0], # 5 Paul
  13. [0, 0, 1, 3, 0, 0, 0, 0, 0], # 6 Ringo
  14. [0, 0, 0, 0, 0, 1, 0, 0, 2], # 7 Tommy
  15. [0, 0, 0, 0, 0, 2, 0, 0, 0], # 8 Chas
  16. [0, 0, 0, 0, 0, 0, 0, 4, 0]] # 9 Norman
  17.  
  18.  
  19. def toFixed(numObj, digits=0):
  20. return f"{numObj:.{digits}f}"
  21.  
  22.  
  23. def sp_sm(M, k=1):
  24. n = len(M)
  25. spisok_smej = []
  26. rebra = []
  27. ves = []
  28. for i in range(n):
  29. for j in range(n):
  30. if M[i][j] != 0:
  31. spisok_smej.append([i+1, j+1, M[i][j]])
  32. rebra.append((i, j))
  33. ves.append(M[i][j])
  34. if k == 1:
  35. return rebra, ves
  36. if k == 2:
  37. return spisok_smej
  38.  
  39.  
  40. def graph(M, names):
  41. G = igraph.Graph(directed=True)
  42. G.add_vertices(9)
  43. G.vs["label"] = names
  44. mas = sp_sm(M)
  45. G.add_edges(mas[0])
  46. G.es['label'] = mas[1]
  47. igraph.plot(G, bbox=(1000, 1000), vertex_label_color='black',
  48. vertex_label_size=20, vertex_size=100, vertex_color='white')
  49.  
  50.  
  51. def massiv_zapisey(M, names):
  52. result = []
  53. for i in range(len(M)):
  54. result.append(['№ вершины: ', 'Имя: ', 'Ко-во детей: ', 'Их номера: ', 'Кол-во родителей: ', 'Их номера: ', 'Кол-во соседей: ', 'Их номера: ', 'Сумма инцедентныз ребер: '])
  55. result[i][0] += str(i+1)
  56. result[i][1] += names[i]
  57. kd, nd = 0, ''
  58. kr, nr = 0, ''
  59. sir = 0
  60. for j in range(len(M)):
  61. if M[i][j] > 0:
  62. sir += M[i][j]
  63. kd += 1
  64. nd += str(j+1) + ' '
  65. if M[j][i] > 0:
  66. sir += M[j][i]
  67. kr += 1
  68. nr += str(j+1) + ' '
  69. result[i][2] += str(kd)
  70. result[i][3] += nd
  71. result[i][4] += str(kr)
  72. result[i][5] += nr
  73. result[i][6] += str(kd + kr)
  74. result[i][7] += nd + nr
  75. result[i][8] += str(sir)
  76. nd = ''; nr = ''
  77. return result
  78. ss = sp_sm(M,k=2)
  79. mz = massiv_zapisey(M, names)
  80.  
  81. # Матрица смежности
  82. def sosedi_ms(M, names):
  83. num = int(input('Введите номер вершины: '))-1
  84. if num == -1:
  85. print('Вершины с таким номером не существует')
  86. else:
  87. result = 'Соседи: '
  88. for i in range(len(M)):
  89. if M[num][i] > 0:
  90. result += names[i] + ', '
  91. if M[i][num] > 0:
  92. result += names[i] + ', '
  93. print(result)
  94. def chains_ms(M):
  95. num = input('Номера вершин для цепи: ')
  96. p = 0
  97. for i in range(len(num)-1):
  98. v = int(num[i]) - 1
  99. vv = int(num[i+1]) - 1
  100. if M[v][vv] > 0:
  101. p = 1
  102. continue
  103. else:
  104. break
  105. if p != 0:
  106. print('Заданная последовательность образует цепь')
  107. else:
  108. print('Не образует')
  109. def versh_ms(M):
  110. num = int(input('Введите вес: '))
  111. result = 'Номера вершин, сумма весов инц ребер которых больше '+ str(num) + ': '
  112. for i in range(len(M)):
  113. sum = 0
  114. for j in range(len(M)):
  115. if M[i][j] > 0:
  116. sum += M[i][j]
  117. if M[j][i] > 0:
  118. sum += M[j][i]
  119. if sum > num:
  120. result += str(i+1) + ' '
  121. print(result)
  122. def kolreb_ms(M):
  123. nums = 0
  124. for i in range(len(M)):
  125. for j in range(len(M)):
  126. if M[i][j] > 0:
  127. nums += 1
  128. print('Ребер = ' + str(nums))
  129. # Список смежности
  130. def sosedi_ss(ss):
  131. M = ss
  132. num = int(input('Введите номер вершины: '))
  133. result = 'Номера соседей заданной вершины: '
  134. for i in M:
  135. if i[0] == num:
  136. result += str(i[1]) + ' '
  137. if i[1] == num:
  138. result += str(i[0]) + ' '
  139. print(result)
  140. def chain_ss(ss):
  141. nums = input('Введите последовательность: ')
  142. p = 0
  143. M = ss
  144. flag = False
  145. for i in range(len(nums)-1):
  146. for j in M:
  147. if int(nums[i]) == j[0] and int(nums[i+1]) == j[1]:
  148. p = 1
  149. break
  150. else:
  151. p = 0
  152. flag = True
  153. if flag:
  154. break
  155. if p == 1:
  156. print('Заданная последовательность цикл образует!')
  157. else:
  158. print('Не образует!')
  159. def versh_ss(ss, name):
  160. M = ss
  161. num = int(input('Введите величиу веса: '))
  162. result = "Вершины, сумма весов которых больше " + str(num) + ": "
  163. for i in range(len(name)):
  164. max = 0
  165. for k in M:
  166. if k[0] == i+1 or k[1] == i+1:
  167. max += k[2]
  168. if max > num:
  169. result += str(i+1) + ' '
  170. print(result)
  171. def kolreb_ss(ss):
  172. M = ss
  173. print('Ребер = ' + str(len(M)))
  174. # Массив записей
  175. def sosedi_mz(mz):
  176. M = mz
  177. num = input('Введите номер вершины: ')
  178. for i in M:
  179. if num in i[0]:
  180. print(i[7])
  181. def chains_mz(mz):
  182. M = mz
  183. nums = input('Введте последовательность: ')
  184. p = 0
  185. for i in range(len(nums)-1):
  186. for j in M:
  187. if nums[i] in j[0] and nums[i+1] in j[3]:
  188. p = 1
  189. break
  190. else:
  191. p = 0
  192. continue
  193. if p == 0:
  194. break
  195. if p == 1:
  196. print('Образует последовательность')
  197. else:
  198. print('Не образует')
  199. def versh_mz(mz):
  200. M = mz
  201. num = int(input('Введите вес:'))
  202. result = 'Номера вершин: '
  203. for i in M:
  204. if int(i[8][len(i[8])-2:len(i[8])]) > num:
  205. result += i[0][len(i[0])-2:len(i[0])]
  206. print(result)
  207. def kolreb_mz(mz):
  208. M = mz
  209. res = 0
  210. for i in M:
  211. res += int(i[6][len(i[6])-2:len(i[6])])
  212. print('Ребер = ' + str(int(res/2)))
  213.  
  214. # Задание 3:
  215. print(ss)
  216.  
  217. # Задание 4
  218. graph(M, names)
  219.  
  220. # Задание 5
  221. pprint(mz)
  222.  
  223. # Задание 6
  224. print('Для матрицы смежности')
  225. sosedi_ms(M, names)
  226. chains_ms(M)
  227. versh_ms(M)
  228. kolreb_ms(M)
  229. print('Для списка смежности')
  230. sosedi_ss(ss)
  231. chain_ss(ss)
  232. versh_ss(ss, names)
  233. kolreb_ss(ss)
  234. print('Для массива записей')
  235. sosedi_mz(mz)
  236. chains_mz(mz)
  237. versh_mz(mz)
  238. kolreb_mz(mz)
  239. # Задание 7
  240. print('Размер массива записей: ' + str(sys.getsizeof(mz)) + ' байт')
  241. print('Размер матрицы смежности: ' + str(sys.getsizeof(M)) + ' байт')
  242. print('Размер списка смежности: ' + str(sys.getsizeof(ss)) + ' байт')
  243.  
  244.  
  245. def sosedi_ms8(M, names):
  246. num = 6
  247. result = 'Соседи: '
  248. for i in range(len(M)):
  249. if M[num][i] > 0:
  250. result += names[i] + ', '
  251. if M[i][num] > 0:
  252. result += names[i] + ', '
  253. def chains_ms8(M):
  254. num = '1234'
  255. p = 0
  256. for i in range(len(num)-1):
  257. v = int(num[i]) - 1
  258. vv = int(num[i+1]) - 1
  259. if M[v][vv] > 0:
  260. p = 1
  261. continue
  262. else:
  263. break
  264. def versh_ms8(M):
  265. num = 10
  266. result = 'Номера вершин, сумма весов инц ребер которых больше '+ str(num) + ': '
  267. for i in range(len(M)):
  268. sum = 0
  269. for j in range(len(M)):
  270. if M[i][j] > 0:
  271. sum += M[i][j]
  272. if M[j][i] > 0:
  273. sum += M[j][i]
  274. if sum > num:
  275. result += str(i+1) + ' '
  276. def kolreb_ms8(M):
  277. nums = 0
  278. for i in range(len(M)):
  279. for j in range(len(M)):
  280. if M[i][j] > 0:
  281. nums += 1
  282.  
  283. def sosedi_ss8(ss):
  284. M = ss
  285. num = 4
  286. result = 'Номера соседей заданной вершины: '
  287. for i in M:
  288. if i[0] == num:
  289. result += str(i[1]) + ' '
  290. if i[1] == num:
  291. result += str(i[0]) + ' '
  292. def chain_ss8(ss):
  293. nums = '1461'
  294. p = 0
  295. M = ss
  296. flag = False
  297. for i in range(len(nums)-1):
  298. for j in M:
  299. if int(nums[i]) == j[0] and int(nums[i+1]) == j[1]:
  300. p = 1
  301. break
  302. else:
  303. p = 0
  304. flag = True
  305. if flag:
  306. break
  307. def versh_ss8(ss, name):
  308. M = ss
  309. num = 7
  310. result = "Вершины, сумма весов которых больше " + str(num) + ": "
  311. for i in range(len(name)):
  312. max = 0
  313. for k in M:
  314. if k[0] == i+1 or k[1] == i+1:
  315. max += k[2]
  316. if max > num:
  317. result += str(i+1) + ' '
  318. def kolreb_ss8(ss):
  319. M = ss
  320. len(M)
  321.  
  322. def sosedi_mz8(mz):
  323. M = mz
  324. num = '5'
  325. for i in M:
  326. if num in i[0]:
  327. break
  328. def chains_mz8(mz):
  329. M = mz
  330. nums = '1234'
  331. p = 0
  332. for i in range(len(nums)-1):
  333. for j in M:
  334. if nums[i] in j[0] and nums[i+1] in j[3]:
  335. p = 1
  336. break
  337. else:
  338. p = 0
  339. continue
  340. if p == 0:
  341. break
  342. def versh_mz8(mz):
  343. M = mz
  344. num = 8
  345. result = 'Номера вершин: '
  346. for i in M:
  347. if int(i[8][len(i[8])-2:len(i[8])]) > num:
  348. result += i[0][len(i[0])-2:len(i[0])]
  349. def kolreb_mz8(mz):
  350. M = mz
  351. res = 0
  352. for i in M:
  353. res += int(i[6][len(i[6])-2:len(i[6])])
  354. # Задание 8
  355. t, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 = 0, 0, 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0
  356. for i in range(pow(10,6)):
  357. a = time.time()
  358. sosedi_ms8(M, names)
  359. b = time.time()
  360. t += b - a
  361.  
  362. a1 = time.time()
  363. chains_ms8(M)
  364. b1 = time.time()
  365. t1 += b1 - a1
  366.  
  367. a2 = time.time()
  368. versh_ms8(M)
  369. b2 = time.time()
  370. t2 += b2 - a2
  371.  
  372. a3 = time.time()
  373. kolreb_ms8(M)
  374. b3 = time.time()
  375. t3 += b3 - a3
  376.  
  377. a4 = time.time()
  378. sosedi_ss8(ss)
  379. b4 = time.time()
  380. t4 += b4 - a4
  381.  
  382. a5 = time.time()
  383. chain_ss8(ss)
  384. b5 = time.time()
  385. t5 += b5 - a5
  386.  
  387. a6 = time.time()
  388. versh_ss8(ss, names)
  389. b6 = time.time()
  390. t6 += b6 - a6
  391.  
  392. a7 = time.time()
  393. kolreb_ss8(ss)
  394. b7 = time.time()
  395. t7 += b7 - a7
  396.  
  397. a8 = time.time()
  398. sosedi_mz8(mz)
  399. b8 = time.time()
  400. t8 += b8 - a8
  401.  
  402. a9 = time.time()
  403. chains_mz8(mz)
  404. b9 = time.time()
  405. t9 += b9 - a9
  406.  
  407. a10 = time.time()
  408. versh_mz8(mz)
  409. b10 = time.time()
  410. t10 += b10 - a10
  411.  
  412. a11 = time.time()
  413. kolreb_mz8(mz)
  414. b11 = time.time()
  415. t11 += b11 - a11
  416.  
  417. print('Время выполнения поиска всех соседей через матрицу смежности: '+ str(t/(pow(10,6))))
  418. print('Время выполнения поиска цепи в матрице смежности: '+ str(t1/(pow(10,6))))
  419. print('Время выполнения поиска всех вершин вес которых больше 10 через матрицу смежности: '+ str(t2/(pow(10,6))))
  420. print('Время выполнения поиска количества ребер через матрицу смежности: '+ str(t3/(pow(10,6))))
  421.  
  422. print('Время выполнения поиска всех соседей через список смежности: '+ str(t4/(pow(10,6))))
  423. print('Время выполнения поиска цепи в список смежности: '+ str(t5/(pow(10,6))))
  424. print('Время выполнения поиска всех вершин вес которых больше 10 через список смежности: '+ str(t6/(pow(10,6))))
  425. print('Время выполнения поиска количества ребер через список смежности: '+ str(t7/(pow(10,6))))
  426.  
  427. print('Время выполнения поиска всех соседей через массив записей: '+ str(t8/(pow(10,6))))
  428. print('Время выполнения поиска цепи в массив записей: '+ str(t9/(pow(10,6))))
  429. print('Время выполнения поиска всех вершин вес которых больше 10 через массив записей: '+ str(t10/(pow(10,6))))
  430. print('Время выполнения поиска количества ребер через массив записей: '+ str(t11/(pow(10,6))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement