Problema na logica de um algoritmo

14 respostas
tRuNkSnEt

Venho quebrando a cabeça a alguns dias para fazer um algoritmo que tem varias condições em cascata e dependendo do resultado de uma condição, poderá modificar o resultado da condição passada. Alguem tem alguma ideia para o problema abaixo?

Possuo uma lista com 10mil objetos musica. Esses objeto tem as seguintes propriedades básicas:

  • nome:String
  • duracao:long; //milesegundos da duração
  • nacional:Boolean (indica se é nacional ou internacional)
  • artista:Artista
  • genero:Genero

O que tenho que fazer é fazer uma seleção de musicas para preencher 1 hora onde 70% seja nacional e 30% seja internacional. Porem um artista so pode se repetir a cada 30 minutos e uma musica a cada 60 minutos e ainda tem de ser observado uma lista de generos possíveis. Exemplo; Jazz = 30% da lista, Rock = 40% da lista, 30% dos demais generos.

Caramba, eu começo a fazer a organização de 70% e 30% de nacional e internacionais, dai os artistas começão a se repetir. Ai eu tiro os artistas repetidos mas os percentuais não se chocam mais. Pior que depois ainda tem de observar os generos. Fica um completo angu-de-caroço.

Qual a melhor maneira para se fazer esses testes condicioanis consecutivos? Existe alguma tecnica avançada para isso?

Obrigado, Eliezer

14 Respostas

ViniGodoy

Não existe uma maneira trivial de resolver esse problema. Algumas soluções de busca podem apresentar um resultado satisfatório, entre elas, os algorítmos genéticos.

Se as condições impostas forem muito severas (ou seja, não puder escapar nem um pouco das estatísticas, ou ter nenhuma repetição) corre-se um risco sério de nem sequer ser possível a solução.

tRuNkSnEt

Uhm. Na verdade existem margens de erros para a geração dessa playlist então acredito que se torna possível a geração dessa playlist.
Existe alguma alternativa a algoritmos geneticos?

Você tem um exemplo com muitas variaveis usando java em um exemplo real?

Vlw.

Marky.Vasconcelos

A lógica pura pode resolver, mas voce vai ter que pensar bastante.

Tente resolver o mesmo problema usando a lógica com uma quantidade menor de dados, depois passe isso para seu programa.

Ou se quiser resolver com GA (Algoritmos Geneticos) voce vai ter que estudar bastante, é uma solução tenebrosa que nem tenho ideia de onde começar pro seu problema, mas o ViniGodoy é bom nisso.

E

vou dar uma sugestão, talvez seja bem idiota, mas creio que vale a pena refinar um pouco.

Tenta dar um número para cada música de cada artista (com alguma ordenação aleatória). Seria como um id para cada música desse artista. Depois você pega e ordena as músicas por alguma conta feita com esse ID, por exemplo, se for num banco de dados, order by abs(rownum_random - <um valor aleatório gerado pelo java>), com isso as chances de não aparecer as músicas do mesmo artista em menos de 30 minutos são bem mais baixas não???

Se você quiser, pode criar uma tabela de critérios para classificar as músicas e dar uma “pontuação” para ordenar nessa busca “aleatória”, que deixaria de ser aleatória. Aqui eu trabalho bastante com estatísticos, e acabamos pegando amostras “aleatórias” de muitos registros no banco de dados usando artifícios como esse. Definimos critérios e depois ordenamos por random, limitando os registros de alguma forma (por exemplo, um where rownum < 100)

ViniGodoy

O problema é que isso não deixa de ser uma espécie de implementação do algoritmo do caixeiro viajante. Ou um caso de pesquisa multivariada com variáveis dependentes.
GA é uma das soluções clássicas para esses tipos de problemas, com bom custo benefício.

Você pode dar uma lida em mais alternativas aqui: http://www.cp.jku.at/research/papers/Pohle_dafx_2005.pdf

De onde surgiu esse problema? Por acaso é de alguma disciplina de IA? Ou do seu trabalho mesmo?

tRuNkSnEt

Olá, desculpa ai pela demora na respota mas é que esses dias estive avaliando e fazendo alguns testes básicos em GA.

