Advertisement
EduPsEudo

Missionarios e Canibais Finalizado

Aug 15th, 2023
892
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.55 KB | None | 0 0
  1. import random
  2.  
  3. # Representação da melhor solução = [(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.         if (missionarios > 3 or canibais > 3 or missionarios < 0 or canibais < 0):
  16.             return -1
  17.        
  18.     return (6 - missionarios - canibais)
  19.  
  20.  
  21. def printa_solucao(movimentos):
  22.     missionarios = 3
  23.     canibais = 3
  24.  
  25.     for move in movimentos:
  26.         missionarios -= move[0] - move[2]
  27.         canibais -= move[1] - move[3]
  28.  
  29.         print(f'Inicio: {missionarios}|{canibais}, Fim: {abs(missionarios - 3)}|{abs(canibais - 3)}')
  30.    
  31.    
  32. def movimentos(lado):
  33.     moves = []
  34.     # Indo
  35.     if lado == 0:
  36.         moves.append((1, 0, 0, 0))
  37.         moves.append((1, 1, 0, 0))
  38.         moves.append((2, 0, 0, 0))
  39.         moves.append((0, 1, 0, 0))
  40.         moves.append((0, 2, 0, 0))
  41.     #Voltando
  42.     if lado == 1:
  43.         moves.append((0, 0, 1, 0))
  44.         moves.append((0, 0, 1, 1))
  45.         moves.append((0, 0, 2, 0))
  46.         moves.append((0, 0, 0, 1))
  47.         moves.append((0, 0, 0, 2))
  48.  
  49.     return random.choice(moves)
  50.  
  51. def gera_individuo():
  52.     estados = random.randint(5, 15)
  53.     individuo = []
  54.  
  55.     while estados > 0:
  56.             individuo.append(movimentos(len(individuo) % 2))
  57.             if (apt(individuo) == -1):
  58.                 individuo.pop()
  59.                 continue
  60.             estados -= 1
  61.  
  62.     return individuo
  63.  
  64. # Gera população
  65. def initial_population(num_individuos):
  66.     return [gera_individuo() for _ in range(num_individuos)]
  67.  
  68. def mutacao(populacao):
  69.     for i in range(len(populacao)):
  70.         r = random.randint(0, 100)
  71.  
  72.         if r >= 60:                         # Chance de mutar 40%
  73.             if (apt(populacao[i]) != 6):
  74.                 while True:
  75.                     populacao[i].append(movimentos(len(populacao[i]) % 2))
  76.                     if (apt(populacao[i]) != -1):
  77.                         break
  78.                     else:
  79.                         populacao[i].pop()
  80.  
  81.     return populacao
  82.  
  83. def ordernacao(pop, num_individuos):
  84.     fitness = [apt(p) for p in pop]
  85.     sorted_pop = [(pop[i], fitness[i]) for i in range(len(pop))]
  86.     sorted_pop.sort(key=lambda s: s[1], reverse=True)
  87.     sorted_pop = [i[0] for i in sorted_pop]
  88.  
  89.     return sorted_pop[:num_individuos]
  90.  
  91. def selecao(pop, num_individuos):
  92.  
  93.     deletados = 0
  94.     for i,ind in enumerate(pop):
  95.         if (len(ind) > 20):
  96.             pop.pop(i)
  97.             deletados += 1
  98.  
  99.     for i in range(deletados):
  100.         pop.append(gera_individuo())
  101.  
  102.     pop = ordernacao(pop, num_individuos)
  103.  
  104.     return pop
  105.  
  106. if __name__ == "__main__":
  107.  
  108.     # Melhor aptidão: 6
  109.  
  110.     populacao = initial_population(10)
  111.     maiorAptidao = 0
  112.     rep = 0
  113.  
  114.     while rep < 250:
  115.         for i in range(len(populacao)):
  116.             if apt(populacao[i]) == 6:
  117.                 maiorAptidao = apt(populacao[i])
  118.  
  119.         populacao = selecao(populacao, 10)
  120.         populacao = mutacao(populacao)
  121.        
  122.         rep += 1
  123.         print(f'Geração: {rep}')
  124.  
  125.     for i in range(len(populacao)):
  126.         print(f'Individuo: {i+1} - Função aptidao: {apt(populacao[i])}')
  127.  
  128.     print('\nSolução do melhor indivíduo:')
  129.     printa_solucao(populacao[0])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement