Springen naar inhoud

[python] Geneties Programmeren


  • Log in om te kunnen reageren

#1

bluatigro

    bluatigro


  • 0 - 25 berichten
  • 4 berichten
  • Gebruiker

Geplaatst op 31 juli 2013 - 08:55

dit is een poging om tot GP te komen met python
de class is vrijwel zonder errors
er zit echter n lelijke error in de gebruik van de class
import math
import random
ADD	  = "[ + # # # ]"
SUBTRACT = "[ - # # # ]"
MULTIPLY = "[ * # # # ]"
DIVIDE   = "[ / # # # ]"
class CGP( object ) :
  
	def __init__( self ) :
	  
		self.genes = []
		self.numbermode = 0
		self.inputmax = 0
		self.invoer = []
	def set_inputmax( self , no ) :
		a = "abcdefghjk"
		i = 0
		while i < len( a ) and i <= no - 1 :
			self.use( a[ i ] )
			i += 1
		for i in xrange( len( a ) + 2 ) :
			self.invoer.append( 0. )
	def set_input( self , no , x ) :
		if no < 0 or no > 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

			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.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 = float( gp.run( lprog[ t ] ) )
		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 ] )

Veranderd door bluatigro, 31 juli 2013 - 08:57


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

bluatigro

    bluatigro


  • 0 - 25 berichten
  • 4 berichten
  • Gebruiker

Geplaatst op 02 augustus 2013 - 10:17

hier is n proof of concept

ik heb de error lines ge#
en de nodige indent veranderd

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  = "[ <a< # # # ]"
#TAN	  = "[ tan # # # ]"
#SIN	  = "[ sin # # # ]"
#COS	  = "[ cos # # # ]"
#ATAN	 = "[ atan # # # ]"
#ATAN2    = "[ atan2 # # # ]"
class CGP( object ) :
   
    def __init__( self ) :
	   
	    self.genes = []
	    self.numbermode = 0
	    self.inputmax = 0
	    self.invoer = []
#    def set_inputmax( self , no ) :
#	    a = "abcdefghjk"
#	    i = 0
#	    while i < len( a ) and i <= no - 1 :
#		    self.use( a[ i ] )
#		    i += 1
#	    for i in xrange( len( a ) + 2 ) :
#		    self.invoer.append( 0. )
#    def set_input( self , no , x ) :
#	    if no < 0 or no > 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 ] )
			   





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures