Skip to content

Commit 5f5a4a1

Browse files
authored
Merge pull request #3 from shrezaaa/rez-gene
Rez gene
2 parents 7fdb2d7 + ba01b98 commit 5f5a4a1

File tree

2 files changed

+243
-7
lines changed

2 files changed

+243
-7
lines changed

Genetic Algorithm2.py

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
from collections import deque
2+
import secrets
3+
from random import randrange
4+
from random import random
5+
6+
import math
7+
8+
global unitCounts
9+
global intervalCounts
10+
11+
global unitArray
12+
unitArray = []
13+
14+
global intervalsArray
15+
intervalsArray = []
16+
17+
def readFilesAndCreateObjects():
18+
secondFile = open("second.txt", 'rt')
19+
lines = secondFile.read().split('\n')
20+
intervalCounts = int(lines.pop(0))
21+
for line in lines:
22+
res = line.split(',')
23+
intervalsArray.append(Interval(res[0], res[1]))
24+
secondFile.close()
25+
26+
firstFile = open("first.txt", "rt")
27+
lines = firstFile.read().split('\n')
28+
unitCounts = int(lines.pop(0))
29+
for line in lines:
30+
res = line.split(',')
31+
unitArray.append(Unit(res[0], res[1], res[2], intervalCounts))
32+
firstFile.close()
33+
34+
35+
class Unit:
36+
def __init__(self, id, capacity, repairCount,intervalsCount):
37+
self.unitID = int(id)
38+
self.unitCapacity = int(capacity)
39+
self.unitRepairCount = int(repairCount)
40+
self.unitPools = self.genreatePools(self.unitRepairCount,intervalsCount)
41+
42+
def genreatePools(self,reapirCount,intervals):
43+
pools = []
44+
tempArray = []
45+
for x in range(reapirCount):
46+
tempArray.append(1)
47+
for x in range(intervals-reapirCount):
48+
tempArray.append(0)
49+
50+
pools.append(tempArray)
51+
items = deque(tempArray)
52+
for x in range(intervals-reapirCount):
53+
items.rotate(1)
54+
pools.append(list(items))
55+
# print(pools)
56+
return pools
57+
58+
59+
class Interval:
60+
def __init__(self, id, demand):
61+
self.intervalID = int(id)
62+
self.intervalDemand = int(demand)
63+
64+
class Population:
65+
def __init__(self,size,initialize):
66+
self.size = size
67+
self.individulas = [None] * size
68+
if initialize=='true':
69+
for i in range(size):
70+
indiv = generateIndividual()
71+
self.individulas[i] = indiv
72+
self.saveIndividual(i,indiv)
73+
74+
def saveIndividual(self,index,indiv):
75+
self.individulas[index] = indiv
76+
77+
def getIndividual(self,i):
78+
return self.individulas[i]
79+
80+
# tested
81+
def getFittestInPop(self):
82+
fittest = self.individulas[0]
83+
for i in range(len(self.individulas)):
84+
if self.findMinimumIntervalCapacityInOrders(fittest) <= self.findMinimumIntervalCapacityInOrders(self.individulas[i]):
85+
fittest = self.individulas[i]
86+
return fittest
87+
88+
def getFittestFitnessRate(self):
89+
fit = self.getFittestInPop()
90+
return self.findMinimumIntervalCapacityInOrders(fit)
91+
92+
# tested
93+
def findMinimumIntervalCapacityInOrders(self,orderList):
94+
minimumInterval = -1
95+
minimum = self.calcIntervalExtraCapacity(orderList, 0)
96+
minimumIntervalsList = []
97+
for intervalIndex in range(len(intervalsArray)):
98+
extraCapacity = self.calcIntervalExtraCapacity(orderList, intervalIndex)
99+
if extraCapacity < minimum:
100+
minimum = extraCapacity
101+
minimumInterval = intervalIndex
102+
minimumIntervalsList = []
103+
elif extraCapacity == minimum:
104+
minimumIntervalsList.append(intervalIndex)
105+
if len(minimumIntervalsList) != 0:
106+
if minimumInterval > -1:
107+
minimumIntervalsList.append(minimumInterval)
108+
minimumInterval = secrets.choice(minimumIntervalsList)
109+
minimumIntervalsList = []
110+
# return minimumInterval
111+
return self.calcIntervalExtraCapacity(orderList, minimumInterval)
112+
113+
# tested
114+
def calcIntervalExtraCapacity(self,orderList: [], intervalIndex: int):
115+
sum = 0
116+
for unitIndex in range(len(unitArray)):
117+
if orderList[unitIndex][intervalIndex] == 0:
118+
sum = sum + unitArray[unitIndex].unitCapacity
119+
return sum - intervalsArray[intervalIndex].intervalDemand
120+
121+
# for test
122+
def calcAllNeededInOrders(self,orderList):
123+
neededCapcacity = 0
124+
for index in range(len(intervalsArray)):
125+
extraCapacity = self.calcIntervalExtraCapacity(orderList, index)
126+
if extraCapacity < 0:
127+
neededCapcacity = neededCapcacity + extraCapacity
128+
print(str(index) + " & Extra Capacity is " + str(
129+
(self.calcIntervalExtraCapacity(orderList, index))))
130+
return neededCapcacity ## #
131+
132+
133+
134+
class Algorithm:
135+
def __init__(self,uniformRate,mutationRate,tournamentSize,elitism):
136+
self.uniformRate = uniformRate
137+
self.mutationRate = mutationRate
138+
self.tournamentSize = tournamentSize
139+
self.elitism = elitism
140+
141+
def evelopePopulation(self,pop:Population):
142+
newPopulation = Population(pop.size,'false')
143+
144+
# keep the best
145+
if self.elitism == 'true':
146+
newPopulation.saveIndividual(0,pop.getFittestInPop())
147+
148+
# crossover Population
149+
if self.elitism=='true':
150+
self.elitismOffset = 1
151+
else :
152+
self.elitismOffset = 0;
153+
154+
# crossover
155+
# tested
156+
for i in range(self.elitismOffset,pop.size,1):
157+
indiv1 = self.tournamentSelection(pop)
158+
indiv2 = self.tournamentSelection(pop)
159+
newIndiv = self.crossover(indiv1,indiv2)
160+
newPopulation.saveIndividual(i,newIndiv)
161+
162+
# mutate
163+
# tested
164+
for i in range(self.elitismOffset,pop.size,1):
165+
mutatedIndiv = self.mutate(newPopulation.getIndividual(i))
166+
newPopulation.saveIndividual(i,mutatedIndiv)
167+
168+
return newPopulation
169+
170+
# tested
171+
def crossover(self,indiv1,indiv2):
172+
newIndiv = [None] * len(indiv1)
173+
for i in range(len(indiv1)):
174+
if random() <= self.uniformRate:
175+
newIndiv[i] = indiv1[i]
176+
else:
177+
newIndiv[i] = indiv2[i]
178+
return newIndiv
179+
180+
# tested
181+
def mutate(self,indiv):
182+
for i in range(len(indiv)):
183+
if random() <= self.mutationRate:
184+
randomGenePoll = secrets.choice(unitArray[i].unitPools)
185+
indiv[i] = randomGenePoll
186+
return indiv
187+
188+
def tournamentSelection(self,pop:Population):
189+
tournomentPop = Population(self.tournamentSize,'false')
190+
for i in range(self.tournamentSize):
191+
randomID = randrange(pop.size)
192+
tournomentPop.saveIndividual(i,pop.getIndividual(randomID))
193+
194+
fittest = tournomentPop.getFittestInPop()
195+
return fittest
196+
197+
198+
199+
def generateIndividual():
200+
individual = []
201+
for unit in unitArray:
202+
individual.append(secrets.choice(unit.unitPools))
203+
return individual
204+
205+
def printIndividuals(indivLists:list):
206+
for i in indivLists:
207+
print(i)
208+
209+
210+
def printPop(pop:Population,number):
211+
print('pop test' + str(number))
212+
for i in range(len(pop.individulas)):
213+
print('indiv' + str(i))
214+
print(pop.calcAllNeededInOrders(pop.individulas[i]))
215+
print()
216+
217+
def main() :
218+
readFilesAndCreateObjects()
219+
pop = Population(10,'true')
220+
algorithm = Algorithm(0.7,0.5,4,'true')
221+
newPop = algorithm.evelopePopulation(pop)
222+
generationCount = 100
223+
for generationIndex in range(generationCount):
224+
if pop.getFittestFitnessRate() <= newPop.getFittestFitnessRate():
225+
print("generation: "+ str(generationIndex) + " fittest: " + str(newPop.getFittestFitnessRate()))
226+
pop = newPop
227+
newPop = algorithm.evelopePopulation(pop)
228+
229+
print()
230+
print('answer is')
231+
fittest = pop.getFittestInPop()
232+
print(fittest)
233+
print(pop.calcAllNeededInOrders(fittest))
234+
print("fittest fitness is: " + str(pop.getFittestFitnessRate()))
235+
236+
main()

