Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.52 KB | None | 0 0
  1. import csv,math
  2. from Distance import covers
  3. from House import House
  4. from Antenna import Antenna
  5. from Cluster import Cluster
  6. def findGreedyCluster():
  7. antennaRange,maxCoverage = 5,0
  8. greedyAntenna = None
  9. greedyHouses = []
  10. maxList = []
  11. for antenna in antennaList:
  12. if antenna not in antennaSet: #not used
  13. housesServed = 0
  14. housesServedList = []
  15. for house in houseList:
  16. if house not in houseSet:
  17. if covers(antenna,house,antennaRange):
  18. housesServed = housesServed + 1
  19. housesServedList.append(house)
  20. if housesServed > maxCoverage:
  21. maxList = []
  22. maxList.append(tuple([antenna,housesServedList]))
  23. maxCoverage = housesServed
  24. greedyHouses = housesServedList
  25. greedyAntenna = antenna
  26.  
  27. if housesServed == maxCoverage and housesServed > 0:
  28. maxList.append(tuple([antenna,housesServedList]))
  29. if len(maxList) != 1:
  30. for rng in range(1,6):
  31. for entry in maxList:
  32. ant = entry[0]
  33. houses = entry[1]
  34. tempServed = findHousesCovered(ant,rng)
  35. if tempServed == maxCoverage:
  36. greedyAntenna = entry[0]
  37. greedyAntenna.size = rng
  38. greedyHouses = entry[1]
  39. print("Tie broken, serves {} houses with size {}".format(tempServed,rng))
  40. return Cluster(greedyAntenna,greedyHouses)
  41. if greedyAntenna is None:
  42. return None
  43. greedyAntenna.size = 5
  44. while antennaRange > 0:
  45. antennaRange = antennaRange - 1
  46. housesServed = findHousesCovered(greedyAntenna,antennaRange)
  47. if housesServed < maxCoverage:
  48. break
  49. else:
  50. greedyAntenna.size = antennaRange
  51. return Cluster(greedyAntenna,greedyHouses)
  52.  
  53. #returns number of houses covered
  54. def findHousesCovered(antenna,antennaRange):
  55. housesCovered = 0
  56. for house in houseList:
  57. if house not in houseSet:
  58. if covers(antenna,house,antennaRange):
  59. housesCovered = housesCovered + 1
  60. return housesCovered
  61.  
  62. #adds new houses and an antenna to the added sets
  63. def addAntennasAndHousesToSets(greedyCluster):
  64. for house in greedyCluster.houses:
  65. houseSet.add(house)
  66. antennaSet.add(greedyCluster.antenna)
  67. print("({},{},{})".format(len(houseSet),greedyCluster.antenna.loc,greedyCluster.antenna.size))
  68.  
  69. #functions to read csv files, creates Antenna and House Objects, puts them into lists
  70. def create_antennaList():
  71. with open('antennaLocations.csv', 'r') as csvfile:
  72. reader = csv.reader(csvfile, delimiter=',', quotechar='|')
  73. antennaList = []
  74. for row in reader:
  75. antennaList.append(Antenna(row[0], row[1], float(row[2]), float(row[3])))
  76. return antennaList
  77. def create_houselist():
  78. with open('houseList.csv', 'r') as csvfile:
  79. spamreader = csv.reader(csvfile, delimiter=',', quotechar='|')
  80. houselist = []
  81. for row in spamreader:
  82. houselist.append(House(row[0], row[1], float(row[2]), float(row[3])))
  83. return houselist
  84. #creates a CSV of our results
  85. def create_csv_file():
  86. with open('result.csv','w') as csvfile:
  87. spamwriter = csv.writer(csvfile,delimiter=',')
  88. for antenna in antennaSet:
  89. spamwriter.writerow([antenna.loc,"T-{}".format(antenna.size)])
  90.  
  91. #main algorithm
  92. if __name__ == "__main__":
  93. #create lists, sets, and number of houses variables
  94. houseList = create_houselist()
  95. antennaList = create_antennaList()
  96. houseSet = set()
  97. antennaSet = set()
  98. numberOfHouses = len(houseList)
  99. housesServiced = 0
  100. #start greeedy algorithm
  101. while numberOfHouses != housesServiced:
  102. greedyCluster = findGreedyCluster()
  103. if greedyCluster is None:
  104. break
  105. addAntennasAndHousesToSets(greedyCluster)
  106. housesServiced = len(houseSet)
  107. #output results
  108. create_csv_file()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement