Problema da Reunião de Negócios

Introdução


As reuniões de negócio são atividades comuns no mundo empresarial. Homens e mulheres de negócio se encontram, geralmente acompanhado de comidas e bebidas, para fazer contatos, conhecer cliente, fornecedores e parceiros. Ao fazer o contato, as pessoal normalmente trocam cartões de visita, seja ele em papel ou eletrônico. 

O trabalho prático será desenvolver um sistema que simule uma sala de reunião de negócios onde as pessoas participantes trocam cartões de visita utilizando programação concorrente multi-thread.

Descrição

Considere um ambiente de reunião que chamaremos de Sala. A Sala tem capacidade para até 5 (cinco) pessoas. Isto é, quando a Sala atingir a capacidade máxima, uma Pessoa somente poderá entrar se alguem que esteja dentro da Sala sair.

As Pessoas, homens e mulheres, ao entrar na Sala irão fazer os contatos e trocar cartões de visita (todas as Pessoas tem cartão de visita). Ao atingir a meta de 3 (três) encontros (trocar 3 cartões de visita) a Pessoa pode ir embora e sair da Sala. Entre um encontro e outro a pessoa pode descansar e aproveitar da comida e bebida.

No entanto, pela política de igualdade de gênero na empresa, qualquer pessoa, homem ou mulher, deve obter, no mínimo, um cartão de cada sexo. Isto é, cada pessoa, independente de ser homem ou mulher, deve receber, pelo menos, um cartão de outro homem e um cartão de outra mulher.

Implementação     

O trabalho prático consiste em escrever um programa em C, C++, Java ou Python para simular o problema. Não precisa fazer interface gráfica. 

O programa deve implementar a classe Pessoa() concorrente que tentará entrar na classe Sala() com capacidade de 5 (cinco) pessoas. Caso a Sala() esteja cheia ele vai descansar (wait()) esperando alguém sair.

Deverá haver uma classe que vai criar Pessoas de sexo aleatório a cada 2 (dois) segundos. Para o programa executar em tempo razoável (2 min) sugerimos criar 20 Pessoas. Ao final de 2 min o programa deve ser interrompido (podem ficar pessoas dentro da sala que não conseguiram sair).

A classe Passoa(), após entrar na Sala(), vai tentar fazer contato com uma outra Pessoa para trocar o cartão de visita (acordando qualquer outra pessoa). O encontro e a troca de cartão tem a duração de 2 (dois) segundos. Após trocar o cartão, a Pessoa() vai descansar (wait). Cada Pessoa vai tentar trocar cartões por 3 (três) vezes consecutivas, descansando definitivamente após tentar as três vezes (wait()). Lembre-se, a exclusão mútua é apenas para as duas pessoas que estão trocando cartão, vários pares poderão trocar cartão simultaneamente.

Se após essas três tentativas conseguir a combinação de cartões necessária, a Pessoa() pode sair da Sala() e permitir a entrada de outra Pessoa. Ao sair, a Pessoa avisa aos que querem entrar.

Caso não consiga todos os cartões necessários, a Pessoa() vai descansar (wait()), esperando ser acordado por alguem que esteja entrando e possua o cartão que está faltando.

Ao final da execução imprimir um relatório com as seguintes informações:
  • Listar todas as Pessoas e mostrar os cartões que cada um conseguiu e o tempo que ficou na Sala. Por exemplo: Pessoa(4) [H] {20 seg} : M M H 
  • Calcular o tempo médio na fila de entrada e o tempo médio dentro da Sala.

Avaliação

A avaliação consiste em uma apresentação oral em sala com a execução do programa e um trabalho escrito.

Apresentação Oral

Os alunos deverão fazer uma apresentação oral do trabalho realizado para os demais alunos. Na apresentação deverão mostrar a análise do problema, as formas de resolução, as decisões de implementação e a apresentação da execução do programa. 

Considera-se a execução correta se o programa cumprir o determinado sem a ocorrência de deadlocks ou starvation.

O calendário de apresentação será definido futuramente.

A apresentação oral é obrigatória. Caso o aluno não consiga apresentar na data marcada, haverá outra oportunidade, antes da NEF, para apresentar o trabalho.

Trabalho Escrito

O trabalho escrito é obrigatório.

Os alunos deverão entregar um relatório escrito com os seguintes tópicos:
  1. Formulação do problema
  2. Descrição dos algoritmos
  3. Descrição da Implementação (diagrama de classes)
  4. Resultados de, pelo menos, três execuções.
Para ajudar na preparação do relatório apresentamos um modelo de exemplo: Modelo de Relatório
Comments