<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Vinicius Petratti</title>
    <description>The latest articles on Forem by Vinicius Petratti (@vinipetra).</description>
    <link>https://forem.com/vinipetra</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1040621%2F237e73ef-af8f-42b1-a11f-7e90488127ee.jpeg</url>
      <title>Forem: Vinicius Petratti</title>
      <link>https://forem.com/vinipetra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vinipetra"/>
    <language>en</language>
    <item>
      <title>Algoritmos Genéticos e sua Implementação na Prática</title>
      <dc:creator>Vinicius Petratti</dc:creator>
      <pubDate>Thu, 20 Apr 2023 20:45:40 +0000</pubDate>
      <link>https://forem.com/vinipetra/algoritmos-geneticos-e-sua-implementacao-na-pratica-4g1o</link>
      <guid>https://forem.com/vinipetra/algoritmos-geneticos-e-sua-implementacao-na-pratica-4g1o</guid>
      <description>&lt;h1&gt;
  
  
  O que são algoritmos genéticos?
&lt;/h1&gt;

&lt;p&gt;Algoritmos genéticos (AG) são uma ferramenta poderosíssima para solução de problemas de busca e otimização que consistem em tentar várias soluções e usar a informação coletada em cada tentativa para melhorar a qualidade da próxima sugestão. Os AGs são inspirados na teoria da evolução de Darwin e implementam conceitos como sobrevivência dos mais adaptados, seleção natural, mutação, entre outros. São considerados biomiméticos por se inspirarem na natureza para solucionar problemas. Inclusive, eu escrevi um artigo sobre isso! você pode acessá-lo aqui: &lt;a href="https://dev.to/vinipetra/biomimetica-por-que-sair-e-tocar-grama-pode-realmente-ser-a-resposta-para-o-seu-problema-4a1k"&gt;Biomimética: Por que sair e "tocar grama" pode realmente ser a resposta para o seu problema&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesta publicação, explicarei como funciona o algoritmo genético em como o usei para resolver um problema na prática.&lt;/p&gt;

&lt;p&gt;Você pode acessar o repositório do projeto aqui: &lt;a href="https://github.com/ViniPetra/GeneticAlgorithm-TheTravelingThief" rel="noopener noreferrer"&gt;GeneticAlgorithm-TheTravelingThief&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona o algoritmo genético?
&lt;/h2&gt;

&lt;p&gt;Como dito anteriormente, o AG implementa funções da teoria da evolução de Darwin. Para que possamos ter uma base melhor antes de falar do algoritmo, é preciso entender como funciona esta teoria.&lt;/p&gt;

&lt;h3&gt;
  
  
  A evolução Darwiniana
&lt;/h3&gt;

&lt;p&gt;Com o tempo, os seres vivos sofrem mudanças genéticas aleatórias (mutações) que podem causar vantagens adaptativas no ambiente em que vivem. Os indivíduos mais adaptados, pela seleção natural, têm mais chances de sobreviver e se reproduzirem, transferindo estas vantagens genéticas para a próxima geração. &lt;/p&gt;

&lt;h3&gt;
  
  
  Composição do algoritmo genético
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Gene&lt;br&gt;
Informação que será alterada pelo algoritmo genético. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cromossomo&lt;br&gt;
Estrutura de dados que contém a coleção de genes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Indivíduo&lt;br&gt;
Objeto que contenha o cromossomo e guarde o valor do fitness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;População&lt;br&gt;
Conjunto de indivíduos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mutação&lt;br&gt;
Função que alterará o gene do indivíduo. A mutação fará uma pequena alteração nos genes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crossover&lt;br&gt;
Função que cruzará cromossomos de indivíduos da população. O crossover é um tipo de mutação que combina dois indivíduos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fitness&lt;br&gt;
Função para pontuar o indivíduo. A função de fitness é uma das partes mais importantes do AG. É esta que define quão bem cada indivíduo performou e, portando, quão bem adaptado está. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seleção&lt;br&gt;
Função que decide quais indivíduos serão a população inicial da próxima geração. Esta função é a responsável por analisar o fitness de cada indivíduo e selecionar quais devem "sobreviver"&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Etapas do algoritmo genético
&lt;/h3&gt;

&lt;p&gt;O AG funciona da seguinte maneira:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;É gerada uma população inicial de indivíduos. Esta população pode ser aleatória ou não, dependendo de quão otimizado você precise que o código seja. &lt;/li&gt;
&lt;li&gt;À partir da população inicial, é criada a população que sofreu a mutação e a população que sofreu o crossover. Estas são somadas em uma só. Falarei melhor sobre mutação e crossover mais à frente.&lt;/li&gt;
&lt;li&gt;Todos os indivíduos da população total passam pela seleção, onde aqueles com maior pontuação de fitness (os mais adaptados) "sobrevivem" e se transformam na população inicial da próxima geração.&lt;/li&gt;
&lt;li&gt;Este processo é repetido até que alguma condição de parada seja atingida como erro mínimo ou gerações máximas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para facilitar a visualização, veja o código de um AG:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbngw88zfhrheamifgv6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbngw88zfhrheamifgv6b.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Algoritmo genético na prática
&lt;/h1&gt;

&lt;p&gt;Tudo é mais fácil de entender quando é bem exemplificado. À partir deste ponto, explicarei como eu utilizei um AG para solucionar um problema!&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introdução ao problema
&lt;/h3&gt;

&lt;p&gt;A AIC (Agência internacional do crime) propõe a Joana, o desafio de realizar roubos em várias cidades em apenas 72 horas. Joana deve viajar discretamente usando transporte coletivo pago e carregando os itens roubados em uma mochila de até 20 kg. Cada cidade possui um item valioso para ser roubado, mas cada roubo leva tempo para ser concluído. Além disso, as viagens entre as cidades têm um custo financeiro e levam tempo. Se ela conseguir roubar a quantidade máxima de itens, deverá retornar à sede da AIC na cidade  Escondidos para receber seu prêmio. &lt;/p&gt;

&lt;h3&gt;
  
  
  Dados do problema
&lt;/h3&gt;

&lt;p&gt;Os dados disponibilizados são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma tabela com dados dos itens:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqjew796pb5t43ebomti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqjew796pb5t43ebomti.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tabela com os dados de custo e tempo das viagens entre cidades:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstyr9v4zd9jjpn4rght9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstyr9v4zd9jjpn4rght9.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A tabela acima está incompleta pois é muito longa. A versão completa dela está disponível no repositório do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aplicação do algoritmo genético
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tratamento dos dados
&lt;/h3&gt;

&lt;p&gt;Para trabalhar com os dados, foi criada uma classe "Fábrica de Dados". Esta é responsável por tratar as tabelas e criar dicionários para que pudessem ser usados no código.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj99q0offa0btey9t0arh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj99q0offa0btey9t0arh.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Modelagem das classes e funções
&lt;/h3&gt;

&lt;p&gt;Para utilizar o AG, é necessário modelar nosso problema para ser adaptar à composição do AG. Para este problema, foi definido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gene&lt;/strong&gt;: Cada cidade em uma lista&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cromossomo&lt;/strong&gt;: Uma lista contendo as cidades&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indivíduo&lt;/strong&gt;: Um objeto de uma classe "Rota" que contenha o cromossomo e guarde o valor do fitness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;População&lt;/strong&gt;: Um objeto de uma classe "Rotas" que contém uma lista de objetos "Rota"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Indivíduo
&lt;/h3&gt;

&lt;p&gt;O indivíduo foi definido como um objeto da classe Rota. O indivíduo pode ser instanciado com uma rota aleatória ou pré-definida. Isso é útil para ser usado na população inicial ou nas funções de mutação e crossover. O indivíduo também guarda o seu valor do fitness.&lt;/p&gt;

&lt;p&gt;A geração de rotas garante que a primeira cidade sempre é "Escondidos", já que é de onde Joana sai. Como também é o lugar para qual Joana deve retornar ao finalizar os roubos, "Escondidos" é a única cidade que aparece mais de uma vez na rota. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjpo5yn3egav87zth6eq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjpo5yn3egav87zth6eq.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Como as funções de fitness e de mutação são específicas para cada indivíduo, elas foram definidas na classe Rota também.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fitness
&lt;/h4&gt;

&lt;p&gt;O fitness é uma das funções mais importantes do AG. Esta é responsável por avaliar quão bom é aquele indivíduo. &lt;/p&gt;

&lt;p&gt;É como se o fitness define quais indivíduos sobrevivem e quais não. Caso um indivíduo tenha, por exemplo, 23kg no total, o fitness dirá que ele não é apto e o avaliará negativamente. Isso faz com que não seja necessário elaborar funções de mutação e crossover super complexas pois, caso o indivíduo gerado seja ruim, cabe ao fitness dizer.&lt;/p&gt;

&lt;p&gt;Como este problema define que queremos maximizar o lucro, ele se torna um ótimo retorno da função de fitness pois quanto maior, melhor.&lt;/p&gt;

&lt;p&gt;Porém, antes do cálculo do lucro, é verificado se a rota é válida e se a rota não ultrapassa os limites de peso e tempo.&lt;/p&gt;

&lt;p&gt;Para calcular tudo isso, a rota é considerada da primeira até a segunda ocorrência de "Escondidos". Tudo depois da segunda é desconsiderado. Isso faz com que nossa rota tenha sempre um tamanho fixo e facilita muito no crossover e na mutação.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdhmtxewsuk41wzrdkce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdhmtxewsuk41wzrdkce.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8jscjg3eh1ciq7g4mx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8jscjg3eh1ciq7g4mx8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Mutação
&lt;/h4&gt;

&lt;p&gt;A mutação faz uma pequena alteração no cromossomo do indivíduo. Como defini o cromossomo como uma lista de cidades, a mutação faz uma troca aleatória na posição de duas cidades (com exceção da primeira)&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvymydxuawqcfmoq8kbb0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvymydxuawqcfmoq8kbb0.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
No código do AG, é gerada uma nova população de indivíduos mutados que é somada aos indivíduos originais. Por este motivo a função de mutação gera um novo indivíduo. Outro motivo para isso é que, sempre que um novo indivíduo é gerado, seu fitness é calculado automaticamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  População
&lt;/h3&gt;

&lt;p&gt;A população é um objeto de uma classe Rotas. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlcjgzsiarfnsz1y948z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlcjgzsiarfnsz1y948z.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Sempre que instanciada, a classe gera uma quantidade pré-definida de indivíduos aleatórios.&lt;/p&gt;

&lt;p&gt;A classe da população é responsável por implementar o crossover a seleção dos indivíduos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Crossover
&lt;/h4&gt;

&lt;p&gt;A função de crossover escolhe quais indivíduos das 10 populações serão cruzados.&lt;br&gt;
Neste caso, a população é dividida ao meio e cada indivíduo combinado com seu equivalente da outra metade.&lt;/p&gt;

&lt;p&gt;Para cruzar os indivíduos, criei uma função que combina os cromossomos conforme a imagem abaixo:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrcqjfppgs98umyjuls0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrcqjfppgs98umyjuls0.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfq2lftgifm352j07l7i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfq2lftgifm352j07l7i.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnzw8qhz5hx2531oqcg9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnzw8qhz5hx2531oqcg9t.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Resultado:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxljqzfx9t5qbgutm4g2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxljqzfx9t5qbgutm4g2.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Assim como a mutação, o crossover retorna uma lista de novos indivíduos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Seleção
&lt;/h4&gt;

&lt;p&gt;A seleção é responsável por determinar quais serão os indivíduos que passarão para a próxima geração. Ela faz isso ordenando a lista da população total e definindo a nova população como os 10 melhores.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfo3e6kg11ojw5b8xjka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfo3e6kg11ojw5b8xjka.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Com isso, o AG está pronto para rodar!&lt;/p&gt;

&lt;h1&gt;
  
  
  Resultados, problemas e limitações
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Problemas e limitações
&lt;/h2&gt;

&lt;p&gt;Apesar de fascinantes, os AGs não são perfeitos. Durante a implementação, percebi dois dos problemas comumente relatados sobre os AGs&lt;/p&gt;

&lt;h3&gt;
  
  
  Convergência prematura
&lt;/h3&gt;

&lt;p&gt;Um dos grandes problemas do AG é a convergência prematura. Quando um indivíduo razoavelmente bom aparece muito cedo, o algoritmo tende a usar este como modelo para geração de novos indivíduos. Isso é um problema pois impede a criação de indivíduos melhores. Para entender melhor, a imagem abaixo exemplifica máximas e mínimas globais e locais:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx929fzjlz5hsz91m76aq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx929fzjlz5hsz91m76aq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Há alguns métodos para mitigar este problema como melhores funções de crossover e mutação ou eliminar indivíduos idênticos, mas ainda é um problema sem solução definida.&lt;/p&gt;

&lt;h3&gt;
  
  
  Falta de garantia de otimalidade
&lt;/h3&gt;

&lt;p&gt;Os AGs são algoritmos heurísticos e não garantem a obtenção da solução ótima em todos os casos. Embora possam convergir para soluções de alta qualidade, não há garantia de que a solução encontrada seja a melhor possível. Isso foi percebido quando o algoritmo é executado várias vezes e as respostas foram diferentes. Isso seria mitigado aumentando a quantidade de gerações mas o custo disso é a necessidade de mais tempo e processamento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultado
&lt;/h2&gt;

&lt;p&gt;O indivíduo mais adaptado do AG foi:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzvchck5g4se70jdrji4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzvchck5g4se70jdrji4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Pessoalmente, os AG me fascinam. Foi um prazer enorme trabalhar neste projeto e poder compartilhá-lo. Aprendi muito no processo e isso me motiva a buscar mais conhecimento na área. Durante o desenvolvimento, tive contato com a tese de doutorado de Estefane George Macedo de Lacerda "&lt;a href="https://repositorio.ufpe.br/handle/123456789/1845" rel="noopener noreferrer"&gt;Model Selection of RBF Networks via Genetic Algorithms&lt;/a&gt;", o que foi de grande ajuda na compreensão do funcionamento dos AGs e gostaria de parabenizá-la abertamente pela fantástica pesquisa.&lt;/p&gt;

