genetic programing ? - Programmers Heaven

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

genetic programing ?

bluatigrobluatigro Posts: 2Member
this is a try at GP
when i remove the #'s
python complains [ try it ]
what do i do wrong ?
[code]
import math
import random

ADD = "[ + # # # ]"
SUBTRACT = "[ - # # # ]"
MULTIPLY = "[ * # # # ]"
DIVIDE = "[ / # # # ]"
MOD = "[ % # # # ]"
POW = "[ ** # # # ]"

FLOOR = "[ floor # # # ]"
FABS = "[ fabs # # # ]"

SQRT = "[ sqrt # # # ]"

EXP = "[ exp # # # ]"
LOG10 = "[ log10 # # # ]"
LN = "[ ln # # # ]"
LOGX = "[ logx # # # ]"

# dont use : not jet ready

#IF = "[ ? # # # ]"
#EQUAL = "[ == # # # ]"
#UNEQUAL = "[ != # # # ]"
#GREAT = "[ > # # # ]"
#SMALL = "[ < # # # ]"
#BETWEEN = "[ len( self.invoer ) - 1 :
# self.invoer[ no ] = x

def run( self , prog ) :

l = "abcdefghijk"
while "]" in prog :
eind = prog.find( "]" )
begin = eind - 1
while prog[ begin ] != "[" :
begin -= 1
deel = prog[ begin : eind + 1 ]
q = deel.split()
func = q[ 1 ]

# if q[ 2 ] in l :
# a = self.invoer[ l.find( q[ 2 ] ) ]
# else :
a = float( q[ 2 ] )
# if q[ 3 ] in l :
# b = self.invoer[ l.find( q[ 3 ] ) ]
# else :
b = float( q[ 3 ] )
# if q[ 4 ] in l :
# c = self.invoer[ l.find( q[ 4 ] ) ]
# else :
c = float( q[ 4 ] )

if func == "+" :
ab = a + b
elif func == "*" :
ab = a * b
elif func == "-" :
ab = a - b
elif func == "/" :
if b == 0.0 :
return "error"
else :
ab = a / b
elif func == "%" :
if b == 0 :
return "error"
else :
ab = a % b

elif func == "sqrt" :
if a < 0 :
return "error"
else :
ab = math.sqrt( a )

elif func == "floor" :
ab = math.floor( a )

elif func == "fabs" :
ab = math.fabs( a )

elif func == "exp" :
if math.fabs( a ) > 32 :
return "error"
else :
ab = math.exp( a )
elif func == "log10" :
if a <= 0 :
return "error"
else :
ab = math.log( a , 10. )
elif func == "ln" :
if a <= 0 :
return "error"
else :
ab = math.log( a , math.e )
elif func == "logx" :
if a <= 0 or b <= 0 or b == 1 :
return "error"
else :
ab = math.log( a , b )
elif func == "**" :
if math.fabs( math.log( a , 10. )
* math.log( b , 10. ) ) > 13. :
return "error"

else :
return "error"

l = prog[ : begin ]
m = `ab`
r = prog[ eind + 1 : ]
prog = l + m + r

return prog

def write( self , hooks ) :

dice = random.randint( 0 , len( self.genes )-1 )
while not "[" in self.genes[ dice ] :
dice = random.randint( 0 , len( self.genes )-1 )
prog = self.genes[ dice ]

tel = 0
while "#" in prog and tel < hooks :
p = prog.find( "#" )
dice = random.randint( 0 , len( self.genes ) - 1 )
m = self.genes[ dice ]
if "#" in m :
tel += 1
l = prog[ : p ]
r = prog[ p + 1 : ]
prog = l + m + r

while "#" in prog :
p = prog.find( "#" )
dice = random.randint( 0 , len( self.genes ) - 1 )
while "[" in self.genes[ dice ] :
dice = random.randint( 0 ,
len( self.genes ) - 1 )
m = self.genes[ dice ]
l = prog[ : p ]
r = prog[ p + 1 : ]
prog = l + m + r

return prog

def mix( self , a , b ) :

la = []
for i in xrange( len( a ) ) :
if a[ i ] == "[" :
la.append( i )

lb = []
for i in xrange( len( b ) ) :
if b[ i ] == "[" :
lb.append( i )

dice = random.randint( 0 , len( la ) - 1 )

begina = la[ dice ]

fl = 1
i = begina + 1
while fl > 0 and i < len( a ) :
if a[ i ] == "[" : fl += 1
if a[ i ] == "]" : fl -= 1
i += 1
einda = i

dice = random.randint( 0 , len( lb ) - 1 )

