Mudanças entre as edições de "Genéticos: Problema da Mochila em Python"
(17 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
+ | |||
Afluentes: [[Inteligência Artificial]], [[Modelos Evolutivos e Tratamento de Incertezas]] | Afluentes: [[Inteligência Artificial]], [[Modelos Evolutivos e Tratamento de Incertezas]] | ||
Linha 4: | Linha 5: | ||
Para mostrar uma implementação de um Algoritmo Genético, iremos trabalhar com o '''Problema da Mochila'''. | Para mostrar uma implementação de um Algoritmo Genético, iremos trabalhar com o '''Problema da Mochila'''. | ||
+ | |||
+ | Sobre o problema da mochila: | ||
* Problema de otimização combinatória (NP-Completo) | * Problema de otimização combinatória (NP-Completo) | ||
Linha 11: | Linha 14: | ||
<center>[[Image:Ag_mochila.png|400px]]</center> | <center>[[Image:Ag_mochila.png|400px]]</center> | ||
− | Podemos representar a | + | Podemos representar a aptidão de uma solução como a soma dos valores dos objetos e com uma penalidade para soluções que passam do limite de volume. |
* Queremos o maior valor possível sem ultrapassar o limite da mochila. | * Queremos o maior valor possível sem ultrapassar o limite da mochila. | ||
* Vários itens que gostaria de levar em uma mochila | * Vários itens que gostaria de levar em uma mochila | ||
* Cada item tem um peso e um benefício, ou valor | * Cada item tem um peso e um benefício, ou valor | ||
− | * | + | * Existe uma capacidade limite de peso |
* Deve-se carregar itens com o máximo valor total sem superar o limite de peso | * Deve-se carregar itens com o máximo valor total sem superar o limite de peso | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
= Programa em Python = | = Programa em Python = | ||
− | + | Coloquei o programa no github, fica mais fácil, fazer atualizações, de baixar e bom para visualizar. Vejam que o programa deu quase 300 linhas, mas é porque está todo comentado. Se tirar os comentários ele fica bem menor. É um algoritmo muito fácil e simples, talvez um dos mais fáceis de se implementar da Inteligência Artificial. | |
− | + | '''Link do github''': https://github.com/saulopz/ia_genetico_mochila | |
− | |||
− | |||
+ | Para baixar em seu computador, basta executar o comando: | ||
− | + | git clone https://github.com/saulopz/ia_genetico_mochila | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | {{tip|Eu estava fazendo procedural e estava tendo que fazer uns remendos, como encher de variáveis globais e outras coisas mais, e acho que isso estava permitindo um bug difícil de encontrar. Então decidi ir pra orientação a objetos que pra mim é mais fácil de entender e organizar. A ideia do algoritmo é a mesma que expliquei, mesmas funções, mesmaa funcionalidade, só está organizado como objetos. E, no final, era um bug bobo mesmo por causa de variáveis globais.}} | ||
− | + | == Solução == | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | A solução encontrada para o algoritmo com os parâmetros e configuração acima fica: | ||
− | + | <pre> | |
− | + | SOLUÇÃO ------------------------------ | |
− | + | Capacidade da mochila: 22 | |
− | + | - tv valor: 8 gold - peso: 8 | |
+ | - colar valor: 7 gold - peso: 4 | ||
+ | - videogame valor: 9 gold - peso: 6 | ||
+ | - smarthone valor: 4 gold - peso: 4 | ||
+ | Valor total: 28 gold | ||
+ | Peso total : 22 | ||
+ | -------------------------------------- | ||
+ | </pre> | ||
− | + | == Alterações para novo teste == | |
− | |||
− | |||
− | |||
− | |||
+ | No arquivo config.json adicionei um item (impressora) no arquivo de configuração e aumentei a capacidade para 25. Também alterei as variáveis do algoritmo aumentando a população, gerações, etc. | ||
− | + | <syntaxhighlight lang="json"> | |
− | + | { | |
− | + | "population_size": "100", | |
− | + | "selection_size": "40", | |
− | + | "crossover_gene_size": "2", | |
− | + | "mutation_individual_size": "20", | |
− | + | "mutation_gene_size": "2", | |
− | + | "generations": "500", | |
− | + | "penality": "100", | |
− | |||
− | |||
− | |||
+ | "capacity": "25", | ||
+ | "items": [ | ||
+ | { "name": "notebook", "value": "5", "weight": "7" }, | ||
+ | { "name": "tv", "value": "8", "weight": "8" }, | ||
+ | { "name": "tablet", "value": "3", "weight": "4" }, | ||
+ | { "name": "anel", "value": "2", "weight": "10" }, | ||
+ | { "name": "colar", "value": "7", "weight": "4" }, | ||
+ | { "name": "videogame", "value": "9", "weight": "6" }, | ||
+ | { "name": "smarthone", "value": "4", "weight": "1" }, | ||
+ | { "name": "impressora", "value": "2", "weight": "5" } | ||
+ | ] | ||
+ | } | ||
+ | </syntaxhighlight> | ||
− | + | E obtive a seguinte solução: | |
− | |||
− | |||
− | |||
+ | <pre> | ||
+ | SOLUÇÃO ------------------------------ | ||
+ | Capacidade da mochila: 25 | ||
+ | - notebook valor: 5 gold - peso: 7 | ||
+ | - tv valor: 8 gold - peso: 8 | ||
+ | - colar valor: 7 gold - peso: 4 | ||
+ | - videogame valor: 9 gold - peso: 6 | ||
+ | Valor total: 29 gold | ||
+ | Peso total : 25 | ||
+ | -------------------------------------- | ||
+ | </pre> | ||
− | + | A partir daí, dá para gente ir brincando com as configurações do algoritmo, informações do problema e outras variáveis para ver como os resultados vão se alterando. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Edição atual tal como às 19h45min de 7 de junho de 2024
Afluentes: Inteligência Artificial, Modelos Evolutivos e Tratamento de Incertezas
Definição do Problema
Para mostrar uma implementação de um Algoritmo Genético, iremos trabalhar com o Problema da Mochila.
Sobre o problema da mochila:
- Problema de otimização combinatória (NP-Completo)
- Estudado por mais de um século (desde ~1897)
- Resolvido por vários algoritmos
Podemos representar a aptidão de uma solução como a soma dos valores dos objetos e com uma penalidade para soluções que passam do limite de volume.
- Queremos o maior valor possível sem ultrapassar o limite da mochila.
- Vários itens que gostaria de levar em uma mochila
- Cada item tem um peso e um benefício, ou valor
- Existe uma capacidade limite de peso
- Deve-se carregar itens com o máximo valor total sem superar o limite de peso
Programa em Python
Coloquei o programa no github, fica mais fácil, fazer atualizações, de baixar e bom para visualizar. Vejam que o programa deu quase 300 linhas, mas é porque está todo comentado. Se tirar os comentários ele fica bem menor. É um algoritmo muito fácil e simples, talvez um dos mais fáceis de se implementar da Inteligência Artificial.
Link do github: https://github.com/saulopz/ia_genetico_mochila
Para baixar em seu computador, basta executar o comando:
git clone https://github.com/saulopz/ia_genetico_mochila
|
Solução
A solução encontrada para o algoritmo com os parâmetros e configuração acima fica:
SOLUÇÃO ------------------------------ Capacidade da mochila: 22 - tv valor: 8 gold - peso: 8 - colar valor: 7 gold - peso: 4 - videogame valor: 9 gold - peso: 6 - smarthone valor: 4 gold - peso: 4 Valor total: 28 gold Peso total : 22 --------------------------------------
Alterações para novo teste
No arquivo config.json adicionei um item (impressora) no arquivo de configuração e aumentei a capacidade para 25. Também alterei as variáveis do algoritmo aumentando a população, gerações, etc.
{
"population_size": "100",
"selection_size": "40",
"crossover_gene_size": "2",
"mutation_individual_size": "20",
"mutation_gene_size": "2",
"generations": "500",
"penality": "100",
"capacity": "25",
"items": [
{ "name": "notebook", "value": "5", "weight": "7" },
{ "name": "tv", "value": "8", "weight": "8" },
{ "name": "tablet", "value": "3", "weight": "4" },
{ "name": "anel", "value": "2", "weight": "10" },
{ "name": "colar", "value": "7", "weight": "4" },
{ "name": "videogame", "value": "9", "weight": "6" },
{ "name": "smarthone", "value": "4", "weight": "1" },
{ "name": "impressora", "value": "2", "weight": "5" }
]
}
E obtive a seguinte solução:
SOLUÇÃO ------------------------------ Capacidade da mochila: 25 - notebook valor: 5 gold - peso: 7 - tv valor: 8 gold - peso: 8 - colar valor: 7 gold - peso: 4 - videogame valor: 9 gold - peso: 6 Valor total: 29 gold Peso total : 25 --------------------------------------
A partir daí, dá para gente ir brincando com as configurações do algoritmo, informações do problema e outras variáveis para ver como os resultados vão se alterando.