Evolução em
código:
algoritmos
genéticos com
Flávio Gomes da Silva Lisboa
www.fgsl.eti.br
Quem sou eu
●
Doutor e mestre em Tecnologia e Sociedade
●
Especialista em Tecnologia Java
●
Engenheiro e Arquiteto de Software certificado
pela Zend
●
Professor de Análise e Projeto de Sistemas,
Banco de Dados, Programação Web, e Técnicas
de Programação e Algoritmos.
●
Analista de desenvolvimento, atualmente
trabalhando com gestão de API Gateways.
https://www.casadocodigo.com.br/
https://bpbonline.com/products/mastering-test-driven-development-with-php-8
https://www.packtpub.com/en-us/product/php-web-development-with-laminas-9781803245010
https://clubedeautores.com.br/livro/livres-ou-iguais
https://clubedeautores.com.br/livro/rom-biografia-
nao-autorizada
romocavaleirodoespaco.blogspot.com.br
ROM, BIOGRAFIA NÃO AUTORIZADA
VAMOS
COMEÇAR
… EM 1859
ISSO É
MAIS
VELHO QUE
A BRUXA
DO 71
“Algoritmos genéticos (GA) são um ramo dos
algoritmos evolucionários e como tal podem
ser definidos como uma técnica de busca
baseada uma metáfora do processo de
evolução natural” (LINDEN, 2008, p. 43).
EU
ANDRÉ
NOEL
LEIA https://developerslife.tech e evolua seu humor!
“Algoritmos genéticos (GA) são técnicas
heurísticas de otimização global”
(LINDEN, 2008, p. 43).
Um algoritmo genético é uma forma de
busca por aproximação estatística. O
“pai” desse conceito é John Holland,
autor de Adaptation in Natural and
Artificial Systems (1975).
John Holland
(1929-2015)
“...os algoritmos evolucionários, apesar
de seu nome indicar o contrário, são
heurísticas que não asseguram a
obtenção do melhor resultado possível
em todas as suas execuções” (LINDEN,
2008, p. 41)
Um algoritmo
genético não é
um algoritmo?
“Uma das primeiras tentativas de se
associar a evolução natural a problemas
de otimização foi feita em 1957, quando
Box apresentou seu esquema de
operações evolucionárias” (LINDEN, p.
34, 2008)
George E. P. Box
1919-2013
Baseados na reprodução genética de
organismos vivos, todos os
algoritmos genéticos implementam
um mesmo algoritmo básico.
T:=0 // Inicializamos o contador de tempo
Inicializa_População P(0) // Inicializamos a população
aleatoriamente
Enquanto não terminar faça // condição de término: por tempo,
por avaliação, etc.
Avalie_População P(t) // Avalie a população neste instante
P’=Recombinação_e_mutação P’// Aplicamos os operadores
genéticos
Avalie_População P´ // Avalie esta nova população
P(t+1)=Selecione_sobreviventes P(t),P’ //Selecione
sobreviventes desta geração
t:=t+1
Fim enquanto
(LINDEN, p. 41, 2008)
A girafa
esticava o
pescoço
até
alcançar
a copa
A girafa
com
pescoço
curto
morria de
fome
O que diferencia um algoritmo genético
de outro, além dos argumentos, é a
função-objetivo, ou função de ajuste, ou
função de avaliação que irá avaliar se os
indivíduos de cada geração da
população de soluções atingiu o critério
de parada.
O PROBLEMA DA
MOCHILA
O PROBLEMA DA MOCHILA
O nome dá-se devido ao
modelo de uma situação em
que é necessário preencher
uma mochila com objetos de
diferentes pesos e valores.
O objetivo é que se
preencha a mochila com o
maior valor possível, não
ultrapassando o peso
máximo.
Definição
Suponha que tenha uma mochila com capacidade
total de W e n itens distintos. Seja x1
, .. , xn
a
quantidade de itens que está sendo carregado,
cada um com um respectivo peso w1
, ... wn
e valor
v1
, ... ,vn
. Maximizar o valor da mochila nada mais
é que maximizar a seguinte equação:
Definição
Heurística pode demorar...
DONALD GLOVER
Precisamos de uma linguagem que
possa executar algoritmos genéticos...
CÓDIGO, EU QUERO CÓDIGO
<?php
while(true){
echo “EU QUERO MUITO CÓDIGO”;
}
fgsl/geneticalgorithm
class GeneticAlgorithm
{
protected int $populationSize = 0;
protected ?RulesInterface $rules = null;
protected int $maxIterations = 0;
protected bool $verbose = false;
public function __construct(int $populationSize, RulesInterface
$rules, int $maxIterations, bool $verbose = false)
{
$this->populationSize = $populationSize;
$this->rules = $rules;
$this->maxIterations = $maxIterations;
$this->verbose = $verbose;
}
Operações genéticas
São as operações que atuam na criação
de um novo indivíduo da população.
●
Crossover
●
Mutação
crossover
A operação computacional de crossover (na
verdade crossing over) é uma analogia da
reprodução biológica, na qual os pais trocam
cromossomos (duplicados) que são combinados
para gerar os cromossomos de seus filhos.
crossover
protected function crossover(array
$population): array
{
return $this->rules-
>crossover($population, $this->rules-
>nvalues);
}
mutação
“Depois de compostos os filhos, entra
em ação o operador de mutação”
(LINDEN, 2008, p. 77)
mutação
protected function mutation(array
$individual): array
{
if (rand(0, 10) % 2 == 0) {
$individual = $this-
>newIndividual();
}
return $individual;
}
VAMOS RODAR!
OBRIGADO
www.fgsl.eti.br
REFERÊNCIA
LINDEN, Ricardo. Algoritmos genéticos. 2.ed. Rio de Janeiro: Brasport, 2008.

Evolução em código: algoritmos genéticos com PHP