beginb = lb[ dice ]

fl = 1
i = beginb + 1
while fl > 0 and i < len( b ) :
if b[ i ] == "[" : fl += 1
if b[ i ] == "]" : fl -= 1
i += 1
eindb = i

l = a[ : begina ]
m = b[ beginb : eindb + 1 ]
r = a[ einda : ]

return l + m + r

def mutate( self , prog ) :
a = "abcdefghijk"
lp = prog.split()
dice = random.randint( 0 , len( lp ) - 1 )
atom = lp[ dice ]
while atom in ( "[" , "]" ) :
dice = random.randint( 0 , len( lp ) - 1 )
atom = lp[ dice ]
# atom is number
if atom[ 0 ] in "0123456789" :
f = float( atom )
if self.inputmax > 0 :
if random.randint( 0 , 10 ) == 0 :
lp[ dice ] = a[ random.randint( 0 , len( a ) - 1 ) ]
else :
if self.numbermode == 1 :
if random.randint( 0 , 2 ) == 0 :
f += 2**random.randint( 0 , 32 )
else :
f -= 2**random.randint( 0 , 32 )
else :
if random.randint( 0 , 2 ) == 0 :
f += 2**random.randint( -31 , 32 )
else :
f -= 2**random.randint( -31 , 32 )
lp[ dice ] = str( f )
else :
if self.numbermode == 1 :
if random.randint( 0 , 2 ) == 0 :
f += 2**random.randint( 0 , 32 )
else :
f -= 2**random.randint( 0 , 32 )
else :
if random.randint( 0 , 2 ) == 0 :
f += 2**random.randint( -31 , 32 )
else :
f -= 2**random.randint( -31 , 32 )
lp[ dice ] = str( f )

elif atom in "abcdefghijk" :

if random.randint( 0 , 10 ) > 0 :
lp[ dice ] = a[ random.randint( 0 , len( a ) - 1 )]
else :
if self.numbermode == 1 :
if random.randint( 0 , 2 ) == 0 :
f = 2**random.randint( 0 , 32 )
else :
f = -2**random.randint( 0 , 32 )
else :
if random.randint( 0 , 2 ) == 0 :
f = 2**random.randint( -31 , 32 )
else :
f = -2**random.randint( -31 , 32 )
lp[ dice ] = str( f )

else : # atom is function

d = random.randint( 0 , len( self.genes ) - 1 )
while not "[" in self.genes[ d ] :
d = random.randint( 0 ,
len( self.genes ) - 1 )

l = self.genes[ d ].split()
func = l[ 1 ]

lp[ dice ] = func

prog = ""
for i in xrange( len( lp ) ) :
prog += lp[ i ] + " "

return prog

def use( self , gen ) :
self.genes.append( gen )

def intlist( self ) :
for i in xrange( 32 ) :
self.use( str( 2**i ) )
self.numbermode = 1

def dbllist( self ) :
for i in range( -31 , 31 ) :
self.use( str( 2**i ) )
self,numbermode = 2

gp = CGP()

gp.use( ADD )
gp.use( SUBTRACT )
gp.use( MULTIPLY )
gp.use( DIVIDE )
gp.use( MOD )
gp.use( POW )

gp.use( FLOOR )
gp.use( FABS )

gp.use( SQRT )

gp.use( EXP )
gp.use( LOG10 )
gp.use( LN )
gp.use( LOGX )

gp.intlist()

#gp.set_inputmax( 3 )

lprog = []
lfout = []
for i in xrange( 10 ) :
lprog.append( gp.write( 6 ) )
lfout.append( 0. )

for i in range( 20 ) :
for t in xrange( len( lprog ) - 1 ) :
uit_str = gp.run( lprog[ t ] )
if uit_str == "error" :
uit = 1e10
else :
uit = float( uit_str )
lfout[ t ] == math.fabs( uit - math.pi )

for h in xrange( len( lprog ) - 1 ) :
for l in range( 0 , h ) :
if lfout[ l ] > lfout[ h ] :
hp = lprog[ l ]
lprog[ l ] = lprog[ h ]
lprog[ h ] = hp
hf = lfout[ l ]
lfout[ l ] = lfout[ h ]
lfout[ h ] = hf

print lprog[ 0 ]

for i in range( 4 , len( lprog ) ) :
a = lprog[ random.randint( 0 , 3 ) ]
b = lprog[ random.randint( 0 , 3 ) ]
lprog[ i ] = gp.mix( a , b )
if random.randint( 0 , 10 ) < 2 :
lprog[ i ] = gp.mutate( lprog[ i ] )

[/code]
Sign In or Register to comment.