public Bitmap DesenharSolucaoTarefasNasLinhas(DadosSequencia SequenciaDesenho)
        {
            Bitmap   Desenho   = new Bitmap(600, 400);
            Graphics g         = Graphics.FromImage(Desenho);
            Random   Aleatorio = new Random(1);

            g.FillRectangle(Brushes.White, 0, 0, 600, 400);
            g.FillRectangle(Brushes.Black, 25, 25, 550, 350);
            Brush[] Pincel = new Brush[NumeroMaquinas];
            for (int i = 0; i < NumeroMaquinas; i++)
            {
                Pincel[i] = new SolidBrush(Color.FromArgb(175, Aleatorio.Next(256), Aleatorio.Next(256), Aleatorio.Next(256)));
            }
            //CalcularInstantesInicioFimCadaTarefaEmCadaMaquina(SequenciaDesenho.Sequencia);
            double Altura        = 350 / (double)NumeroTarefas;
            double EscalaLargura = 550 / (double)SequenciaDesenho.Makespan;

            for (int i = 0; i < NumeroTarefas; i++)
            {
                int TarefaAtual = SequenciaDesenho.Sequencia[i];
                for (int j = 0; j < NumeroMaquinas; j++)
                {
                    Rectangle Retangulo = new Rectangle(25 + (int)(EscalaLargura * SequenciaDesenho.MatrizInstantes[TarefaAtual, j]), 25 + (int)(Altura * i), (int)(EscalaLargura * (SequenciaDesenho.MatrizInstantes[TarefaAtual, j + NumeroMaquinas] - SequenciaDesenho.MatrizInstantes[TarefaAtual, j])), (int)(Altura));
                    g.FillRectangle(Pincel[j], Retangulo);
                }
            }
            return(Desenho);
        }
        public DadosSequencia CalcularInstantesInicioFimCadaTarefaEmCadaMaquina(int[] Sequencia)
        {
            DadosSequencia DadosRetorno = new DadosSequencia();

            int[] InstanteLiberacaoMaquinas = new int[NumeroMaquinas];
            for (int j = 0; j < NumeroMaquinas; j++)
            {
                InstanteLiberacaoMaquinas[j] = InstantesIniciaisDasMaquinas[j];
            }
            DadosRetorno.Sequencia       = new int[NumeroTarefas];
            DadosRetorno.MatrizInstantes = new int[NumeroTarefas, 2 * NumeroMaquinas];
            int TarefaAtual;

            for (int i = 0; i < NumeroTarefas; i++)
            {
                TarefaAtual = Sequencia[i];
                DadosRetorno.MatrizInstantes[TarefaAtual, 0] = InstanteLiberacaoMaquinas[0];
                DadosRetorno.MatrizInstantes[TarefaAtual, 0 + NumeroMaquinas] = DadosRetorno.MatrizInstantes[TarefaAtual, 0] + MatrizTemposProcessamento[TarefaAtual, 0];
                InstanteLiberacaoMaquinas[0] = DadosRetorno.MatrizInstantes[TarefaAtual, 0 + NumeroMaquinas];
                for (int j = 1; j < NumeroMaquinas; j++)
                {
                    DadosRetorno.MatrizInstantes[TarefaAtual, j] = Maximo(DadosRetorno.MatrizInstantes[TarefaAtual, NumeroMaquinas + j - 1], InstanteLiberacaoMaquinas[j]);
                    DadosRetorno.MatrizInstantes[TarefaAtual, j + NumeroMaquinas] = DadosRetorno.MatrizInstantes[TarefaAtual, j] + MatrizTemposProcessamento[TarefaAtual, j];
                    InstanteLiberacaoMaquinas[j] = DadosRetorno.MatrizInstantes[TarefaAtual, j + NumeroMaquinas];
                }
            }
            DadosRetorno.Makespan = DadosRetorno.MatrizInstantes[Sequencia[Sequencia.GetLength(0) - 1], NumeroMaquinas * 2 - 1];
            for (int i = 0; i < NumeroTarefas; i++)
            {
                DadosRetorno.Sequencia[i] = Sequencia[i];
            }
            return(DadosRetorno);
        }
        public DadosSequencia EncontraMelhorSequenciaBuscaVizinhanca()
        {
            Random         SementeAleatoria     = new Random();
            DadosSequencia DadosMelhorSequencia = new DadosSequencia();

            DadosMelhorSequencia.Sequencia = new int[NumeroTarefas];
            DadosMelhorSequencia.Makespan  = 9999999;
            int[] Movimento             = new int[2];
            int   NumeroMaximoIteracoes = 10;
            int   NumeroAtualIteracoes  = 0;

            int[] Sequencia = new int[NumeroTarefas];
            for (int h = 0; h < 1000; h++)
            {
                Sequencia = GerarSequenciaAleatoria(SementeAleatoria.Next(0, 100000000));
                DadosSequencia DadosSolucaoAleatoria = CalcularInstantesInicioFimCadaTarefaEmCadaMaquina(Sequencia);
                bool           TeveMelhoria          = true;
                while (TeveMelhoria)
                {
                    TeveMelhoria = false;
                    for (int i = 0; i < NumeroTarefas; i++)
                    {
                        for (int j = i + 1; j < NumeroTarefas; j++)
                        {
                            int[] SequenciaVizinhaAtual = new int[NumeroTarefas];
                            for (int k = 0; k < NumeroTarefas; k++)
                            {
                                SequenciaVizinhaAtual[k] = Sequencia[k];
                            }
                            SequenciaVizinhaAtual[i] = Sequencia[j];
                            SequenciaVizinhaAtual[j] = Sequencia[i];
                            DadosSequencia DadosSolucaoVizinhaAtual = CalcularInstantesInicioFimCadaTarefaEmCadaMaquina(SequenciaVizinhaAtual);
                            if (DadosSolucaoVizinhaAtual.Makespan < DadosMelhorSequencia.Makespan)
                            {
                                DadosMelhorSequencia.Makespan = DadosSolucaoVizinhaAtual.Makespan;
                                Movimento[0] = i;
                                Movimento[1] = j;
                                TeveMelhoria = true;
                            }
                        }
                    }
                    int aux = Sequencia[Movimento[0]];
                    Sequencia[Movimento[0]] = Sequencia[Movimento[1]];
                    Sequencia[Movimento[1]] = aux;
                    NumeroAtualIteracoes++;
                }
            }


            for (int k = 0; k < NumeroTarefas; k++)
            {
                DadosMelhorSequencia.Sequencia[k] = Sequencia[k];
            }
            return(DadosMelhorSequencia);
        }
