A programação genética é uma maneira de fazer o computador escrever programas para você!
Não pense em "programas" como o MS Word, pense em "programas" da seguinte maneira:
function(x){ return x*2; }
Esta função (ou programa), por si só, não tem um motivo para existir. Estamos à procura de soluções para problemas. Se você precisar encontrar a soma de dois números, basta abrir a calculadora e fazer as contas. E se alguém lhe desse a tabela a seguir e solicitasse que você descobrisse a relação entre result
e x
e y
:
x y result
99 1 (3.02)
79 88 2.01
21 62 5.01
84 52 (6.58)
12 70 5.54
67 18 0.73
Esses dados são seus dados de "treinamento". Seu computador usará esses dados para gerar algumas hipóteses, e você os testará em relação aos dados reais.
Digamos que você não conheça estatísticas e decida que esse problema é muito difícil de resolver por conta própria, para que você obtenha o computador.
Faça o computador gerar aleatoriamente palpites
Você faz com que o computador gere um milhão de respostas e veja se alguma delas permanece (acho ... um milhão de vezes!). A seguir, é apresentado um exemplo de algumas suposições:
function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly
Você pode ou não saber disso, mas funções ou programas também podem ser representados como árvores, por exemplo, a segunda função seria:
(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)
Você pode fazer com que pareça mais com uma árvore recuando-a assim (veja a notação polonês reversa e a sintaxe lisp ... mas você entenderá por que representamos programas como esse em breve):
(+
(/ x
(* 1
(* 1
(* 1
(* 1
(* 1 1))))
y)
( +
está no topo com duas "folhas" de /
e y
. /
tem vários filhos etc.)
É por isso que você lê muito sobre "árvores" na programação genética. Em qualquer caso, nós ligar os valores de x
e y
para esta função e nos dá a resposta errada. Não é surpreendente, uma vez que geramos isso aleatoriamente.
Agora você decide gerar um milhão de soluções desse tipo. Todos eles estão errados. No entanto, você percebe que algumas respostas estão mais próximas da resposta certa do que outras. Em outras palavras, algumas soluções são mais "adequadas" do que outras. Observe que o computador não sabe o que é "certo" e "errado"; portanto, você deve fornecer sua própria "função de condicionamento físico". Essa função recebe uma solução em potencial, os dados de treinamento e é responsável por informar ao sistema GP o quão "adequada" é essa solução. Como você pode imaginar, essa função é executada milhões e milhões de vezes.
O que faz GP diferente
Aqui está o que torna a programação genética diferente dos palpites. Você decide fazer outra rodada de milhões de palpites; no entanto, você faz isso de forma um pouco mais inteligente. Você pega os 10% principais das suposições (as que se aproximam dos valores reais) e as faz parte da segunda geração. Você também pega muitas dessas soluções (talvez os mesmos 10% ... não me lembro) e decide "misturá-las".
Você escolhe aleatoriamente duas soluções, escolhe subárvores aleatoriamente e começa a trocá-las. Portanto, parte da solução A termina na solução B e vice-versa - você apenas as "cruzou". Você também pega algumas soluções e simplesmente "as modifica" ... pega algumas subárvores e 'estraga tudo' (ei, se a solução é terrível, 'estragar tudo sem motivo' pode realmente melhorá-lo).
Uma boa maneira de pensar sobre isso é o seguinte: sua mãe e seu pai têm certos atributos - cor do cabelo, altura, probabilidade de doença, etc. Você, quando criança, herda atributos diferentes de seus pais. Se seus pais eram atletas olímpicos, você também será um super atleta, certo? Bem, biólogos, sociólogos e até historiadores podem discordar dessa idéia, mas os cientistas da computação não estão preocupados com a moralidade da eugenia aqui. Eles apenas viram um "sistema" fazendo um bom trabalho fornecendo soluções, então decidiram modelá-lo em software.
Se ele realmente não combina com a biologia, mas ainda fornece boas respostas ... muitos cientistas da computação coletivamente dizem "qualquer que seja, e obrigado pela terminologia". Observe também que todos os seus irmãos e irmãs e não exatamente o mesmo ... mesmo que tenham os mesmos pais. Cada pessoa tem genes que sofrem mutação por qualquer motivo (por favor, não mostre isso a um biólogo, o objetivo é entender a motivação por trás de grande parte da terminologia).
Então agora estamos conseguindo que o computador gere milhões de programas e avalie sua aptidão. As melhores soluções sobrevivem até a próxima geração. Também "mudamos" e cruzamos a "população" (observe como a linguagem da genética e da biologia está sendo usada). Depois que a segunda geração é criada, a aptidão é medida novamente. Como esta geração tem as melhores soluções da geração anterior E cruzamos e modificamos as melhores soluções (junto com a população medíocre - para manter a diversidade), essa geração deve ser pelo menos um pouco melhor que a geração anterior.
Continuamos isso por um número muito grande de gerações. Cada geração (esperançosamente) fornece soluções cada vez melhores, até obtermos a resposta certa. Por exemplo:
(+ (- 2.2 (/ x 11) (* 7 (cos y))))
Bem, veja isso, isso está correto!
(Copiei isso de http://en.wikipedia.org/wiki/Genetic_programming , que também possui uma representação gráfica dessa árvore)
Miudezas
Existem algumas questões importantes, como como você decide quais "terminais" ( +, -, *, /, cos, sin, tan
) estão disponíveis para o seu sistema GP, como você escreve a função de condicionamento físico e como o sistema lida com programas não-sensoriais como (1 + cos)
ou (2 / "hello")
(entre muitos outros).
É muito chato evoluir equações. Fica mais interessante se o seu conjunto de terminais se parecer com o seguinte: (fogo, detectar inimigo, movimento, ...) e sua função de condicionamento físico medir sua saúde e o número de cadáveres de monstros marciais.
Escrevi a maior parte disso de memória, mas essa é a ideia básica. Eu fiz alguns GP nos meus anos de faculdade. Você definitivamente deveria brincar com isso. Não se preocupe em entender toda a terminologia, basta fazer o download de alguns sistemas GP gratuitos, executar alguns exemplos para ter uma ideia e criar seus próprios exemplos interessantes (encontrar relações entre diferentes conjuntos de dados, tente conectá-lo ao jogo APIs etc.)