SimulatedAnealing.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def readFilesAndCreateObjects():
6363
unitArray.append(Unit(res[0], res[1], res[2], intervalCounts))
6464
firstFile.close()
6565

66-
def calcIntervalNeededCapacity(orderList:[], intervalIndex:int):
66+
def calcIntervalExtraCapacity(orderList:[], intervalIndex:int):
6767
sum = 0
6868
for unitIndex in range(len(unitArray)):
6969
if orderList[unitIndex][intervalIndex] == 0 :
@@ -94,18 +94,18 @@ def fillOrders():
9494
def calcAllNeededInOrders(orderList):
9595
neededCapcacity = 0
9696
for index in range(len(intervalsArray)):
97-
extraCapacity = calcIntervalNeededCapacity(orderList, index)
97+
extraCapacity = calcIntervalExtraCapacity(orderList, index)
9898
if extraCapacity < 0 :
9999
neededCapcacity = neededCapcacity + extraCapacity
100-
print(str(index) +" Exact Capacity is "+ str(calcIntervalExactCapacity(orderList, index)) + " & Extra Capacity is " + str((calcIntervalNeededCapacity(orderList, index))))
100+
print(str(index) +" Exact Capacity is "+ str(calcIntervalExactCapacity(orderList, index)) + " & Extra Capacity is " + str((calcIntervalExtraCapacity(orderList, index))))
101101
return neededCapcacity
102102

