import funcs
import random
import termNodes
import solution
[docs]class mutate:
"""
This node does a bitflip mutation while creating new solutions
"""
def __init__(self,parent):
"""
This constructor creates the node and sets it's parent
"""
self.depth = 0
self.height = 0
self.rate = 0.0
self.take = [1,2]
self.give = [1,2]
self.parent = parent
if parent:
self.depth = self.parent.depth+1
self.down = [None]
self.settings = None
if parent:
self.settings = self.parent.settings
[docs] def evaluate(self,sets):
if self.settings.curOp>=self.settings.maxOp:
return[]
rDown = None
if self.down[0]:
rDown = self.down[0].evaluate(sets)
else:
raise "Node addSet has no right child"
ret = []
for x in rDown:
y = x.duplicate()
y.mutate(self.rate)
ret.append(y)
self.settings.curOp+=len(rDown)
return ret
[docs] def update(self,depth,sets,settings):
d = self.down[0].update(depth+1,sets,settings)
self.depth = depth
self.height = d+1
self.settings = settings
return self.height
[docs] def randomize(self,sets,settings):
self.rate = random.random()
return
[docs] def fillTerms(self,sets,settings):
if not self.down[0]:
self.down[0] = random.choice(termNodes.termNodes)(self)
self.down[0].randomize(sets,settings)
else:
self.down[0].fillTerms(sets,settings)
[docs] def toString(self):
string = "mutate("+str(self.rate)+") "
string += self.down[0].toString()
return string
[docs] def toDict(self):
return {"mutate("+str(self.rate)+")":[self.down[0].toDict()]}
[docs] def makeProg(self,numTab,var):
tab = " "
indent = ""
for i in xrange(numTab):
indent+=tab
prog = self.down[0].makeProg(numTab,var+"0")
prog +="x"+var+"=[]\n"+indent
prog+= "for i in x"+var+"0:\n"+indent+tab
prog+= "y = i.duplicate()\n"+indent+tab
prog+= "y.mutate("+str(self.rate)+")\n"+indent+tab
prog+= "x"+var+".append(y)\n"+indent
return prog
[docs] def count(self):
return self.down[0].count()+1
class uniRecomb:
def __init__(self,parent):
"""
This constructor creates the node and sets it's parent
"""
self.depth = 0
self.height = 0
self.num = 0
self.rate = 0.0
self.take = [1,2]
self.give = [1,2]
self.parent = parent
if parent:
self.depth = self.parent.depth+1
self.down = [None]
self.settings = None
if parent:
self.settings = self.parent.settings
def evaluate(self,sets):
if self.settings.curOp>=self.settings.maxOp:
return[]
rDown = None
if self.down[0]:
rDown = self.down[0].evaluate(sets)
else:
raise "Node addSet has no right child"
self.settings.curOp+=self.num
ret = []
if not rDown:
return []
for i in xrange(self.num):
x = solution.solution(self.settings)
for j in xrange(len(x.bits)):
x.bits[j] = random.choice(rDown).bits[j]
ret.append(x)
return ret
def update(self,depth,sets,settings):
d = self.down[0].update(depth+1,sets,settings)
self.depth = depth
self.height = d+1
self.settings = settings
return self.height
def randomize(self,sets,settings):
if self.count==1:
take = [1]
self.num = random.randint(1,settings.maxChilds)
return
def fillTerms(self,sets,settings):
if not self.down[0]:
self.down[0] = random.choice(termNodes.termNodes)(self)
self.down[0].randomize(sets,settings)
else:
self.down[0].fillTerms(sets,settings)
def toString(self):
string = "uniRecomb(count ="+str(self.num)+") "
string += self.down[0].toString()
return string
def toDict(self):
return {"uniRecomb(count="+str(self.num)+")":[self.down[0].toDict()]}
def makeProg(self,numTab,var):
tab = " "
indent = ""
for i in xrange(numTab):
indent+=tab
prog = self.down[0].makeProg(numTab,var+"0")
prog+= "#Uniform Recombination\n"+indent
prog+= "x"+var+"=[]\n"+indent
prog+= "if x"+var+"0:\n"+indent+tab
prog+= "for i in xrange("+str(self.num)+"):\n"+indent+tab+tab
prog+= "y = solution.solution(s)\n"+indent+tab+tab
prog+= "for j in xrange(len(y.bits)):\n"+indent+tab+tab+tab
prog+= "y.bits[j] = random.choice(x"+var+"0).bits[j]\n"+indent+tab+tab
prog+= "x"+var+".append(y)\n"+indent
return prog
def count(self):
return self.down[0].count()+1
class diagRecomb:
def __init__(self,parent):
"""
This constructor creates the node and sets it's parent
"""
self.depth = 0
self.height = 0
self.n = 0
self.rate = 0.0
self.take = [1,2]
self.give = [1,2]
self.parent = parent
if parent:
self.depth = self.parent.depth+1
self.down = [None]
self.settings = None
if parent:
self.settings = self.parent.settings
def evaluate(self,sets):
if self.settings.curOp>=self.settings.maxOp:
return[]
rDown = None
if self.down[0]:
rDown = self.down[0].evaluate(sets)
else:
raise "Node addSet has no right child"
self.settings.curOp+=self.n
ret = funcs.diagonal(rDown,self.n)
return ret
def update(self,depth,sets,settings):
d = self.down[0].update(depth+1,sets,settings)
self.depth = depth
self.height = d+1
self.settings = settings
return self.height
def randomize(self,sets,settings):
self.n = random.randint(1,settings.maxN)
return
def fillTerms(self,sets,settings):
if not self.down[0]:
self.down[0] = random.choice(termNodes.termNodes)(self)
self.down[0].randomize(sets,settings)
else:
self.down[0].fillTerms(sets,settings)
def toString(self):
string = "diagonal(n ="+str(self.n)+") "
string += self.down[0].toString()
return string
def toDict(self):
return {"diagonal(n="+str(self.n)+")":[self.down[0].toDict()]}
def makeProg(self,numTab,var):
tab = " "
indent = ""
for i in xrange(numTab):
indent+=tab
prog = self.down[0].makeProg(numTab,var+"0")
prog+= "#diagonal Recombination\n"+indent
prog+= "x"+var+"=diagonal(x"+var+"0,"+str(self.n)+")\n"+indent
return prog
def count(self):
return self.down[0].count()+1
class tweak:
def __init__(self,parent):
"""
This constructor creates the node and sets it's parent
"""
self.depth = 0
self.height = 0
self.rate = 0.0
self.take = [1,2]
self.give = [1,2]
self.parent = parent
if parent:
self.depth = self.parent.depth+1
self.down = [None]
self.settings = None
if parent:
self.settings = self.parent.settings
def evaluate(self,sets):
if self.settings.curOp>=self.settings.maxOp:
return[]
rDown = None
if self.down[0]:
rDown = self.down[0].evaluate(sets)
else:
raise "Node addSet has no right child"
for i in xrange(len(rDown)):
rDown[i].mutate(self.rate)
self.settings.curOp+=len(rDown)
return rDown
def update(self,depth,sets,settings):
d = self.down[0].update(depth+1,sets,settings)
self.depth = depth
self.height = d+1
self.settings = settings
return self.height
def randomize(self,sets,settings):
self.rate = random.random()
return
def fillTerms(self,sets,settings):
if not self.down[0]:
self.down[0] = random.choice(termNodes.termNodes)(self)
self.down[0].randomize(sets,settings)
else:
self.down[0].fillTerms(sets,settings)
def toString(self):
string = "tweak("+str(self.rate)+") "
string += self.down[0].toString()
return string
def toDict(self):
return {"tweak("+str(self.rate)+")":[self.down[0].toDict()]}
def makeProg(self,numTab,var):
tab = " "
indent = ""
for i in xrange(numTab):
indent+=tab
prog = self.down[0].makeProg(numTab,var+"0")
prog += "x"+var+" = []\n"+indent
prog+= "for i in xrange(len(x"+var+"0)):\n"+indent+tab
prog+= "x"+var+"0[i].mutate("+str(self.rate)+")\n"+indent+tab
prog+= "x"+var+" = x"+var+"0\n"+indent
return prog
def count(self):
return self.down[0].count()+1
alterNodes = [tweak,mutate,uniRecomb,diagRecomb]