&lt;h5&gt;
  
  
  Você pode acessar o meu repositório &lt;a href="https://github.com/ViniPetra/GeneticAlgorithm-TheTravelingThief" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;
&lt;/h5&gt;

</description>
      <category>ai</category>
      <category>computerscience</category>
      <category>braziliandevs</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Biomimética: Por que sair e "tocar grama" pode realmente ser a resposta para o seu problema</title>
      <dc:creator>Vinicius Petratti</dc:creator>
      <pubDate>Wed, 12 Apr 2023 01:05:28 +0000</pubDate>
      <link>https://forem.com/vinipetra/biomimetica-por-que-sair-e-tocar-grama-pode-realmente-ser-a-resposta-para-o-seu-problema-4a1k</link>
      <guid>https://forem.com/vinipetra/biomimetica-por-que-sair-e-tocar-grama-pode-realmente-ser-a-resposta-para-o-seu-problema-4a1k</guid>
      <description>&lt;p&gt;Como desenvolvedores, muitas vezes somos criticados por passar muito tempo em frente a tela do computador. A famosa frase "sai desse computador, toma um sol, vai tocar na grama" já deve ter sido ouvida por muitos de nós. No entanto, o que poucos sabem é que sair para tocar na grama pode ser exatamente o que precisamos para encontrar soluções criativas para problemas complexos da tecnologia. Este artigo aborda o conceito de biomimética, que consiste em observar e copiar soluções desenvolvidas pela natureza ao longo de bilhões de anos de evolução, e como isso pode ser aplicado na tecnologia para criar soluções mais eficientes e sustentáveis.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Aqueles que são inspirados por um modelo diferente da Natureza, uma mestra acima de todos os mestres, estão trabalhando em vão.&lt;/em&gt;”&lt;/p&gt;

&lt;p&gt;-Leonardo DaVinci&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em 1989, no Japão, havia um modelo de trem-bala que era muito rápido, podendo chegar a 268 km/h. O problema é que, quando entrava em um túnel em alta velocidade, o ar na frente do trem ia se comprimindo durante sua passagem e, ao sair do túnel, a rápida descompressão resultava em um "estrondo sônico", o mesmo efeito causado por aviões ao quebrarem a barreira do som ou o barulho de um trovão. Este barulho causado pelo trem era tão alto que podia ser ouvido a mais de 400 metros de distância, o que é um grande problema quando se tem trilhos próximos a áreas residenciais. &lt;/p&gt;

&lt;p&gt;Para resolver isso, um time de engenheiros foi contratado para melhorar a qualidade deste serviço. Um dos membros deste time era Eiji Nakatsu, um engenheiro que tinha como hobby observar aves. Eiji Nakatsu observou um martin-pescador mergulhar para caçar sua presa e percebeu que pouquíssima água era respingada quando mergulhava. Com inspiração no bico do martim-pescador, em 1997 Eiji e seu time desenharam a nova frente do trem-bala. Como resultado, o novo trem era 10% mais rápido, gastava 15% menos eletricidade e conseguiu ficar abaixo do limite de barulho em áreas residenciais. &lt;/p&gt;

&lt;p&gt;Isso que Eiji Nakatsu fez é chamado de &lt;strong&gt;Biomimética&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vvAQYBok--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ueju3krys0ohir3xp5ro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vvAQYBok--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ueju3krys0ohir3xp5ro.png" alt="Imagem do martin-pescador e o trem-bala" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Biomimética?
&lt;/h2&gt;

&lt;p&gt;A biomimética é prática de copiar e aplicar em problemas atuais as estratégias que a natureza desenvolveu ao longo dos bilhões de anos de existência da vida. É entender como a natureza se adaptou ao longo dos anos para resolver problemas muito parecidos com os que enfrentamos diariamente.&lt;/p&gt;

&lt;p&gt;O termo biomimética foi popularizado em 1997 por Janine Benyus, co-fundadora do Instituto Biomimicry e autora do livro "Biomimicry: Innovation Inspired by Nature.", porém, ainda no século XV, o grande Leonardo DaVinci já estava profundamente emaranhado na ideia de olhar para a natureza para procurar as respostas. Uma prova disso é a sua obra "Homem Vitruviano", em que DaVinci ostenta seu profundo conhecimento em proporções e seu entendimento na mistura da matemática com a arte. DaVinci desenhou um modelo de paraquedas usando como inspiração sementes que caiam de árvores. Seu modelo foi testado no ano 2000 e foi um sucesso.&lt;/p&gt;

&lt;p&gt;Existem inúmeras outras aplicações de biomimética: materiais hospitalares que têm o formato da pele de tubarão pois esta repele bactérias, o posicionamento de turbinas eólicas na mesma formação de cardumes de peixe nada para ter menos resistência do ar, textura de pinturas que imitam a superfície de uma folha de lótus pois esta repele a água que, ao passar, leva a sujeira junto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Biomimética na Computação
&lt;/h2&gt;

