EduPsEudo

Missionarios e Canibais v3

Aug 15th, 2023
1,007
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.89 KB | None | 1 0
  1. import random
  2.  
  3. # Representação do ótimo = [(0, 2, 0, 0), (0, 0, 0, 1), (0, 2, 0, 0), (0, 0, 0, 1), (2, 0, 0, 0), (0, 0, 1, 1), (2, 0, 0, 0), (0, 0, 0, 1), (0, 2, 0, 0), (0, 0, 0, 1), (0, 2, 0, 0)]
  4.  
  5. def apt(movimentos):
  6.     missionarios = 3
  7.     canibais = 3
  8.  
  9.     for move in movimentos:
  10.         missionarios -= move[0] - move[2]
  11.         canibais -= move[1] - move[3]
  12.  
  13.         if (missionarios < canibais and (abs(missionarios - 3) < abs(canibais - 3))):
  14.             return -1
  15.        
  16.         if (missionarios > 3 or canibais > 3 or missionarios < 0 or canibais < 0):
  17.             return -1
  18.        
  19.     return (6 - missionarios - canibais)
  20.  
  21.  
  22. def printa_solucao(movimentos):
  23.     missionarios = 3
  24.     canibais = 3
  25.  
  26.     for move in movimentos:
  27.         missionarios -= move[0] - move[2]
  28.         canibais -= move[1] - move[3]
  29.  
  30.         print(f'Inicio: {missionarios}|{canibais}, Fim: {abs(missionarios - 3)}|{abs(canibais - 3)}')
  31.    
  32.    
  33. def movimentos(lado):
  34.     moves = []
  35.  
  36.     # Indo
  37.     if lado == 0:
  38.         moves.append((1, 0, 0, 0))
  39.         moves.append((1, 1, 0, 0))
  40.         moves.append((2, 0, 0, 0))
  41.         moves.append((0, 1, 0, 0))
  42.         moves.append((0, 2, 0, 0))
  43.  
  44.     #Voltando
  45.     if lado == 1:
  46.         moves.append((0, 0, 1, 0))
  47.         moves.append((0, 0, 1, 1))
  48.         moves.append((0, 0, 2, 0))
  49.         moves.append((0, 0, 0, 1))
  50.         moves.append((0, 0, 0, 2))
  51.  
  52.     return random.choice(moves)
  53.  
  54. def initial_population(num_individuos): # Gera população
  55.  
  56.     population=[]
  57.    
  58.     for i in range(num_individuos):
  59.  
  60.         estados = random.randint(5, 15)
  61.         individuo = []
  62.  
  63.         while estados > 0:
  64.             individuo.append(movimentos(len(individuo) % 2))
  65.             if (apt(individuo) == -1):
  66.                 individuo.pop()
  67.                 continue
  68.             estados -= 1
  69.  
  70.         print(f'Movimentos gerados: {individuo}')
  71.         population.append(individuo)
  72.    
  73.     return population
  74.  
  75. def mutacao(populacao):
  76.     for i in range(len(populacao)):
  77.         if apt(populacao[i]) < 4:
  78.             populacao[i].append(movimentos(len(populacao[i]) % 2))
  79.  
  80.     return populacao
  81.  
  82. if __name__ == "__main__":
  83.    
  84.     # solucao = [(0, 2, 0, 0), (0, 0, 0, 1), (0, 2, 0, 0), (0, 0, 0, 1), (2, 0, 0, 0), (0, 0, 1, 1), (2, 0, 0, 0), (0, 0, 0, 1), (0, 2, 0, 0), (0, 0, 0, 1), (0, 2, 0, 0)]
  85.  
  86.     populacao = initial_population(10)
  87.     printa_solucao(populacao[0])
  88.  
  89.     for i in range(len(populacao)):
  90.         print(f'Individuo: {i} - Função aptidao: {apt(populacao[i])}')
  91.  
  92.     maiorAptidao = 0
  93.     rep = 0
  94.  
  95.     while maiorAptidao < 5:
  96.         for i in range(len(populacao)):
  97.             if apt(populacao[i]) > maiorAptidao:
  98.                 print('teste2')
  99.                 maiorAptidao = apt(populacao[i])
  100.         rep += 1
  101.         # print(rep)
  102.         populacao = mutacao(populacao)
  103.    
  104.     # apt(populacao[0])
  105.     # print(populacao)
Advertisement
Add Comment
Please, Sign In to add comment