public void AddRestricoes(Professor prof, Horario hor)
        {
            int i=0;
            while (professores[i].nome != prof.nome)
                i++;

            professores[i].AddRestrincoes(hor);
            i = 0;
            while (horarios[i].ident != hor.ident)
                i++;

            horarios[i].AddRestHorario(prof);
        }
        static void Main(string[] args)
        {
            /*
            OtimizaMochila heuristica = new OtimizaMochila(75);
            heuristica.AddItem(new Item() { Descricao = "Lanterna", Peso = 3, Utilidade = 15 });
            heuristica.AddItem(new Item() { Descricao = "Canivete Suíço", Peso = 1, Utilidade = 10 });
            heuristica.AddItem(new Item() { Descricao = "Jaca", Peso = 30, Utilidade = 3 });
            heuristica.AddItem(new Item() { Descricao = "Panela", Peso = 5, Utilidade = 15 });
            heuristica.AddItem(new Item() { Descricao = "Carne", Peso = 10, Utilidade = 20 });
            heuristica.AddItem(new Item() { Descricao = "Arroz", Peso = 7, Utilidade = 20 });
            heuristica.AddItem(new Item() { Descricao = "Feijão", Peso = 8, Utilidade = 20 });
            heuristica.AddItem(new Item() { Descricao = "Cerveja", Peso = 15, Utilidade = 8 });
            heuristica.AddItem(new Item() { Descricao = "Mapa", Peso = 1, Utilidade = 15 });
            heuristica.AddItem(new Item() { Descricao = "Celular", Peso = 3, Utilidade = 9 });
            heuristica.AddItem(new Item() { Descricao = "Barraca", Peso = 8, Utilidade = 60 });
            heuristica.AddItem(new Item() { Descricao = "Cobertor", Peso = 8, Utilidade = 25 });
            heuristica.AddItem(new Item() { Descricao = "Jornal", Peso = 3, Utilidade = 5 });
            heuristica.AddItem(new Item() { Descricao = "Papel Higiênico", Peso = 2, Utilidade = 14 });
            heuristica.AddItem(new Item() { Descricao = "Carvão", Peso = 8, Utilidade = 15 });
            heuristica.AddItem(new Item() { Descricao = "Repelente", Peso = 2, Utilidade = 5 });
            heuristica.AddItem(new Item() { Descricao = "Vara de Pescar", Peso = 3, Utilidade = 2 });
            heuristica.AddItem(new Item() { Descricao = "Pente", Peso = 1, Utilidade = 1 });
            heuristica.AddItem(new Item() { Descricao = "Espelho", Peso = 1, Utilidade = 1 });
            heuristica.AddItem(new Item() { Descricao = "Sabão", Peso = 2, Utilidade = 7 });
            heuristica.AddItem(new Item() { Descricao = "Xampu", Peso = 4, Utilidade = 5 });
            heuristica.AddItem(new Item() { Descricao = "Luvas", Peso = 1, Utilidade = 2 });
            heuristica.AddItem(new Item() { Descricao = "Violão", Peso = 15, Utilidade = 4 });
            heuristica.AddItem(new Item() { Descricao = "Fósforo", Peso = 1, Utilidade = 7 });
            heuristica.AddItem(new Item() { Descricao = "Isqueiro", Peso = 1, Utilidade = 9 });
            heuristica.AddItem(new Item() { Descricao = "Bússola", Peso = 2, Utilidade = 14 });
            heuristica.AddItem(new Item() { Descricao = "Roupa", Peso = 5, Utilidade = 28 });
            heuristica.AddItem(new Item() { Descricao = "Sapatos", Peso = 3, Utilidade = 11 });
            heuristica.AddItem(new Item() { Descricao = "Protetor Solar", Peso = 2, Utilidade = 6 });
            heuristica.AddItem(new Item() { Descricao = "Pratos", Peso = 5, Utilidade = 12 });
            heuristica.AddItem(new Item() { Descricao = "Colheres", Peso = 1, Utilidade = 8 });
            heuristica.AddItem(new Item() { Descricao = "Facas", Peso = 1, Utilidade = 13 });
            heuristica.AddItem(new Item() { Descricao = "Binóculos", Peso = 5, Utilidade = 3 });
            heuristica.AddItem(new Item() { Descricao = "GPS", Peso = 5, Utilidade = 20 });
            heuristica.AddItem(new Item() { Descricao = "Notebook", Peso = 15, Utilidade = 5 });
            heuristica.AddItem(new Item() { Descricao = "Som", Peso = 16, Utilidade = 8 });
            heuristica.AddItem(new Item() { Descricao = "Livro", Peso = 3, Utilidade = 3 });
            heuristica.AddItem(new Item() { Descricao = "Corda", Peso = 5, Utilidade = 15 });
            heuristica.AddItem(new Item() { Descricao = "Lixa Unha", Peso = 1, Utilidade = 1 });
            heuristica.AddItem(new Item() { Descricao = "Esmalte", Peso = 1, Utilidade = 1 });
            heuristica.AddItem(new Item() { Descricao = "Alicate", Peso = 2, Utilidade = 8 });
            heuristica.AddItem(new Item() { Descricao = "Machado", Peso = 15, Utilidade = 50 });
            heuristica.AddItem(new Item() { Descricao = "Linha", Peso = 1, Utilidade = 1 });
            heuristica.AddItem(new Item() { Descricao = "Agulha", Peso = 1, Utilidade = 1 });
            heuristica.AddItem(new Item() { Descricao = "Band Aid", Peso = 1, Utilidade = 12 });
            heuristica.AddItem(new Item() { Descricao = "Mertiolate", Peso = 1, Utilidade = 11 });
            heuristica.AddItem(new Item() { Descricao = "Gaze", Peso = 1, Utilidade = 13 });
            heuristica.AddItem(new Item() { Descricao = "Perfume", Peso = 1, Utilidade = 1 });
            heuristica.AddItem(new Item() { Descricao = "Leite", Peso = 4, Utilidade = 10 });
            heuristica.AddItem(new Item() { Descricao = "Biscoitos", Peso = 4, Utilidade = 10 });
            heuristica.AddItem(new Item() { Descricao = "Sucrilhos", Peso = 3, Utilidade = 7 });
            heuristica.AddItem(new Item() { Descricao = "Bombons", Peso = 3, Utilidade = 5 });
            heuristica.AddItem(new Item() { Descricao = "Meias", Peso = 1, Utilidade = 2 });
            heuristica.AddItem(new Item() { Descricao = "Chapeu", Peso = 3, Utilidade = 7 });
            heuristica.AddItem(new Item() { Descricao = "Estilingue", Peso = 1, Utilidade = 4 });
            heuristica.AddItem(new Item() { Descricao = "Martelo", Peso = 6, Utilidade = 12 });
            heuristica.AddItem(new Item() { Descricao = "Arame", Peso = 6, Utilidade = 15 });

            heuristica.GerarSolucao();
            int u = 0;
            foreach (IComponente c in heuristica.Solucao.Componentes)
            {
                Item item = (Item)c;
                u += item.Utilidade;
                System.Console.WriteLine(item.Descricao + " \t\t\tPeso: " + item.Peso + " \tUtilidade: " + item.Utilidade);
            }

            System.Console.WriteLine("\n===================================================\n ");
            System.Console.WriteLine("Peso da Mochila: " + heuristica.Mochila.CapacidadeAtual);
            System.Console.WriteLine("Utilidade da Mochila: " + heuristica.Solucao.Avaliacao);
            */

            // Problema Cacheiro Viajante

            ConstroiViagem viagem = new ConstroiViagem();

            viagem.AddComponente(new Acesso("Belo Horizonte", "Salvador",1372 ));
            viagem.AddComponente(new Acesso("Belo Horizonte", "Brasília", 716));
            viagem.AddComponente(new Acesso("Belo Horizonte", "Vitória", 524));
            viagem.AddComponente(new Acesso("Belo Horizonte", "São Paulo", 586));
            viagem.AddComponente(new Acesso("Belo Horizonte", "Rio de Janeiro", 434));
            viagem.AddComponente(new Acesso("Belo Horizonte", "Curitiba", 1004));
            viagem.AddComponente(new Acesso("Belo Horizonte", "Joenvile", 1301));

            viagem.AddComponente(new Acesso("Salvador", "Belo Horizonte", 1372));
            viagem.AddComponente(new Acesso("Salvador", "Brasília", 1446));
            viagem.AddComponente(new Acesso("Salvador", "Vitória", 1202));
            viagem.AddComponente(new Acesso("Salvador", "São Paulo", 1962));
            viagem.AddComponente(new Acesso("Salvador", "Rio de Janeiro", 1649));
            viagem.AddComponente(new Acesso("Salvador", "Curitiba", 2385));
            viagem.AddComponente(new Acesso("Salvador", "Joenvile", 2682));

            viagem.AddComponente(new Acesso("Brasília", "Belo Horizonte", 716));
            viagem.AddComponente(new Acesso("Brasília", "Salvador", 1446));
            viagem.AddComponente(new Acesso("Brasília", "Vitória", 1239));
            viagem.AddComponente(new Acesso("Brasília", "São Paulo", 1015));
            viagem.AddComponente(new Acesso("Brasília", "Rio de Janeiro", 1148));
            viagem.AddComponente(new Acesso("Brasília", "Curitiba", 1366));
            viagem.AddComponente(new Acesso("Brasília", "Joenvile", 1673));

            viagem.AddComponente(new Acesso("Vitória", "Belo Horizonte", 524));
            viagem.AddComponente(new Acesso("Vitória", "Salvador", 1202));
            viagem.AddComponente(new Acesso("Vitória", "Brasília", 1239));
            viagem.AddComponente(new Acesso("Vitória", "São Paulo", 882));
            viagem.AddComponente(new Acesso("Vitória", "Rio de Janeiro", 521));
            viagem.AddComponente(new Acesso("Vitória", "Curitiba", 1300));
            viagem.AddComponente(new Acesso("Vitória", "Joenvile", 1597));

            viagem.AddComponente(new Acesso("São Paulo", "Belo Horizonte", 586));
            viagem.AddComponente(new Acesso("São Paulo", "Salvador", 1962));
            viagem.AddComponente(new Acesso("São Paulo", "Brasília", 1015));
            viagem.AddComponente(new Acesso("São Paulo", "Vitória", 882));
            viagem.AddComponente(new Acesso("São Paulo", "Rio de Janeiro", 429));
            viagem.AddComponente(new Acesso("São Paulo", "Curitiba", 408));
            viagem.AddComponente(new Acesso("São Paulo", "Joenvile", 705));

            viagem.AddComponente(new Acesso("Rio de Janeiro", "Belo Horizonte", 434));
            viagem.AddComponente(new Acesso("Rio de Janeiro", "Salvador", 1649));
            viagem.AddComponente(new Acesso("Rio de Janeiro", "Brasília", 1148));
            viagem.AddComponente(new Acesso("Rio de Janeiro", "Vitória", 521));
            viagem.AddComponente(new Acesso("Rio de Janeiro", "São Paulo", 429));
            viagem.AddComponente(new Acesso("Rio de Janeiro", "Curitiba", 852));
            viagem.AddComponente(new Acesso("Rio de Janeiro", "Joenvile", 1144));

            viagem.AddComponente(new Acesso("Curitiba", "Belo Horizonte", 1004));
            viagem.AddComponente(new Acesso("Curitiba", "Salvador", 2385));
            viagem.AddComponente(new Acesso("Curitiba", "Brasília", 1366));
            viagem.AddComponente(new Acesso("Curitiba", "Vitória", 1300));
            viagem.AddComponente(new Acesso("Curitiba", "São Paulo", 408));
            viagem.AddComponente(new Acesso("Curitiba", "Rio de Janeiro", 852));
            viagem.AddComponente(new Acesso("Curitiba", "Joenvile", 300));

            viagem.AddComponente(new Acesso("Joenvile", "Belo Horizonte", 1301));
            viagem.AddComponente(new Acesso("Joenvile", "Salvador", 2682));
            viagem.AddComponente(new Acesso("Joenvile", "Brasília", 1673));
            viagem.AddComponente(new Acesso("Joenvile", "Vitória", 1597));
            viagem.AddComponente(new Acesso("Joenvile", "São Paulo", 705));
            viagem.AddComponente(new Acesso("Joenvile", "Rio de Janeiro", 1144));
            viagem.AddComponente(new Acesso("Joenvile", "Curitiba", 300));

            //viagem.GerarViagem("Belo Horizonte");

            viagem.GerarSolucao();
            System.Console.WriteLine("\n===================================================\n ");
            System.Console.WriteLine("\nCaixeiro Viajante\n\n ");
            foreach (Acesso a in viagem.rota.Componentes)
                System.Console.WriteLine("Partida: " + a.cidPartida + "  Destino: "+a.cidDestino+"  Distancia: "+a.km+"KM");

            System.Console.WriteLine("\nDistância percorrida: " + viagem.rota.kmPercorridos + "KM\n\n");

            // Problema Quadro de Horario

            ConstroiQuadroHorario quadroHorario = new ConstroiQuadroHorario();

            Horario SEG12 = new Horario("SEG12");
            quadroHorario.AddHorarios(SEG12);
            Horario SEG34 = new Horario("SEG34");
            quadroHorario.AddHorarios(SEG34);
            Horario TER12 = new Horario("TER12");
            quadroHorario.AddHorarios(TER12);
            Horario TER34 = new Horario("TER34");
            quadroHorario.AddHorarios(TER34);
            Horario QUA12 = new Horario("QUA12");
            quadroHorario.AddHorarios(QUA12);
            Horario QUA34 = new Horario("QUA34");
            quadroHorario.AddHorarios(QUA34);
            Horario QUI12 = new Horario("QUI12");
            quadroHorario.AddHorarios(QUI12);
            Horario QUI34 = new Horario("QUI34");
            quadroHorario.AddHorarios(QUI34);
            Horario SEX12 = new Horario("SEX12");
            quadroHorario.AddHorarios(SEX12);
            Horario SEX34 = new Horario("SEX34");
            quadroHorario.AddHorarios(SEX34);

            Professor P1 = new Professor("P1");
            quadroHorario.AddProfessores(P1);
            Professor P2 = new Professor("P2");
            quadroHorario.AddProfessores(P2);
            Professor P3 = new Professor("P3");
            quadroHorario.AddProfessores(P3);
            Professor P4 = new Professor("P4");
            quadroHorario.AddProfessores(P4);
            Professor P5 = new Professor("P5");
            quadroHorario.AddProfessores(P5);

            quadroHorario.AddRestricoes(P1, SEG12);
            quadroHorario.AddRestricoes(P1, TER12);
            quadroHorario.AddRestricoes(P1, QUI12);

            quadroHorario.AddRestricoes(P2, SEX34);
            quadroHorario.AddRestricoes(P2, QUI34);

            quadroHorario.AddRestricoes(P3, QUA12);
            quadroHorario.AddRestricoes(P3, QUA34);
            quadroHorario.AddRestricoes(P3, TER34);

            quadroHorario.AddRestricoes(P4, SEX34);
            quadroHorario.AddRestricoes(P4, QUI12);

            quadroHorario.AddRestricoes(P5, TER12);
            quadroHorario.AddRestricoes(P5, QUI12);
            quadroHorario.AddRestricoes(P5, QUA12);

            quadroHorario.GerarSolucao();

            System.Console.WriteLine("\n===================================================\n ");
            System.Console.WriteLine("\nQuadro de Horario\n\n ");
            foreach(Alocacao al in quadroHorario.Solucao.Componentes)
            {
                   System.Console.Write("Horario: "+al.horario.ident + "  Professor: " + al.professor.nome+"\n");
            }

            System.Console.ReadLine();
        }
 public void AddProfessores(Professor p)
 {
     if (!professores.Contains(p))
         professores.Add(p);
 }
 Boolean RestrincaoHorario(Professor p, int i)
 {
     // verifica se o professor tem restrição ao horario especifico da lista passado pelo indice i
     if (p.restricoes.Contains(horarios[i]))
         return true;
     else
         return false; ;
 }
        Boolean CargaHorariaIncompleta(Professor p)
        {
            int alocAulas = 0;

            // verifica a quantidade de alocação do professor
            foreach (Alocacao aloc in Solucao.Componentes)
            {
                if (aloc.professor.nome == p.nome)
                    alocAulas++;
            }

            if (alocAulas < 2 )
                return true;
            else
                return false;
        }
 public void RemoveProfessores(Professor p)
 {
     if (professores.Contains(p))
         professores.Remove(p);
 }
 public Alocacao(Professor p, Horario h)
 {
     professor = p;
     horario = h;
 }
 public Alocacao()
 {
     professor = new Professor();
     horario = new Horario();
 }