&lt;p&gt;A biomimética é uma fonte de inspiração para diversas áreas da ciência e da tecnologia, incluindo a computação. Com a crescente demanda por soluções mais eficientes e sustentáveis, a essa abordagem tem se mostrado uma fonte valiosa de inovação para a tecnologia da informação. Através de exemplos como a imitação do comportamento de neurônios em redes neurais e a utilização de algoritmos genéticos baseados na teoria da evolução das espécies, a biomimética tem ajudado a solucionar problemas complexos na computação de forma criativa e eficiente.&lt;/p&gt;

&lt;p&gt;Alguns exemplos da biomimética aplicada à computação:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Redes Neurais
&lt;/h3&gt;

&lt;p&gt;Algoritmos de redes neurais são uma aplicação de inteligência artificial para resolução de problemas extremamente complexos de reconhecimento de padrões como reconhecimento de voz, imagem, NLP (Natural Language Processing) entre outros. As redes neurais, como o nome diz, se inspira na estrutura e comportamento de neurônios para resolução de problemas. &lt;/p&gt;

&lt;h3&gt;
  
  
  2. Algoritmos genéticos
&lt;/h3&gt;

&lt;p&gt;Algoritmos genéticos são técnicas de Inteligência Artificial de otimização que se inspiram na Teoria da Evolução das Espécies. Estes algoritmos combinam seleção natural, recombinação genética, mutação, influência do meio na seleção dos seres mais aptos e outras técnicas para gerar uma variedade de soluções e encontrar a mais viável para um problema.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Sistemas multiagentes
&lt;/h3&gt;

&lt;p&gt;São sistemas que se inspiram na interação social de insetos, como formigas e abelhas, para resolver problemas complexos como a interação entre diversos veículos autônomos compartilhando a mesma via. Esses sistemas utilizam um conjunto de agentes que interagem entre si e com o ambiente para alcançar objetivos em conjunto.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Memória de célula natural
&lt;/h3&gt;

&lt;p&gt;É uma técnica que se inspira na forma como o sistema imunológico humano memoriza invasores estrangeiros para identificá-los rapidamente no futuro. Essa técnica é utilizada em sistemas de detecção de ameaças de segurança cibernética para identificar rapidamente padrões de comportamento maliciosos.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Robótica inspirada em animais
&lt;/h3&gt;

&lt;p&gt;É a área que se inspira em animais para desenvolver robôs com habilidades específicas, como locomoção, manipulação de objetos, detecção de movimento, entre outras. Esses robôs são utilizados em diversas aplicações, como exploração espacial, busca e salvamento, agricultura de precisão, entre outras.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A frase de Leonardo DaVinci no começo deste artigo é uma conclusão coerente quando entendemos como natureza desenvolveu soluções eficientes para inúmeros problemas complexos que enfrentamos atualmente. Foram aproximadamente 4 bilhões de anos de história da vida na Terra e isso é muito tempo de pesquisa e desenvolvimento. Não há estudo laboratorial mais efetivo que isso. &lt;/p&gt;

&lt;p&gt;Como foi dito por &lt;a href="https://www.youtube.com/watch?v=k_GFq12w5WU&amp;amp;t=998s"&gt;Janine Benyus em sua palestra "Biomimicry in action" no TED&lt;/a&gt;: "Se eu pudesse revelar algo que está escondido de nós, pelo menos na cultura moderna, e é algo que sabíamos tão bem como nossos nomes mas parece que esquecemos, é que nós vivemos em um universo competente e que estamos rodeados de genialidade. Nós não somos os primeiros a processar celulose, não somos os primeiros a tentar otimizar espaço, não somos os primeiros a tentar construir casas para nossos filhos. A natureza tem feito todas essas coisas há bilhões de anos".&lt;/p&gt;

&lt;p&gt;É genial o conceito de poder resolver problemas imitando o que nosso meio nos proporciona. Algoritmos genéticos e Redes neurais, por exemplo, são minhas aplicações favoritas de biomimética na computação pois, não só fazem total sentido, mas também são assuntos que me dão vontade de estudar e se aprofundar cada vez mais. Além de que isso é um dos melhores exemplos que não só a extração da natureza pode fazer a humanidade prosperar. Há muito conhecimento para se obter de forma não destrutiva e estes conhecimentos são extremamente valiosos.&lt;/p&gt;

&lt;p&gt;Para mim, poder ter escrito este artigo integrando conhecimentos que parecem distintos à primeira vista mas, com um pouco mais de cuidado, percebe-se que são intrinsecamente ligados, foi um grande prazer.&lt;/p&gt;

