Guest User

Untitled

a guest
Jan 20th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. import pandas as pd
  2. import math
  3. from sklearn import cluster, datasets
  4. from operator import itemgetter
  5. import collections
  6. import adj
  7. import csv
  8. import copy
  9. import matplotlib.pyplot as plt
  10. import plt123
  11. import TSP123
  12.  
  13.  
  14. def test123(fname1):
  15. #from matplotlib import pyplot as plt
  16. data = pd.read_csv(fname1)
  17. f1 = data['X'].tolist()
  18. f2 = data['Y'].tolist()
  19. f3 = data['capacity'].tolist()
  20. VC = data['vehicle_capacity'].tolist()
  21. VC = VC[0]
  22.  
  23. item = [0]*len(f1)
  24. for i in range(0,len(f1)):
  25. item[i] = [i-1,f1[i],f2[i],f3[i],0]
  26.  
  27. depot = item.pop(0)
  28. G =[0]*2
  29. for i in range(0,len(item)):
  30. G[0] = item[i][1]/len(item) + G[0]
  31. G[1] = item[i][2]/len(item) + G[1]
  32.  
  33.  
  34.  
  35. def Get_Distance_Reverse(list1 , point):
  36.  
  37. for i in range(0,len(list1)):
  38. list1[i][4] = (math.sqrt((list1[i][1]-point[0])**2 + (list1[i][2]-point[1])**2))
  39.  
  40. list2 = sorted(list1 , key=lambda tup: tup[4], reverse = True)
  41.  
  42. return list2
  43.  
  44. def Get_Distance(list1 , point):
  45. for i in range(0,len(list1)):
  46. list1[i][4] = (math.sqrt((list1[i][1]-point[0])**2 + (list1[i][2]-point[1])**2))
  47.  
  48. #print(list1)
  49. list2 = sorted(list1 , key=lambda tup: tup[4])
  50.  
  51. return list2
  52.  
  53. def Get_Gravity(list1):
  54. Grav = [0]*2
  55. for i in range(0 , len(list1)):
  56. Grav[0] = list1[i][1]/len(list1) + Grav[0]
  57. Grav[1] = list1[i][2]/len(list1) + Grav[1]
  58. return Grav
  59.  
  60.  
  61. def get_Gravity1(list1):
  62. grav = [[],[]]
  63. for i in range(0,len(list1)):
  64. temp = 0
  65. temp1 = 0
  66. for j in range(0,len(list1[i])):
  67. temp = list1[i][j][1]/len(list1[i]) + temp
  68. temp1 = list1[i][j][2]/len(list1[i]) + temp1
  69. grav[0].append(temp)
  70. grav[1].append(temp1)
  71.  
  72. return grav
  73.  
  74. def OneDistance(node1,x,y):
  75. return math.sqrt((node1[1]-x)**2 + (node1[2]-y)**2)
  76.  
  77. def get_AllDistance(list1 , grav): #找出每個需求點與所有重心的距離
  78. Q=[]
  79. for i in range(0,len(list1)):
  80. for j in range(0,len(grav[1])):
  81. Q.append(math.sqrt((list1[i][1]-grav[0][j])**2 + (list1[i][2]-grav[1][j])**2))
  82.  
  83. distance = [(Q[i:i+len(grav[1])]) for i in range(0,len(Q),len(grav[1]))]
  84. sort = []
  85. for i in range(0,len(distance)):
  86. sort.append(sorted(range(len(distance[i])), key=lambda k: distance[i][k]))
  87.  
  88. return(distance,sort)
  89. def get_FinalGravity(list1):
  90. grav = [[],[]]
  91. for i in range(0,len(list1)):
  92. temp = 0
  93. temp1 = 0
  94. for j in range(1,len(list1[i])):
  95. temp = list1[i][j][1]/(len(list1[i])-1) + temp
  96. temp1 = list1[i][j][2]/(len(list1[i])-1) + temp1
  97. grav[0].append(temp)
  98. grav[1].append(temp1)
  99.  
  100. return grav
  101.  
  102. count = 0
  103. cluster_list = []
  104. G_list = []
  105. Distance_list = Get_Distance_Reverse(item , depot)
  106. while len(Distance_list) != 0:
  107. cap = Distance_list[0][3]
  108. G_list.append(Distance_list.pop(0))
  109. G1 = [0]*2
  110. G1[0] = G_list[count][1]
  111. G1[1] = G_list[count][2]
  112.  
  113.  
  114. if(len(Distance_list)== 0):
  115. break
  116. Distance_list1 = Get_Distance(Distance_list,G1)
  117. temp_list = []
  118. temp_list.append(G_list[count])
  119.  
  120. while cap + Distance_list1[0][3] <= VC:
  121.  
  122. cap = cap + Distance_list1[0][3]
  123. temp_list.append(Distance_list1.pop(0))
  124. G1 = Get_Gravity(temp_list)
  125. Distance_list1 = Get_Distance(Distance_list1,G1)
  126. if(len(Distance_list1) == 0):
  127. break
  128.  
  129. cluster_list.append(temp_list)
  130.  
  131. if(len(Distance_list1)==0):
  132. break
  133.  
  134. Distance_list = Get_Distance_Reverse(Distance_list1,depot)
  135.  
  136.  
  137. count = count+1
  138.  
  139. G1 = get_Gravity1(cluster_list)
  140. init_cluster = copy.deepcopy(cluster_list)
  141. cap = [0]*len(cluster_list)
  142. for i in range(len(cluster_list)):
  143. for j in range(len(cluster_list[i])):
  144. cap[i] = cluster_list[i][j][3] + cap[i]
  145.  
  146.  
  147. for i in range(0,len(cluster_list)):
  148. for j in range(0,len(cluster_list[i])):
  149.  
  150. for k in range(0,len(cluster_list)):
  151. if (j >= len(cluster_list[i])):
  152. break
  153. if (k != i):
  154. init_Distance = OneDistance(cluster_list[i][j] , G1[0][i] , G1[1][i])
  155. new_Distance = OneDistance(cluster_list[i][j] , G1[0][k] , G1[1][k])
  156. if(cap[k] + cluster_list[i][j][3] <= VC and new_Distance < init_Distance):
  157. cap[k] = cap[k] + cluster_list[i][j][3]
  158. cap[i] = cap[i] - cluster_list[i][j][3]
  159. temp = cluster_list[i].pop(j)
  160. cluster_list[k].append(temp)
  161. G1 = get_Gravity1(cluster_list)
  162.  
  163.  
  164.  
  165. for i in range(0,len(cluster_list)):
  166. cluster_list[i].insert(0,depot)
  167. init_cluster[i].insert(0,depot)
  168.  
  169. final_grav1 = get_FinalGravity(cluster_list)
  170. init_grav1 = get_FinalGravity(init_cluster)
  171. final_tsp, init_tsp = TSP123.get_tsp(cluster_list,init_cluster)
  172. plt123.cluster_plt(cluster_list, final_grav1 ,init_cluster,init_grav1,final_tsp, init_tsp, fname1 , depot)
  173. return final_tsp, init_tsp
  174.  
  175.  
  176. import os
  177. items = os.listdir(".")
  178. newlist = []
  179. for names in items:
  180. if names.endswith(".csv"):
  181. newlist.append(names)
  182.  
  183. result = []
  184. name1 = []
  185. mylist = ['good_P-n20-k2.csv', 'good_P-n21-k2.csv']
  186. for i in range(0,len(newlist)):
  187. print(newlist[i],i)
  188. temp1,temp2 = test123(newlist[i])
  189. result.append([temp1,temp2,newlist[i]])
  190.  
  191. df2 = pd.DataFrame(data=result)
  192. df2.to_csv('out.csv')
  193. d = 1000
  194. c = 1000
Add Comment
Please, Sign In to add comment