Ejemplo n.º 1
0
        /// <summary>
        /// Calcular o custo até o lixo objetivo
        /// Depois varre a matriz calculando o custo do objetivo até os próximos lixos a serem coletados
        /// Somando os dois e retonando o custo
        /// </summary>
        private List <Expandir> RotasLixoComArmazenamentoZerado(int linha, int coluna)
        {
            List <Expandir> filaPrioridade = new List <Expandir>();

            int custoObjetivo = CalcularCusto(linhaRobo, colunaRobo, linha, coluna);

            matrizHeuristica[linha, coluna] = (int)EEstados.VAZIO;

            for (int i = 0; i < LINHAS; i++)
            {
                for (int j = 0; j < COLUNAS; j++)
                {
                    if (i == linha && j == coluna)
                    {
                        continue;
                    }
                    if (matrizHeuristica[i, j] == (int)EEstados.LIXO)
                    {
                        Expandir _expandir = new Expandir {
                            linha = linha, coluna = coluna, acao = EAcoes.PegarLixo
                        };
                        _expandir.custo        = CalcularCusto(linha, coluna, i, j) + custoObjetivo;
                        matrizHeuristica[i, j] = (int)EEstados.VAZIO;

                        filaPrioridade.Add(_expandir);
                    }
                }
            }

            ResetarHeuristica();
            return(filaPrioridade);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Calcular o custo até o posto de coleta mais próximo
        /// Depois varre a matriz calculando o custo do objetivo até os próximos lixos a serem coletados
        /// Somando os 2 para ver qual a melhor opção
        /// </summary>
        private List <Expandir> RotasPostosDeColetaComLixoRestante(int linha, int coluna)
        {
            List <Expandir> filaPrioridade = new List <Expandir>();

            int custoObjetivo = CalcularCusto(linhaRobo, colunaRobo, linha, coluna);

            for (int i = 0; i < LINHAS; i++)
            {
                for (int j = 0; j < COLUNAS; j++)
                {
                    if (matrizHeuristica[i, j] == (int)EEstados.LIXO)
                    {
                        int      custoTotal = CalcularCusto(linha, coluna, i, j) + custoObjetivo;
                        Expandir _expandir  = new Expandir {
                            linha = linha, coluna = coluna, custo = custoTotal, acao = EAcoes.FazerColeta
                        };

                        filaPrioridade.Add(_expandir);
                    }
                }
            }

            ResetarHeuristica();
            return(filaPrioridade);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// (Só executar quando está faltando um material para encher o armazenamento do robô)
        ///
        /// Calcular o custo até o lixo objetivo
        /// Depois varre a lista procurando os postos de coletas mais perto dele
        /// </summary>
        private List <Expandir> RotasPostosDeColetaComArmazenamentoQuaseCheio(int linha, int coluna)
        {
            List <Expandir> filaPrioridade = new List <Expandir>();

            int custoTotal = CalcularCusto(linhaRobo, colunaRobo, linha, coluna);

            for (int i = 0; i < LINHAS; i++)
            {
                for (int j = 0; j < COLUNAS; j++)
                {
                    if (matrizHeuristica[i, j] == (int)EEstados.COLETA)
                    {
                        Expandir _expandir = new Expandir {
                            linha = linha, coluna = coluna, custo = custoTotal, acao = EAcoes.PegarLixo
                        };
                        _expandir.custo += CalcularCusto(linha, coluna, i, j);

                        filaPrioridade.Add(_expandir);
                    }
                }
            }

            ResetarHeuristica();
            return(filaPrioridade);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Mover o robô para
        /// </summary>
        public string IrParaObjetivo(List <Expandir> filaPrioridade)
        {
            Expandir expandir = filaPrioridade.FirstOrDefault();

            expandir.custo = CalcularCusto(linhaRobo, colunaRobo, expandir.linha, expandir.coluna);

            linhaRobo  = expandir.linha;
            colunaRobo = expandir.coluna;

            if (expandir.acao == EAcoes.PegarLixo)
            {
                armazenamentoRobo++;
                matrizHeuristica[expandir.linha, expandir.coluna] = (int)EEstados.ROBO;
            }
            else if (expandir.acao == EAcoes.FazerColeta)
            {
                armazenamentoRobo = 0;
            }

            matriz = matrizHeuristica;

            cargaAtualRobo -= expandir.custo;

            return($"Carga(-{expandir.custo}) (Mover robo para linha({linhaRobo}) coluna({colunaRobo}): {expandir.acao})");
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Verifica qual o ponto de coleta mais próximo do robô para a coleta (Quando não tem nenhum lixo restante)
        /// </summary>
        private List <Expandir> RotasPostosDeColeta(int linha, int coluna)
        {
            List <Expandir> filaPrioridade = new List <Expandir>();

            for (int i = 0; i < LINHAS; i++)
            {
                for (int j = 0; j < COLUNAS; j++)
                {
                    if (matrizHeuristica[i, j] == (int)EEstados.COLETA)
                    {
                        int      custoTotal = CalcularCusto(linha, coluna, i, j);
                        Expandir _expandir  = new Expandir {
                            linha = i, coluna = j, custo = custoTotal, acao = EAcoes.FazerColeta
                        };

                        filaPrioridade.Add(_expandir);
                    }
                }
            }

            ResetarHeuristica();
            return(filaPrioridade);
        }