&lt;h5&gt;
  
  
  Referências:
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://biomimicry.org/what-is-biomimicry/"&gt;https://biomimicry.org/what-is-biomimicry/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.vox.com/videos/2017/11/9/16628106/biomimicry-design-nature"&gt;https://www.vox.com/videos/2017/11/9/16628106/biomimicry-design-nature&lt;/a&gt;&lt;br&gt;
&lt;a href="https://spencerauthor.com/biomimcry/"&gt;https://spencerauthor.com/biomimcry/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://phys.org/news/2015-10-bio-mimicry-space-exploration.html"&gt;https://phys.org/news/2015-10-bio-mimicry-space-exploration.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://lstarkweather.medium.com/designing-future-environments-with-biomimicry-b1a4af2a2a01"&gt;https://lstarkweather.medium.com/designing-future-environments-with-biomimicry-b1a4af2a2a01&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.universetoday.com/122974/bio-mimicry-and-space-exploration/"&gt;https://www.universetoday.com/122974/bio-mimicry-and-space-exploration/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://magazine.primetals.com/2020/01/01/leonardo-da-vinci-pioneer-of-biomimicry/"&gt;https://magazine.primetals.com/2020/01/01/leonardo-da-vinci-pioneer-of-biomimicry/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://leonard.vinci.com/en/biomimetics-and-the-power-of-nature/"&gt;https://leonard.vinci.com/en/biomimetics-and-the-power-of-nature/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://library.acropolis.org/biomimicry-human-creation-inspired-by-nature/"&gt;https://library.acropolis.org/biomimicry-human-creation-inspired-by-nature/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>braziliandevs</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Como fizemos uma IA jogar Gomoku</title>
      <dc:creator>Vinicius Petratti</dc:creator>
      <pubDate>Sat, 01 Apr 2023 22:00:52 +0000</pubDate>
      <link>https://forem.com/vinipetra/como-fizemos-uma-ia-jogar-gomoku-48mk</link>
      <guid>https://forem.com/vinipetra/como-fizemos-uma-ia-jogar-gomoku-48mk</guid>
      <description>&lt;p&gt;Eu e meu amigo, &lt;a href="https://www.linkedin.com/in/yuri-barbosa-86020a197/"&gt;Yuri Barbosa&lt;/a&gt;, aceitamos o desafio de desenvolver uma Inteligência Artificial utilizando o algoritmo &lt;strong&gt;Minimax&lt;/strong&gt; para jogar uma partida de Gomoku contra um humano. Este desafio se originou em um trabalho de faculdade, mas nós aproveitamos esta oportunidade para ir &lt;strong&gt;muito&lt;/strong&gt; mais longe do que nos foi pedido. &lt;/p&gt;

&lt;p&gt;Nesta publicação, você encontrará um resumo do nosso projeto: nossas linhas de raciocínio para tomadas de decisões, como modelamos nosso problema, como superamos as dificuldades encontradas e as conclusões. Tudo isso de forma que seja acessível para qualquer um que esteja interessado!&lt;/p&gt;

&lt;p&gt;Esta publicação tem como público alvo pessoas que estejam curiosas com o nosso trabalho mas, não necessariamente, têm conhecimento aprofundado na área. Caso esteja procurando detalhes mais técnicos, veja [esta publicação].&lt;/p&gt;

&lt;p&gt;Você pode encontrar o projeto aqui: &lt;a href="https://github.com/Yuri-barbosa21/Gomoku-Pygame"&gt;https://github.com/Yuri-barbosa21/Gomoku-Pygame&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução ao problema
&lt;/h2&gt;

&lt;h4&gt;
  
  
  O que é o Gomoku?
&lt;/h4&gt;

&lt;p&gt;Gomoku é um jogo que acredita-se ser originado na China, no século XIX. O jogo consiste de um tabuleiro 15x15 em que dois jogadores, cada um com uma cor de peça e jogando alternadamente, têm o objetivo de alinhar 5 peças em qualquer direção: horizontal, vertical ou qualquer diagonal.&lt;/p&gt;

&lt;p&gt;Aqui um exemplo de uma partida de gomoku em que o jogador com as peças brancas venceu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mjFmgmrB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ir4smum8eosrcww1o4cd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mjFmgmrB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ir4smum8eosrcww1o4cd.png" alt="Image description" width="800" height="801"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  O que é o Minimax?
&lt;/h4&gt;

&lt;p&gt;Minimax é um algoritmo de Inteligência Artificial especializado em jogos de dois jogadores.&lt;/p&gt;

&lt;p&gt;Seu método de funcionamento é muito interessante: quando é a vez da Inteligência Artificial jogar, ela simula várias possibilidades de jogadas futuras para ambos os jogadores, alternando entre as jogadas do próprio algoritmo e do oponente, calcula uma pontuação para cada jogada baseada em regras definidas pelos seus desenvolvedores (neste caso, eu e o Yuri) e decide qual a melhor jogada baseada na pontuação mais alta obtida para si mesma, a fim de maximizar suas chances de vitória.&lt;/p&gt;

