/// <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); }
/// <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); }
/// <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); }
/// <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})"); }
/// <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); }