103103
def findMinimumIntervalCapacityInOrders(orderList):
104104
minimumInterval=-1
105-
minimum = calcIntervalNeededCapacity(orderList, 0)
105+
minimum = calcIntervalExtraCapacity(orderList, 0)
106106
minimumIntervalsList = []
107107
for intervalIndex in range(len(intervalsArray)):
108-
extraCapacity = calcIntervalNeededCapacity(orderList, intervalIndex)
108+
extraCapacity = calcIntervalExtraCapacity(orderList, intervalIndex)
109109
if extraCapacity < minimum :
110110
minimum = extraCapacity
111111
minimumInterval = intervalIndex
@@ -136,7 +136,7 @@ def findNeighbourOrderList(orderList,minimumInterval):
136136
selectedUnitPool = secrets.choice(selectableUnitPools)
137137
newOrderList[selectedUnit] = selectedUnitPool
138138
newMinimumInterval = findMinimumIntervalCapacityInOrders(newOrderList);
139-
minimumValue = calcIntervalNeededCapacity(newOrderList, newMinimumInterval)
139+
minimumValue = calcIntervalExtraCapacity(newOrderList, newMinimumInterval)
140140

141141
solution = Solution(newOrderList,minimumValue)
142142
return solution
@@ -145,7 +145,7 @@ def main() :
145145
readFilesAndCreateObjects()
146146
orderList = fillOrders()
147147
minimumInterval = findMinimumIntervalCapacityInOrders(orderList)
148-
minimumValue = calcIntervalNeededCapacity(orderList, minimumInterval)
148+
minimumValue = calcIntervalExtraCapacity(orderList, minimumInterval)
149149
global currentSolution
150150
global bestSolution
151151
currentSolution = Solution(orderList,minimumValue)

0 commit comments

Comments
 (0)