Foros del Web » Programando para Internet » Python »

problema, 'int' object is unsubscriptable

Estas en el tema de problema, 'int' object is unsubscriptable en el foro de Python en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 02/10/2010, 10:53
 
Fecha de Ingreso: noviembre-2009
Mensajes: 186
Antigüedad: 14 años, 4 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
  #2 (permalink)  
Antiguo 02/10/2010, 21:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: problema, 'int' object is unsubscriptable

Estas mezclando tipos de datos. Checa el constructor de la clase Cromosoma.

Código Python:
Ver original
  1. class Cromosoma():
  2.     def __init__(self, cromosoma="-1", aptitud=-1):
  3.         if cromosoma == "-1": #Por que es un string?
  4.             self.cromosoma=self.GenesAleatorios() #Vamos a ver que regresa GenesAleatorios
  5.         else:
  6.             self.cromosoma=cromosoma
  7.            
  8.         if aptitud == -1:
  9.             self.aptitud=0.0
  10.         else:
  11.             self.aptitud=aptitud
  12.  
  13.  
  14.     def GenesAleatorios(self): #Sorpresa nunca retorno nada
  15.  
  16.         for i in self.cromosoma: #Si self.cromosoma es un entero esto truena
  17.  
  18.             if random.random() < 0.5: #devuelve float entre 0 y 1
  19.                 i = "0"
  20.  
  21.             else:
  22.                 i = "1"
Cuando instancias un objeto cromosoma lo instancias:
Código Python:
Ver original
  1. Cromosoma(-1, -1) #Por que el primer parametro es un entero? Si lo estas manejando como un string

Esos son los errores que vi en la clase Cromosoma en el constructor, ya no seguí viendo mas código.

Etiquetas: int, object
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:18.