Fundo:
Existem cerca de 60 alunos no colégio interno em que trabalho. O conselheiro pediu ao meu colega e a mim que apresentássemos uma maneira melhor de arranjar assentos para o jantar do que à mão. Ele gostaria de tarefas para o resto do ano letivo. Ele também nos pediu para tentar resolver alguns dos problemas que ouvia de alunos e professores.
Restrições:
- A maioria dos estudantes não é dos EUA; portanto, quando estão cercados por pessoas da mesma nacionalidade (ou seja, à mesa do jantar), falam o idioma em que são fluentes, em vez de praticar inglês,
- As reclamações são feitas quando os alunos se sentam em uma determinada mesa "muitas" vezes no total,
- ou se eles se sentarem na mesma mesa mais de duas vezes seguidas,
- e alguns dos alunos não se dão bem, então não podem se sentar juntos.
Entrada:
No tempo de execução, o programa é fornecido com:
- Um conjunto de pessoas,
- Um conjunto de tabelas e
- Cada mesa tem um número diferente de assentos (a repetição é permitida)
O tamanho dos dois conjuntos e o tamanho de cada tabela não muda entre cada atribuição.
Testes:
Estou usando 18 pessoas de diferentes nacionalidades e 4 tabelas de tamanho 3 a 6, inclusive. Escolhi números que achei que faziam sentido para esse conjunto de dados:
- Não mais de três pessoas da mesma nacionalidade podem sentar-se juntas de cada vez
- Nenhuma pessoa pode sentar-se à mesa mais de 4 vezes
Resultados:
Eu funcionei o gerador cerca de 15 vezes sem alterar os dados de entrada. A cada vez, ele vem de 6 a 12 "semanas" de tarefas.
Questões:
(menos para o mais importante)
- Por que obtenho um número diferente de atribuições geradas toda vez que executo o programa? O conjunto de dados não está mudando entre as execuções.
- Como encontro o ...
- número mínimo de pessoas da mesma nacionalidade que podem se sentar em uma determinada mesa,
- número mínimo de vezes em que se sentam em uma determinada mesa, enquanto
- maximizar o número de atribuições geradas?
- Como garanto que esses são realmente os números corretos?
Editar:
Cada vez que gero uma nova tarefa, convoco Collections.shuffle(List)
a lista de pessoas para randomizar seu pedido. Depois, passo a lista de tabelas e pessoas para um método de backtracking baseado na implementação das oito rainhas do kapilid no github para atribuir pessoas às tabelas.