Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
195 changes: 164 additions & 31 deletions genetic.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import statistics
import sys
import time
import numpy
import operator
from bisect import bisect_left
from enum import Enum
from math import exp
Expand All @@ -17,13 +19,13 @@ def _generate_parent(get_fitness, length, geneSet,generate_genes):
def _mutate(parent, geneSet, get_fitness):
return 0

def _mutate_custom(parent, custom_mutate, get_fitness, bestParent):
def _mutate_custom(parent, custom_mutate, get_fitness):
childGenes = parent.Genes
custom_mutate(childGenes, bestParent)
fitness = get_fitness(childGenes)
return Chromosome(childGenes, fitness, Strategies.Mutate)
child = custom_mutate(childGenes)
fitness = get_fitness(child)
return Chromosome(child, fitness, Strategies.Mutate)

def _crossover(parent, parentDonor, parents,get_fitness, crossover):
def _crossover(parent, parentDonor, parents, get_fitness, crossover):
childGenes = crossover(parent.Genes, parentDonor.Genes)
fitness = get_fitness(childGenes)
return Chromosome(childGenes, fitness, Strategies.Crossover)
Expand All @@ -33,32 +35,124 @@ def get_best(generate_genes, get_fitness, length, optimalFitness, geneSet, displ
custom_mutate=None, custom_create=None, maxAge=None,
poolSize=1, crossover=None):

def fnMutate(parent, bestParent):
return _mutate_custom(parent, custom_mutate, get_fitness, bestParent)

def fnGenerateParent():
return _generate_parent(get_fitness, length, geneSet, generate_genes)

strategyLookup = {
Strategies.Create: lambda p, o, i: fnGenerateParent(),
Strategies.Mutate: lambda p, o, i: fnMutate(p, i),
Strategies.Crossover: lambda p, o, i : _crossover(p, o, i, get_fitness, crossover)
}
usedStrategies = [strategyLookup[Strategies.Mutate]]
usedStrategies.append(strategyLookup[Strategies.Crossover])

def fnNewChild(parents, bestParent):
parent = selections.roulette_selection(parents)
parentDonor = selections.roulette_selection(parents)
while parent == parentDonor:
parentDonor = selections.roulette_selection(parents)
return random.choice(usedStrategies)(parent, parentDonor, bestParent) #bad

for improvement in _get_improvement(fnNewChild, fnGenerateParent,
maxAge, poolSize):
display(improvement)
if improvement.Fitness == 1:
return improvement
def fnMutate(parent):
return _mutate_custom(parent, custom_mutate, get_fitness)

# def fn():
# pass

# usedStrategies = [strategyLookup[Strategies.Mutate]]
# if crossover is not None:
# usedStrategies.append(strategyLookup[Strategies.Crossover])

bestParent = fnGenerateParent()
display(bestParent)
# yield bestParent
parents = [bestParent]

for _ in range(poolSize - 1):
parent = fnGenerateParent()
parents.append(parent)
if parent.Fitness > bestParent.Fitness:
display(parent)
bestParent = parent

lastParentIndex = poolSize - 1
pindex = 1
selectedParents = []
while True:
# select parents

parents = sorted(parents, key=operator.attrgetter('Fitness'))
parentIndex = 49
for _ in range(50):
tempParent = parents[parentIndex]
selectedParents.append(tempParent)
parentIndex += 1

# crossover with Pc

# for _ in range(50):
# parent = selections.roulette_selection(selectedParents)
# # import pdb; pdb.set_trace()
# parentDonor = selections.roulette_selection(selectedParents)
# while parent == parentDonor:
# parentDonor = selections.roulette_selection(selectedParents)
# child = _crossover(parent, parentDonor, parents, get_fitness, crossover)
# display(child)
# # child = fnMutate(child)
# selectedParents.append(child)
# if child.Fitness > bestParent.Fitness:
# bestParent = child
# display(bestParent)

# mutate with Pm

for _ in range(50):
# import pdb; pdb.set_trace()
k = random.choice('01')
if k == '0':
parent = selections.roulette_selection(selectedParents)
child = fnMutate(parent)
# display(child)
if child.Fitness > bestParent.Fitness:
bestParent = child
display(bestParent)
selectedParents.append(child)
if child.Fitness == 1:
import pdb; pdb.set_trace()
break
else:
parent = selections.roulette_selection(selectedParents)
# import pdb; pdb.set_trace()
parentDonor = selections.roulette_selection(selectedParents)
while parent == parentDonor:
parentDonor = selections.roulette_selection(selectedParents)
child = _crossover(parent, parentDonor, parents, get_fitness, crossover)
# display(child)
# child = fnMutate(child)
selectedParents.append(child)
if child.Fitness > bestParent.Fitness:
bestParent = child
display(bestParent)