Exemple #4
0
        private void btnTabu_Click(object sender, EventArgs e)
        {
            ProblemaFSP MeuProblema = new ProblemaFSP();

            MeuProblema.LerProblema(@"D:\Teste\ExemploFSP2.txt");
            Stopwatch Cronometro = new Stopwatch();

            Cronometro.Start();
            DadosSequencia MelhorSequencia = MeuProblema.BuscaTabu();

            Cronometro.Stop();
            MessageBox.Show(Cronometro.ElapsedMilliseconds.ToString());
            string SequenciaAtual = MelhorSequencia.Sequencia[0].ToString();

            for (int i = 1; i < MelhorSequencia.Sequencia.GetLength(0); i++)
            {
                SequenciaAtual = SequenciaAtual + "-" + MelhorSequencia.Sequencia[i].ToString();
            }
            MessageBox.Show("O makespan da sequência " + SequenciaAtual + " é " + MelhorSequencia.Makespan.ToString() + " e foi a melhor sequência encontrada");
        }
        public DadosSequencia EncontraMelhorSequenciaAleatoria(int NumeroSequencias)
        {
            StreamWriter   Escrever             = new StreamWriter(@"C:\Teste\saidaFSP.txt");
            Random         SementeAleatoria     = new Random();
            DadosSequencia DadosMelhorSequencia = new DadosSequencia();

            DadosMelhorSequencia.Makespan        = 9999999;
            DadosMelhorSequencia.Sequencia       = new int[NumeroTarefas];
            DadosMelhorSequencia.MatrizInstantes = new int[NumeroTarefas, NumeroMaquinas * 2];
            for (int k = 0; k < NumeroSequencias; k++)
            {
                int[] Sequencia = GerarSequenciaAleatoria(SementeAleatoria.Next(0, 100000000));
                for (int i = 0; i < NumeroTarefas; i++)
                {
                    Escrever.Write(Sequencia[i].ToString() + ";");
                }
                DadosSequencia DadosAuxiliar = CalcularInstantesInicioFimCadaTarefaEmCadaMaquina(Sequencia);
                Escrever.WriteLine(DadosAuxiliar.Makespan.ToString());
                if (DadosAuxiliar.Makespan < DadosMelhorSequencia.Makespan)
                {
                    DadosMelhorSequencia.Makespan = DadosAuxiliar.Makespan;
                    for (int i = 0; i < NumeroTarefas; i++)
                    {
                        DadosMelhorSequencia.Sequencia[i] = Sequencia[i];
                    }
                    for (int i = 0; i < NumeroTarefas; i++)
                    {
                        for (int j = 0; j < NumeroMaquinas * 2; j++)
                        {
                            DadosMelhorSequencia.MatrizInstantes[i, j] = DadosAuxiliar.MatrizInstantes[i, j];
                        }
                    }
                }
            }
            Escrever.Close();
            Escrever.Dispose();
            return(DadosMelhorSequencia);
        }
        public DadosSequencia EncontraMelhorVizinho(DadosSequencia SequenciaAtual, int[,] Tabu)
        {
            DadosSequencia MelhorVizinho = new DadosSequencia();

            MelhorVizinho.Makespan          = 9999999;
            MelhorVizinho.MovimentoAnterior = new int[2];
            for (int i = 0; i < NumeroTarefas; i++)
            {
                for (int j = i + 1; j < NumeroTarefas; j++)
                {
                    if (Tabu[i, j] == 0)
                    {
                        int[] SequenciaCandidata = new int[NumeroTarefas];
                        for (int k = 0; k < NumeroTarefas; k++)
                        {
                            SequenciaCandidata[k] = SequenciaAtual.Sequencia[k];
                        }
                        SequenciaCandidata[i] = SequenciaAtual.Sequencia[j];
                        SequenciaCandidata[j] = SequenciaAtual.Sequencia[i];
                        DadosSequencia DadosSequenciaCandidata = CalcularInstantesInicioFimCadaTarefaEmCadaMaquina(SequenciaCandidata);
                        if (DadosSequenciaCandidata.Makespan < MelhorVizinho.Makespan)
                        {
                            MelhorVizinho.Makespan             = DadosSequenciaCandidata.Makespan;
                            MelhorVizinho.MovimentoAnterior[0] = i;
                            MelhorVizinho.MovimentoAnterior[1] = j;
                        }
                    }
                }
            }
            MelhorVizinho.Sequencia = new int[NumeroTarefas];
            for (int k = 0; k < NumeroTarefas; k++)
            {
                MelhorVizinho.Sequencia[k] = SequenciaAtual.Sequencia[k];
            }
            MelhorVizinho.Sequencia[MelhorVizinho.MovimentoAnterior[0]] = SequenciaAtual.Sequencia[MelhorVizinho.MovimentoAnterior[1]];
            MelhorVizinho.Sequencia[MelhorVizinho.MovimentoAnterior[1]] = SequenciaAtual.Sequencia[MelhorVizinho.MovimentoAnterior[0]];
            return(MelhorVizinho);
        }