&lt;p&gt;Ao mesmo tempo, o algoritmo também leva em consideração a pontuação mais baixa obtida pelo oponente, com o objetivo de minimizar as chances de vitória do oponente. Dessa forma, o Minimax é capaz de tomar decisões estratégicas de maneira inteligente, considerando tanto a sua própria pontuação quanto a pontuação do adversário.&lt;/p&gt;

&lt;p&gt;Agora que você sabe o que é o Gomoku e Minimax, a dúvida é: &lt;strong&gt;Por que modelar esta IA para jogar Gomoku é um desafio?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fundamentos do algoritmo de IA
&lt;/h2&gt;

&lt;p&gt;Para qualquer solução de Inteligência Artificial, é preciso modelar o problema (abstrair as informações para que possam ser computadas) no formato em que o algoritmo usado requer para ser implementado.&lt;/p&gt;

&lt;p&gt;Por exemplo, como definimos as regras de cálculo da pontuação de cada jogada que foi mencionada anteriormente? Ou, até um passo antes disso, como fazemos o algoritmo entender o que está acontecendo no jogo?&lt;/p&gt;

&lt;h2&gt;
  
  
  Dificuldades na Implementação
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1. Como pontuamos cada jogada?
&lt;/h4&gt;

&lt;p&gt;Eu estaria mentindo se dissesse que foi fácil definir nosso método de pontuação das jogadas. inicialmente pensamos: "Deve ser simples! Vamos só contar quantas sequências de peças temos e quais são os seus tamanhos. Dessa forma, saberemos se estamos indo bem". Não demorou muito para percebermos que este método é (&lt;strong&gt;MUITO&lt;/strong&gt;) falho. &lt;/p&gt;

&lt;p&gt;Se fôssemos pontuar a jogada abaixo baseado no nosso primeiro método, pareceria que as peças brancas estão ganhando, já que têm uma sequência de 4 peças enquanto as pretas têm uma sequência com 3. No entanto, sabemos que essa sequência das peças brancas não tem valor nenhum, pois não há como completá-la. Enquanto isso, a sequência das peças pretas está vitoriosa pois, mesmo que as peças brancas bloqueiem algum dos lados da sequência, esta pode ser completada pelo lado oposto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cbuXBoy8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9k20am27bo5llg1hd14a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cbuXBoy8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9k20am27bo5llg1hd14a.png" alt="Image description" width="800" height="801"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nós decidimos que criaríamos um dicionário com algumas jogadas e quantos pontos aquela jogada vale. &lt;/p&gt;

&lt;p&gt;Quando fôssemos calcular a pontuação total da jogada, para cada padrão do dicionário que encontrar no tabuleiro, o valor daquele padrão será somado à pontuação total daquela jogada.&lt;/p&gt;

&lt;p&gt;Vale mencionar que nosso programa converte todas as verticais e diagonais em linhas horizontais. Logo, todos os exemplos abaixo funcionam para todas as direções.&lt;/p&gt;

&lt;p&gt;Nosso dicionário não é tão longo mas acaba sendo bem repetitivo para alguns casos. Por conta disso, para esta publicação, usarei apenas alguns exemplos de jogadas que mapeamos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LSMD56f2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k1b4e2wukbwwzfyw6ik8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LSMD56f2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k1b4e2wukbwwzfyw6ik8.png" alt="Image description" width="546" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. O programa estava absurdamente lento
&lt;/h4&gt;

&lt;h5&gt;
  
  
  a. A quantidade de jogadas possíveis importa
&lt;/h5&gt;

&lt;p&gt;Não estou exagerando! Em um de nossos testes, o programa levou mais de 20 minutos para calcular uma única jogada. Não preciso dizer que ninguém gostaria de jogar contra um adversário que demora 20 minutos para decidir sua jogada.&lt;/p&gt;

&lt;p&gt;Uma explicação um pouco mais detalhada do Minimax:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Explora &lt;strong&gt;todas as jogadas possíveis&lt;/strong&gt; que podem ser feitas naquele momento.&lt;/li&gt;
&lt;li&gt; Para cada jogada possível, cria um novo tabuleiro filho.&lt;/li&gt;
&lt;li&gt; Calcula a pontuação de cada um dos tabuleiros filhos.&lt;/li&gt;
&lt;li&gt; Escolhe o filho com a &lt;strong&gt;maior&lt;/strong&gt; pontuação.&lt;/li&gt;
&lt;li&gt; Repete os passos 1, 2 e 3.&lt;/li&gt;
&lt;li&gt;Escolhe o filho com a &lt;strong&gt;menor&lt;/strong&gt; pontuação. (pois está simulando a jogada de seu oponente)&lt;/li&gt;
&lt;li&gt; Continua repetindo o processo até que o algoritmo alcance um estado final (por exemplo, um jogador ganhou ou empatou) ou atinja uma &lt;strong&gt;profundidade máxima na árvore de busca&lt;/strong&gt; (Falarei sobre a profundidade máxima mais à frente).&lt;/li&gt;
&lt;li&gt; Quando isso acontece, o algoritmo decide a melhor jogada, baseado na pontuação.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por que isso é importante? Como mencionado acima, o algoritmo olha todas as casas possíveis do tabuleiro, mas isso é relevante? Faz sentido olhar todas as jogadas possíveis? Veja o exemplo abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jkwrqpsF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/csngmy1h91wf847i0asf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jkwrqpsF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/csngmy1h91wf847i0asf.png" alt="Image description" width="800" height="801"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não faz sentido simular uma jogada em qualquer lugar que esteja vermelho pois isso não terá efeito no jogo.&lt;/p&gt;