Foi uma necessidade que surgiu em um software que estamos fazendo, coisa do trabalho.

Estive avaliando algumas possibilidades e GA é a solução que resolve esse problema. Porém, esse é um assunto para teses de mestrado e não vai ser fácil. Apresentei as dificuldades para os supervisores e então resolvemos diminuir para umas 3 variaveis logo, alguns ifs resolveram o problema. Acho que a única que deu para entender foi como gerar a população inicial por sorteio aleatório :slight_smile: Dai, todas as variáveis serão incluídas em uma proxima iteração.

Eu li uns 3 ou 4 teses de mestrado a respeito de GA. A lógica é show, problema é que nem tenho noção com implementar todas as etapas que visão os GA. Pior ainda que tudo que encontro sobre o assunto são exemplos banais com uma ou duas variáveis, que da até para resolver com ifs, ou somente teorias de mestrados/doutourados mas nenhum implementação aplicável à realidade, ao mercado de trabalho.

Vinny você tem algum exemplo mais realista usando GA?

Desde já agradeço a todos.

A

essa resposta não vai lhe ajudar em nada, mas gostaria de comentar que esse problema é no minimo interessante

Mas pelo menos tentou criar listas dentro de listas? Geralmente essa seria uma solução mais rápida para o problema. O fato é que muita gente se perde em meio de 3 ou mais loops

ViniGodoy

Tenho sim. Fiz um programa que calcula a menor rota que teríamos que usar para matar os bosses do Perfect World (na época que eu era líder de clã, isso poupou-nos muito tempo). Se você quiser (e eu encontrar) posso postar esse exemplo aqui.

Eu tenho uma API de Algorítmos Genéticos, e publiquei um paper sobre o assunto no SBGames de 2008.

A

Tenho sim. Fiz um programa que calcula a menor rota que teríamos que usar para matar os bosses do Perfect World (na época que eu era líder de clã, isso poupou-nos muito tempo). Se você quiser (e eu encontrar) posso postar esse exemplo aqui.

Eu tenho uma API de Algorítmos Genéticos, e publiquei um paper sobre o assunto no SBGames de 2008.

Legal, agora achei interessante esse tópico, estava precisando de algo nesse estilo para calcular as menores rotas e atravessar obstaculos em mmo =]

desculpe invadir o tópico, mas tem mais links sobre o tema?

ViniGodoy

Bom, esse é o software. Depois posto os fontes, pois não tenho eles aqui.

Com a minha framework, basicamente você só tem que montar a estrutura do genoma. Isto é, dizer como os dados são organizados, como se cruzam e como fazem mutação. O resto a API cuida sozinha.

Já incluí diversos algoritmos para cada fase do genético, e um construtor default com as opções mais comuns para quem não quer ter o trabalho de escolher nada.

ViniGodoy

O framework está em anexo. Chama-se SofiaIA. Também incluí aqui o projeto desse programinha que postei.
O programinha em si não compila, pois falta a biblioteca Util, que não tenho aqui no meu pendrive.

De qualquer forma, vocês já podem ver como o GA foi implementado.

No programinha, há uma pasta chamada Genetic. Ali, é a única implementação que tive que fazer para o framework genético funcionar. Na janela ShortestPathDialog, olhem também o método doGenetic(). Ele que roda o algorítmo em si.

A

valeu, eu tinha baixado antes o jar “arrastao”, nele tinha a classe útil…

Vou terminar de ler mais uns tutoriais e daew partir pra programação, e analisar como foi feito o seu.

Tem alguma dica de fóruns ou tópicos que tratam mais especificamente sobre esse assunto? Se possível em java.

ViniGodoy

Na web, as referências que mais gosto são essas aqui:
http://www.ai-junkie.com/ga/intro/gat1.html
http://www.obitko.com/tutorials/genetic-algorithms/portuguese/

Nenhuma delas em java.

tRuNkSnEt

Caracas ViniGodoy, muito bom mesmo. Muito obrigado pelas dicas. Começei a esboçar uma grade horária dessas de escola para fazer uns testes. Logo, eu vou postar mais alguma dúvida aqui!

Vlw.

Criado 8 de novembro de 2010
Ultima resposta 17 de nov. de 2010
Respostas 14
Participantes 5