Exemple #7
0
        private void button1_Click(object sender, EventArgs e)
        {
            ProblemaFSP MeuProblema = new ProblemaFSP();

            MeuProblema.LerProblema(@"D:\Teste\ExemploFSP2.txt");
            Stopwatch Cronometro = new Stopwatch();

            Cronometro.Start();
            DadosSequencia MelhorSequencia = MeuProblema.EncontraMelhorSequenciaAleatoria(int.Parse(txtNumeroSequencias.Text));

            Cronometro.Stop();
            MessageBox.Show(Cronometro.ElapsedMilliseconds.ToString());
            string SequenciaAtual = MelhorSequencia.Sequencia[0].ToString();

            for (int i = 1; i < MelhorSequencia.Sequencia.GetLength(0); i++)
            {
                SequenciaAtual = SequenciaAtual + "-" + MelhorSequencia.Sequencia[i].ToString();
            }
            MessageBox.Show("O makespan da sequência " + SequenciaAtual + " é " + MelhorSequencia.Makespan.ToString() + " e foi a melhor sequência encontrada");
            Bitmap DesenhoSolucao = MeuProblema.DesenharSolucaoTarefasNasLinhas(MelhorSequencia);

            picDesenho.Image = DesenhoSolucao;
        }
        public DadosSequencia BuscaTabu()
        {
            DadosSequencia RespostaBuscaTabu  = new DadosSequencia();
            DadosSequencia SequenciaCandidata = new DadosSequencia();
            DadosSequencia SequenciaAtual     = new DadosSequencia();

            int[,] ListaTabuIteracoes   = new int[NumeroTarefas, NumeroTarefas];
            SequenciaAtual.Sequencia    = GerarSequenciaAleatoria(2);
            SequenciaAtual              = CalcularInstantesInicioFimCadaTarefaEmCadaMaquina(SequenciaAtual.Sequencia);
            RespostaBuscaTabu.Makespan  = SequenciaAtual.Makespan;
            RespostaBuscaTabu.Sequencia = new int[NumeroTarefas];
            int    MandatoTabu = 6;
            Random Aleatorio   = new Random(1);

            for (int i = 0; i < NumeroTarefas; i++)
            {
                RespostaBuscaTabu.Sequencia[i] = SequenciaAtual.Sequencia[i];
            }
            int MaximoIteracoes      = 100;
            int NumeroAtualIteracoes = 0;

            while (NumeroAtualIteracoes < MaximoIteracoes)
            {
                for (int i = 0; i < NumeroTarefas; i++)
                {
                    for (int j = 0; j < NumeroTarefas; j++)
                    {
                        if (ListaTabuIteracoes[i, j] > 0)
                        {
                            ListaTabuIteracoes[i, j]--;
                        }
                    }
                }
                SequenciaCandidata = EncontraMelhorVizinho(SequenciaAtual, ListaTabuIteracoes);
                if (SequenciaCandidata.Makespan < RespostaBuscaTabu.Makespan)
                {
                    RespostaBuscaTabu.Makespan = SequenciaCandidata.Makespan;
                    for (int i = 0; i < NumeroTarefas; i++)
                    {
                        RespostaBuscaTabu.Sequencia[i] = SequenciaCandidata.Sequencia[i];
                    }
                    SequenciaAtual.Makespan = SequenciaCandidata.Makespan;
                    for (int i = 0; i < NumeroTarefas; i++)
                    {
                        SequenciaAtual.Sequencia[i] = SequenciaCandidata.Sequencia[i];
                    }
                    ListaTabuIteracoes[SequenciaCandidata.MovimentoAnterior[0], SequenciaCandidata.MovimentoAnterior[1]] = MandatoTabu;
                    ListaTabuIteracoes[SequenciaCandidata.MovimentoAnterior[1], SequenciaCandidata.MovimentoAnterior[0]] = MandatoTabu;
                }
                else if (SequenciaCandidata.Makespan < SequenciaAtual.Makespan)
                {
                    SequenciaAtual.Makespan = SequenciaCandidata.Makespan;
                    for (int i = 0; i < NumeroTarefas; i++)
                    {
                        SequenciaAtual.Sequencia[i] = SequenciaCandidata.Sequencia[i];
                    }
                    ListaTabuIteracoes[SequenciaCandidata.MovimentoAnterior[0], SequenciaCandidata.MovimentoAnterior[1]] = MandatoTabu;
                    ListaTabuIteracoes[SequenciaCandidata.MovimentoAnterior[1], SequenciaCandidata.MovimentoAnterior[0]] = MandatoTabu;
                }
                else
                {
                    if (Aleatorio.NextDouble() < 0.2)
                    {
                        SequenciaAtual.Makespan = SequenciaCandidata.Makespan;
                        for (int i = 0; i < NumeroTarefas; i++)
                        {
                            SequenciaAtual.Sequencia[i] = SequenciaCandidata.Sequencia[i];
                        }
                        ListaTabuIteracoes[SequenciaCandidata.MovimentoAnterior[0], SequenciaCandidata.MovimentoAnterior[1]] = MandatoTabu;
                        ListaTabuIteracoes[SequenciaCandidata.MovimentoAnterior[1], SequenciaCandidata.MovimentoAnterior[0]] = MandatoTabu;
                    }
                }
                NumeroAtualIteracoes++;
            }
            return(RespostaBuscaTabu);
        }