&lt;p&gt;Por isso, implementamos a restrição de que o algoritmo só simulará jogadas em casas que tiverem alguma peça na vizinhança.&lt;/p&gt;

&lt;p&gt;Não só isso, mas nós também programamos as 3 primeiras jogadas iniciais de uma forma mais fixa. O Minimax só começa a jogar na 4º rodada. Dessa forma, economizamos bastante processamento no início do jogo.&lt;/p&gt;

&lt;p&gt;Antes de definirmos isso, estávamos usando uma outra estratégia em que o programa gerava um novo tabuleiro apenas com as peças já jogadas e usava um sistema de converter as coordenadas para que fossem equivalentes no tabuleiro original. Se quiser saber mais sobre isso, veja minha outra publicação: Como uma mudança de perspectiva pode mudar completamente sua forma de implementar uma solução.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Aveebw97--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ucizr8unm8ll5e1qvi7m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Aveebw97--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ucizr8unm8ll5e1qvi7m.png" alt="Image description" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  b. Profundidade da árvore de decisão
&lt;/h5&gt;

&lt;p&gt;A profundidade da árvore de decisão pode ser vista como "quantas jogadas à frente o algoritmo simula". Nós encontramos um comportamento muito curioso em nosso programa: Quando escolhíamos a profundidade máxima como "2", o algoritmo levava até 10 segundos para calcular uma jogada. Quando aumentávamos esse valor para "3", o tempo subia para 2 minutos e meio! Para "4" nós nem tivemos a paciência de esperar terminar.&lt;/p&gt;

&lt;p&gt;Após muita pesquisa, encontramos o artigo &lt;a href="https://core.ac.uk/download/pdf/286268989.pdf"&gt;"New heuristic algorithm to improve the Minimax for Gomoku artificial intelligenceartificial intelligence", escrito por &lt;em&gt;Han Liao&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste artigo, Han diz que em um computador típico, para que o jogo flua bem, a profundidade máxima da árvore de decisão não pode ser maior que 3. Isso é muito ruim pois o Minimax funciona melhor com profundidades grandes mas, infelizmente, isso é uma das limitações da aplicação de Minimax no Gomoku.&lt;/p&gt;

&lt;h2&gt;
  
  
  Algumas imagens do projeto
&lt;/h2&gt;

&lt;p&gt;O Yuri tomou a iniciativa de fazer a parte visual do jogo com a biblioteca Pygame e fez um trabalho fenomenal!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Droh1X5N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xyq7jh46dhewo9eee5cd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Droh1X5N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xyq7jh46dhewo9eee5cd.png" alt="Image description" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JceY7_Pf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/soi1p88jwnmfra0d3q4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JceY7_Pf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/soi1p88jwnmfra0d3q4z.png" alt="Image description" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gXl5gIFH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5hloenalpklmtngi9m7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gXl5gIFH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5hloenalpklmtngi9m7.png" alt="Image description" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Este projeto me proporcionou muitos conhecimentos novos. Trabalhei com técnicas e conceitos que nunca tinha visto antes. Foi muito gratificante trabalhar na prática com a aplicação de inteligência artificial, pois é muito clara a diferença entre saber a teoria e aplicar na prática.&lt;/p&gt;

&lt;p&gt;Além disso, este projeto despertou minha curiosidade por muitas outras áreas. Enquanto pesquisava soluções para os problemas que encontramos, aprofundei meu conhecimento em novos conceitos e técnicas de otimização. Um exemplo disso foi o artigo de Han Liao, que explicou outros experimentos com inteligências artificiais aplicadas ao jogo Gomoku.&lt;/p&gt;

&lt;p&gt;Descobrimos o artigo de Han muito tarde em nosso projeto, enquanto buscávamos uma forma de tornar nosso programa mais eficiente. Ficamos muito orgulhosos de ter aplicado todas as técnicas de otimização e de ter feito o melhor possível no projeto, considerando que o artigo de Han é uma tese de mestrado em Engenharia da Computação.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
