Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/10/2010, 10:53
stiwi222
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 2
problema, 'int' object is unsubscriptable

bueno, la cosa es que me salta este error aunque a lo que intento acceder es una cadena, no un numero. sera mas claro cuando se vea el codigo:
Código Python:
Ver original
  1. import random
  2.  
  3. LON_CROMO = 50
  4. POBLACION = 100
  5. TASA_MUTACION = 0.001
  6. TASA_CRUCE = 0.74
  7. MAX_GENERACIONES = 300
  8.  
  9.  
  10.  
  11. class Cromosoma():
  12.  
  13.     def __init__(self, cromosoma="-1", aptitud=-1):
  14.  
  15.         if cromosoma == "-1":
  16.             self.cromosoma=self.GenesAleatorios()
  17.  
  18.         else:
  19.             self.cromosoma=cromosoma
  20.  
  21.         if aptitud == -1:
  22.             self.aptitud=0.0
  23.  
  24.         else:
  25.             self.aptitud=aptitud
  26.  
  27.  
  28.     def GenesAleatorios(self):
  29.  
  30.         for i in self.cromosoma:
  31.  
  32.             if random.random() < 0.5: #devuelve float entre 0 y 1
  33.                 i = "0"
  34.  
  35.             else:
  36.                 i = "1"
  37.  
  38.  
  39.     def CalcularAptitud(self, x_buscada, y_buscada, x, y):
  40.  
  41.         for i in range(LON_CROMO-2):
  42.  
  43.             gen = self.cromosoma[i:i+2]
  44.  
  45.             if gen == "00":    #arriba
  46.              x -= 1
  47.  
  48.             elif gen == "01":  #abajo
  49.              x += 1
  50.  
  51.             elif gen == "10":  #derecha
  52.              y += 1
  53.  
  54.             elif gen == "11":  #izquierda
  55.              y -= 1
  56.  
  57.             if x == x_buscada and y == y_buscada:
  58.                 return float(999)
  59.  
  60.             else:
  61.                 continue
  62.  
  63.         return  1/float(abs((x_buscada + y_buscada) - (x + y)))
  64.  
  65.  
  66.     def Mutacion(self):
  67.  
  68.         for i in range(LON_CROMO):
  69.             if random.random() < TASA_MUTACION:
  70.  
  71.                if self.cromosoma[i] == "0":
  72.                    self.cromosoma[i] = "1"
  73.  
  74.                elif self.cromosoma[i] == "1":
  75.                    self.cromosoma[i] = "0"
  76.                
  77.  
  78.     def MostrarCromo(self):
  79.  
  80.         for i in range(LON_CROMO-2):
  81.  
  82.             if self.cromosoma[i:i+2] == "00":
  83.                 print "ve hacia arriba\n"
  84.  
  85.             elif self.cromosoma[i:i+2] == "01":
  86.                 print "ahora hacia abajo\n"
  87.  
  88.             elif self.cromosoma[i:i+2] == "10":
  89.                 print "gira a la derecha\n"
  90.  
  91.             elif self.cromosoma[i:i+2] == "11":
  92.                 print "ahora vete a la izquierda\n"
  93.  
  94.  
  95. def cruce(t1, t2):
  96.  
  97.     if random.random() < TASA_CRUCE:
  98.  
  99.         punto = int(random.random() * LON_CROMO)
  100.  
  101.         hijo1 = t1[0:punto] + t2[punto:]
  102.         hijo2 = t2[0:punto] + t1[punto:]
  103.  
  104.         return hijo1, hijo2 #tupla de la que luego extraemos los datos
  105.  
  106. def ruleta(aptitud_total, poblacion):
  107.  
  108.     porcion = float(random.random() * aptitud_total)
  109.     aptitud_acumulada = 0.0
  110.  
  111.     for i in range(POBLACION):
  112.  
  113.         aptitud_acumulada += poblacion[i].aptitud
  114.  
  115.         if aptitud_acumulada > porcion:
  116.  
  117.             return poblacion[i].genes
  118.         break
  119.  
  120.  
  121. def main():
  122.  
  123.     random.seed()
  124.  
  125.     while True:
  126.         x = input("¿donde empezamos? (x): ")
  127.         y = input("¿en que parte del eje y?: ")
  128.         x_objetivo = input("destino en x: ")
  129.         y_objetivo = input("el destino y: ")
  130.  
  131.         poblacion = []
  132.  
  133.         for i in range(POBLACION):
  134.  
  135.             poblacion.append(Cromosoma(-1, -1))
  136.  
  137.         generaciones = 0
  138.         encontrado = 0     #si es 0 no hemos llegado llegado a una solución correcta
  139.  
  140.         while not encontrado:
  141.  
  142.             aptitud_total = 0.0
  143.  
  144.             for i in range(POBLACION):
  145.  
  146.                 poblacion[i].CalcularAptitud(x_objetivo, y_objetivo, x, y)
  147.  
  148.                 aptitud_total += poblacion[i].aptitud
  149.  
  150.             for i in range(POBLACION):
  151.  
  152.                 if poblacion[i].aptitud == 999:
  153.                     print "solucion encontrada en ", generaciones, " generaciones!!!"
  154.  
  155.                     poblacion[i].MostrarCromo()
  156.  
  157.                     encontrado = 1
  158.                     break
  159.  
  160.             #empezamos a construir la nueva generacion
  161.  
  162.             temporal[POBLACION] =  Cromosoma()
  163.  
  164.             i = 0
  165.  
  166.             while i < POBLACION:
  167.  
  168.                 hijo1 = ruleta(aptitud_total, poblacion)
  169.                 hijo2 = ruleta(aptitud_total, poblacion)
  170.  
  171.                 hijo1, hijo2 = cruce(hijo1, hijo2)
  172.  
  173.                 hijo1.mutacion()
  174.                 hijo2.mutacion()
  175.  
  176.                 temporal[i] = Cromosoma(hijo1, 0.0)
  177.                 i += 1
  178.  
  179.                 temporal[i] = Cromosoma(hijo2, 0.0)
  180.                 i += 1
  181.  
  182.  
  183.             for i in range(POBLACION):
  184.  
  185.                 poblacion[i] = temporal[i]
  186.  
  187.             if MAX_GENERACIONES < generaciones:
  188.                 print "no hay solucion en ", generaciones, " generaciones"
  189.  
  190.                 encontrado = 1
  191.  
  192.         #while not encontrado
  193.  
  194.     return 0
  195.  
  196. main()

salta en la linea 43, y no se por que, alguna idea?

gracias