# if child.Fitness > 0.7:
# import pdb; pdb.set_trace()
# display(child)

parents = selectedParents
selectedParents = []







# strategyLookup = {
# Strategies.Create: lambda p, o, i: fnGenerateParent(),
# Strategies.Mutate: lambda p, o, i: fnMutate(p, i),
# Strategies.Crossover: lambda p, o, i : _crossover(p, o, i, get_fitness, crossover)
# }
# usedStrategies = [strategyLookup[Strategies.Mutate]]
# usedStrategies.append(strategyLookup[Strategies.Crossover])

# def fnNewChild(parents, parent1):
# parent = selections.roulette_selection(parents)
# parentDonor = selections.random_selection(parents)
# while parent == parentDonor:
# parentDonor = selections.random_selection(parents)
# return random.choice(usedStrategies)(parent, parentDonor, parent1) #bad

# for improvement in _get_improvement(fnNewChild, fnGenerateParent,
# maxAge, poolSize):
# display(improvement)
# if improvement.Fitness == 1:
# return improvement

def _get_improvement(new_child, generate_parent, maxAge, poolSize):
bestParent = generate_parent()
Expand All @@ -75,12 +169,51 @@ def _get_improvement(new_child, generate_parent, maxAge, poolSize):
lastParentIndex = poolSize - 1
pindex = 1
while True:

child = new_child(parents, bestParent)

# select parents
parentIndex = 100
for _ in range(100):
tempParent = parents[parentindex]
selectedParents.append(tempParent)
parentIndex += 1

# crossover with Pc

for _ in range(100):
parent = selections.roulette_selection(parents)
parentDonor = selections.random_selection(parents)
while parent == parentDonor:
parentDonor = selections.random_selection(parents)





# pindex = pindex - 1 if pindex > 0 else lastParentIndex
# parent = parents[pindex]
# import pdb; pdb.set_trace()
child = new_child(parents, parent)
# if parent.Fitness < child.Fitness:
# ind = parents.index(min(parents, key=operator.attrgetter('Fitness')))
# parents[ind] = child
# parents[pindex] = child
# if maxAge is None:
# continue
# parent.Age += 1
# if maxAge > parent.Age:
# continue
# parents[pindex] = child
# print("1")
# parents.append(child)
# ind = parents.index(max(parents, key=operator.attrgetter('Fitness')))
# parents[ind] = child
# if bestParent.Fitness > 0.8:
# import pdb; pdb.set_trace()
if child.Fitness > bestParent.Fitness:
bestParent = child
yield bestParent
# print('1')
# ind = parents.index(min(parents, key=operator.attrgetter('Fitness')))
# parents[ind] = child
parents.append(bestParent)


Expand Down
Binary file modified genetic.pyc
Binary file not shown.
61 changes: 38 additions & 23 deletions resourceAllocation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import math
import random
import unittest
import copy
from itertools import chain

import genetic
Expand All @@ -25,7 +26,7 @@ def generate_time_sched(genes, index, arrayOfDependencies, arrayOfDuration):
for i in range(len(arrayOfDependencies)):
if arrayOfDependencies[i][1] == index:
timeTemp = genes[arrayOfDependencies[i][0]][0] # time schedule of task j
res = random.randrange(timeTemp, 90)
res = random.randrange(timeTemp, 75)
return res
return timeSched

Expand Down Expand Up @@ -74,39 +75,53 @@ def display(candidate, startTime):
candidate.Strategy.name,
timeDiff))

def mutate(genes, fnGetFitness, arrayOfDependencies, arrayOfDuration):
# genes[index][0] = generate_time_sched(genes, index, arrayOfDependencies, arrayOfDuration)
# index = random.randrange(1, len(genes)+1)
# tempGenes[index][0] = random.randrange(0,71)

def get_distance(locationA, locationB):
return 0

# return tempGenes

def mutate(genes, fnGetFitness, arrayOfDependencies, arrayOfDuration, bestParent):
initialFitness = fnGetFitness(genes)
a = 0
# return genes

tempGenes = copy.deepcopy(genes)
index = random.randrange(1, len(genes)+1)
for _ in range(0,20):
# import pdb; pdb.set_trace()
a = genes[index][0]
genes[index][0] = generate_time_sched(genes, index, arrayOfDependencies, arrayOfDuration)

fitness = fnGetFitness(genes)
initialFitness = fnGetFitness(genes)
for _ in range(70):
tempGenes[index][0] = generate_time_sched(genes, index, arrayOfDependencies, arrayOfDuration)
fitness = fnGetFitness(tempGenes)
if fitness > initialFitness:
return
genes[index][0] = a
return
return tempGenes
return tempGenes

def crossover(genes, donorGenes, fnGetFitness):
tempGenes = copy.deepcopy(genes)
tempDonor = copy.deepcopy(donorGenes)
initialFitness = fnGetFitness(genes) if (fnGetFitness(genes) > fnGetFitness(donorGenes)) else fnGetFitness(donorGenes)

# import pdb; pdb.set_trace()
for i in range(1,11):

genes[i][0], donorGenes[i][0] = donorGenes[i][0], genes[i][0]
childGenes = genes if (fnGetFitness(genes) > fnGetFitness(donorGenes)) else donorGenes
# i = random.randrange(1, 11)

tempGenes[i][0], tempDonor[i][0] = tempDonor[i][0], tempGenes[i][0]
childGenes = tempGenes if (fnGetFitness(tempGenes) > fnGetFitness(tempDonor)) else tempDonor
if fnGetFitness(childGenes) > initialFitness:
return childGenes
donorGenes[i][0], genes[i][0] = genes[i][0], donorGenes[i][0]
return genes
# donorGenes[i][0], genes[i][0] = genes[i][0], donorGenes[i][0]

return childGenes

# initialFitness = fnGetFitness(genes) if (fnGetFitness(genes) > fnGetFitness(donorGenes)) else fnGetFitness(donorGenes)

# for i in range(1,11):

# genes[i][0], donorGenes[i][0] = donorGenes[i][0], genes[i][0]
# childGenes = genes if (fnGetFitness(genes) > fnGetFitness(donorGenes)) else donorGenes

# if fnGetFitness(childGenes) > initialFitness:
# return childGenes
# donorGenes[i][0], genes[i][0] = genes[i][0], donorGenes[i][0]
# return genes

class ResourceAllocationTest(unittest.TestCase):
geneSet = "01"
Expand All @@ -130,8 +145,8 @@ def fnGetFitness(genes):
return get_fitness_of_duration(genes,numberOfTask, arrayOfDependencies,
arrayOfDuration)

def fnMutate(genes, bestParent):
mutate(genes, fnGetFitness, arrayOfDependencies, arrayOfDuration, bestParent)
def fnMutate(genes):
return mutate(genes, fnGetFitness, arrayOfDependencies, arrayOfDuration)

def fnCrossover(genes, donor):
return crossover(genes, donor, fnGetFitness)
Expand Down
36 changes: 11 additions & 25 deletions selections.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
import random
import operator
import numpy

def random_selection(parents, index):
donorIndex = random.randrange(0, len(parents))
if donorIndex == index:
donorIndex = (donorIndex + 1) % len(parents)
def random_selection(parents):
index = random.randrange(0, len(parents))

# import pdb; pdb.set_trace()
return parents[donorIndex]
return parents[index]

def roulette_selection(parents):
'''
Selects individuals to be parents based on their fitness proportion
'''

# sorted_pop = sorted(parents, key=operator.attrgetter('Fitness'))
# parents_pop's first is the best distance

sum_fits = 0
# import pdb; pdb.set_trace()
for ind in parents:
Expand All @@ -29,21 +24,12 @@ def roulette_selection(parents):
if current > pick:
return ind

# sum_fits = sum(operator.attrgetter('Fitness'))
def tournament_selection(parents, pressure):

# max_fitness = max(population, key=operator.attrgetter(fitness_name))
# if minimization:
# sum_fits = sum(max_fitness - operator.attrgetter(fitness_name)(ind) for ind in population)
# else:
# sum_fits = sum(operator.attrgetter(fitness_name)(ind) for ind in population)

# pick = random_state.uniform(0, sum_fits)
# current = 0
# for ind in sorted_pop:
# if minimization:
# current += (max_fitness - ind.fitness)
# else:
# current += ind.fitness
tournament_pool_size = int(len(parents)*pressure)
tournamet_pool = numpy.random.choice(parents, size=tournament_pool_size, replace=False)
# import pdb; pdb.set_trace()
return max(tournamet_pool, key=operator.attrgetter('Fitness'))

# if current > pick:
# return ind
def best_selection(parents):
return parents[len(parents)-1]
Binary file modified selections.pyc
Binary file not shown.