Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import csv,math
- from Distance import covers
- from House import House
- from Antenna import Antenna
- from Cluster import Cluster
- def findGreedyCluster():
- antennaRange,maxCoverage = 5,0
- greedyAntenna = None
- greedyHouses = []
- maxList = []
- for antenna in antennaList:
- if antenna not in antennaSet: #not used
- housesServed = 0
- housesServedList = []
- for house in houseList:
- if house not in houseSet:
- if covers(antenna,house,antennaRange):
- housesServed = housesServed + 1
- housesServedList.append(house)
- if housesServed > maxCoverage:
- maxList = []
- maxList.append(tuple([antenna,housesServedList]))
- maxCoverage = housesServed
- greedyHouses = housesServedList
- greedyAntenna = antenna
- if housesServed == maxCoverage and housesServed > 0:
- maxList.append(tuple([antenna,housesServedList]))
- if len(maxList) != 1:
- for rng in range(1,6):
- for entry in maxList:
- ant = entry[0]
- houses = entry[1]
- tempServed = findHousesCovered(ant,rng)
- if tempServed == maxCoverage:
- greedyAntenna = entry[0]
- greedyAntenna.size = rng
- greedyHouses = entry[1]
- print("Tie broken, serves {} houses with size {}".format(tempServed,rng))
- return Cluster(greedyAntenna,greedyHouses)
- if greedyAntenna is None:
- return None
- greedyAntenna.size = 5
- while antennaRange > 0:
- antennaRange = antennaRange - 1
- housesServed = findHousesCovered(greedyAntenna,antennaRange)
- if housesServed < maxCoverage:
- break
- else:
- greedyAntenna.size = antennaRange
- return Cluster(greedyAntenna,greedyHouses)
- #returns number of houses covered
- def findHousesCovered(antenna,antennaRange):
- housesCovered = 0
- for house in houseList:
- if house not in houseSet:
- if covers(antenna,house,antennaRange):
- housesCovered = housesCovered + 1
- return housesCovered
- #adds new houses and an antenna to the added sets
- def addAntennasAndHousesToSets(greedyCluster):
- for house in greedyCluster.houses:
- houseSet.add(house)
- antennaSet.add(greedyCluster.antenna)
- print("({},{},{})".format(len(houseSet),greedyCluster.antenna.loc,greedyCluster.antenna.size))
- #functions to read csv files, creates Antenna and House Objects, puts them into lists
- def create_antennaList():
- with open('antennaLocations.csv', 'r') as csvfile:
- reader = csv.reader(csvfile, delimiter=',', quotechar='|')
- antennaList = []
- for row in reader:
- antennaList.append(Antenna(row[0], row[1], float(row[2]), float(row[3])))
- return antennaList
- def create_houselist():
- with open('houseList.csv', 'r') as csvfile:
- spamreader = csv.reader(csvfile, delimiter=',', quotechar='|')
- houselist = []
- for row in spamreader:
- houselist.append(House(row[0], row[1], float(row[2]), float(row[3])))
- return houselist
- #creates a CSV of our results
- def create_csv_file():
- with open('result.csv','w') as csvfile:
- spamwriter = csv.writer(csvfile,delimiter=',')
- for antenna in antennaSet:
- spamwriter.writerow([antenna.loc,"T-{}".format(antenna.size)])
- #main algorithm
- if __name__ == "__main__":
- #create lists, sets, and number of houses variables
- houseList = create_houselist()
- antennaList = create_antennaList()
- houseSet = set()
- antennaSet = set()
- numberOfHouses = len(houseList)
- housesServiced = 0
- #start greeedy algorithm
- while numberOfHouses != housesServiced:
- greedyCluster = findGreedyCluster()
- if greedyCluster is None:
- break
- addAntennasAndHousesToSets(greedyCluster)
- housesServiced = len(houseSet)
- #output results
- create_csv_file()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement