Ambientes de Agentes e Tomada de Decisão

Análise de Ambientes e Projeto de Agentes Racionais

Autor

Márcio Nicolau

Data de Publicação

4 de setembro de 2025

Introdução

Após explorar a estrutura e os tipos de agentes inteligentes, é fundamental direcionarmos nossa atenção para o contexto no qual esses agentes operam: o ambiente. A forma como um agente percebe e age sobre o mundo é profundamente influenciada pelas características do seu ambiente. Um agente só pode ser verdadeiramente inteligente se for capaz de tomar decisões racionais, e a racionalidade é sempre relativa ao ambiente. Nesta aula, classificaremos os ambientes de agentes, entenderemos como suas propriedades impactam o design de agentes e discutiremos os princípios da tomada de decisão racional.

Objetivo de Aprendizagem

Ao final desta aula, você será capaz de:

  • Classificar ambientes de agentes inteligentes com base em suas dimensões chave.
  • Analisar como as características do ambiente afetam a complexidade do projeto de um agente inteligente.
  • Explicar o conceito de tomada de decisão racional em diferentes tipos de ambientes.
  • Projetar agentes inteligentes com estratégias de decisão adequadas às propriedades de ambientes específicos.

Características dos Ambientes de Agentes

Para projetar um agente racional, é essencial entender o tipo de ambiente em que ele operará. (Russell; Norvig, 2004, p. 40–43) propõem várias dimensões para classificar ambientes, cada uma influenciando a complexidade e o design do agente.

Observabilidade (Fully Observable vs. Partially Observable)

  • Totalmente Observável (Fully Observable): Os sensores do agente fornecem acesso completo ao estado do ambiente a cada instante. O agente sabe tudo o que precisa saber sobre o mundo para tomar uma decisão.
    • Exemplo: Um jogo de xadrez (o tabuleiro completo é visível para ambos os jogadores).
  • Parcialmente Observável (Partially Observable): O agente não tem acesso completo ao estado do ambiente. Pode ser devido a sensores incompletos, com ruído, ou porque partes do ambiente estão ocultas.
    • Exemplo: Um carro autônomo (não consegue ver através de outros carros ou em curvas, os sensores têm limites). Um aspirador de pó simples sem sensores de localização que não sabe onde já limpou.
    • Implicação para o Agente: Agentes em ambientes parcialmente observáveis precisam manter um estado interno ou um modelo do mundo para rastrear a informação relevante.

Determinismo (Deterministic vs. Stochastic)

  • Determinístico (Deterministic): O próximo estado do ambiente é completamente determinado pelo estado atual e pela ação executada pelo agente. O resultado das ações é previsível.
    • Exemplo: Um problema de quebra-cabeça de 8 peças (um movimento para a esquerda sempre resulta no mesmo novo arranjo).
  • Estocástico (Stochastic): O próximo estado do ambiente não é totalmente determinado pela ação do agente; há elementos de aleatoriedade.
    • Exemplo: Lançar um dado. Em um carro autônomo, outros motoristas podem agir de forma imprevisível. Um aspirador de pó em que, às vezes, a sujeira reaparece ou se espalha.
    • Implicação para o Agente: Agentes em ambientes estocásticos precisam lidar com a incerteza, frequentemente utilizando probabilidades e a maximização da utilidade esperada.

Episódico vs. Sequencial (Episodic vs. Sequential)

  • Episódico (Episodic): A experiência do agente é dividida em “episódios” atômicos, onde cada episódio consiste em uma percepção e uma ação, e a decisão em um episódio não afeta os futuros.
    • Exemplo: Um sistema de classificação de peças em uma linha de montagem (cada peça é um novo episódio, a classificação de uma não afeta a próxima).
  • Sequencial (Sequential): As ações atuais afetam as percepções e decisões futuras. O agente precisa planejar com antecedência e considerar as consequências de longo prazo.
    • Exemplo: Um jogo de xadrez (cada movimento afeta o estado do tabuleiro e as possibilidades futuras). A condução de um carro autônomo.
    • Implicação para o Agente: Agentes em ambientes sequenciais requerem planejamento e raciocínio sobre sequências de ações.

Estático vs. Dinâmico (Static vs. Dynamic)

  • Estático (Static): O ambiente não muda enquanto o agente está deliberando. O agente não precisa se preocupar com as mudanças do mundo enquanto pensa em qual ação realizar.
    • Exemplo: Um problema de quebra-cabeça (o tabuleiro não se reorganiza sozinho).
  • Dinâmico (Dynamic): O ambiente pode mudar enquanto o agente está deliberando. Isso exige que o agente observe continuamente o mundo e se adapte a novas situações.
    • Exemplo: Dirigir um carro (o tráfego, semáforos e pedestres mudam constantemente).
    • Implicação para o Agente: Em ambientes dinâmicos, o tempo de resposta é crucial. Agentes podem precisar de regras reativas rápidas, além de planejamento mais lento.

Discreto vs. Contínuo (Discrete vs. Continuous)

  • Discreto (Discrete): O número de estados do ambiente, de percepções e de ações é finito e enumerável.
    • Exemplo: Jogo de xadrez (um número finito de casas, peças, movimentos). Um semáforo (estados: verde, amarelo, vermelho).
  • Contínuo (Continuous): O número de estados, percepções e ações é infinito ou tem um grau de variação contínuo.
    • Exemplo: Dirigir um carro (velocidade, posição, ângulo do volante podem assumir infinitos valores). A temperatura ambiente.
    • Implicação para o Agente: Ambientes contínuos frequentemente exigem aproximações e algoritmos que lidam com valores reais, como redes neurais para percepção.

Único Agente vs. Multiagente (Single-Agent vs. Multiagent)

  • Único Agente (Single-Agent): O agente opera sozinho no ambiente, e as ações de outros agentes não são consideradas parte do problema.
    • Exemplo: Um aspirador de pó solitário.
  • Multiagente (Multiagent): Existem múltiplos agentes no ambiente, e as ações de um agente podem afetar (e ser afetadas por) as ações de outros.
    • Competitivo: Os agentes têm objetivos conflitantes (ex: jogo de xadrez entre dois jogadores).
    • Cooperativo: Os agentes têm objetivos comuns e trabalham juntos (ex: robôs trabalhando em uma linha de montagem).
    • Implicação para o Agente: Ambientes multiagentes exigem estratégias de teoria dos jogos, coordenação e modelos dos outros agentes.

Tabela Resumo das Características do Ambiente

Característica Totalmente Observável Parcialmente Observável
Determinismo Determinístico Estocástico
Episódico / Sequencial Episódico Sequencial
Estático / Dinâmico Estático Dinâmico
Discreto / Contínuo Discreto Contínuo
Agente Único / Multiagente Agente Único (Coop/Comp) Multiagente (Coop/Comp)
graph TD
    A[Características do Ambiente] --> O{Observabilidade};
    O --> O1[Totalmente Observável];
    O --> O2[Parcialmente Observável];

    A --> D{Determinismo};
    D --> D1[Determinístico];
    D --> D2[Estocástico];

    A --> E{Episódico vs Sequencial};
    E --> E1[Episódico];
    E --> E2[Sequencial];

    A --> S{Estático vs Dinâmico};
    S --> S1[Estático];
    S --> S2[Dinâmico];

    A --> C{Discreto vs Contínuo};
    C --> C1[Discreto];
    C --> C2[Contínuo];

    A --> M{Único Agente vs Multiagente};
    M --> M1[Único Agente];
    M --> M2[Multiagente];

    style A fill:#f9f,stroke:#333,stroke-width:2px;
    style O1 fill:#afa,stroke:#333,stroke-width:2px;
    style O2 fill:#f0e68c,stroke:#333,stroke-width:2px;
    style D1 fill:#afa,stroke:#333,stroke-width:2px;
    style D2 fill:#f0e68c,stroke:#333,stroke-width:2px;
    style E1 fill:#afa,stroke:#333,stroke-width:2px;
    style E2 fill:#f0e68c,stroke:#333,stroke-width:2px;
    style S1 fill:#afa,stroke:#333,stroke-width:2px;
    style S2 fill:#f0e68c,stroke:#333,stroke-width:2px;
    style C1 fill:#afa,stroke:#333,stroke-width:2px;
    style C2 fill:#f0e68c,stroke:#333,stroke-width:2px;
    style M1 fill:#afa,stroke:#333,stroke-width:2px;
    style M2 fill:#f0e68c,stroke:#333,stroke-width:2px;
Figura 1: Dimensões de Classificação de Ambientes de Agentes

Impacto na Tomada de Decisão do Agente

As características do ambiente determinam quais tipos de programa de agente são adequados (Russell; Norvig, 2004, p. 52–53):

  • Totalmente Observável vs. Parcialmente Observável: Em ambientes parcialmente observáveis, o agente precisa manter um estado interno para ter uma “memória” do mundo.
  • Determinístico vs. Estocástico: Agentes em ambientes estocásticos precisam considerar resultados prováveis e maximizar a utilidade esperada, em vez de simplesmente buscar um objetivo.
  • Episódico vs. Sequencial: Ambientes sequenciais exigem planejamento e consideração de futuros estados, o que leva a agentes baseados em metas ou utilidade. Agentes reativos simples são suficientes para ambientes episódicos.
  • Estático vs. Dinâmico: Em ambientes dinâmicos, o agente precisa ser capaz de agir rapidamente e, se necessário, replanejar suas ações em tempo real.
  • Discreto vs. Contínuo: Ambientes contínuos frequentemente necessitam de técnicas de aprendizado de máquina para percepção e controle, pois os estados e ações não podem ser discretizados facilmente.
  • Único Agente vs. Multiagente: Ambientes multiagentes introduzem complexidades como a necessidade de modelar outros agentes, coordenar ações ou estratégias de teoria dos jogos.

Tomada de Decisão Racional

Um agente é racional se ele escolhe a ação que é esperada para maximizar sua medida de desempenho, dadas as evidências fornecidas pelas percepções e seu conhecimento (Russell; Norvig, 2004, p. 36). A “coisa certa a fazer” depende da forma como o ambiente é caracterizado.

Racionalidade em Ambientes Determinísticos e Totalmente Observáveis

Nestes ambientes, o agente pode prever com certeza o resultado de cada ação. A tomada de decisão é um problema de busca: encontrar a sequência de ações que leva ao estado objetivo com o menor custo (para agentes baseados em metas) ou a maior utilidade (para agentes baseados em utilidade). Algoritmos de busca como BFS, DFS (com modificações), ou busca A* (que será abordada em aulas futuras) são ideais aqui.

Racionalidade em Ambientes Estocásticos e/ou Parcialmente Observáveis

Nestes ambientes, a certeza é impossível. O agente não pode ter certeza do resultado de uma ação ou do estado exato do mundo. A racionalidade aqui se traduz em maximizar a utilidade esperada.

  • Utilidade (Utility): Uma função que o agente utiliza para medir quão “bom” um estado é para ele. Pode ser um valor numérico que representa a preferência do agente por um determinado estado.
  • Utilidade Esperada (Expected Utility): Para uma ação a, a utilidade esperada é a soma da utilidade de cada possível estado resultante, ponderada pela probabilidade desse estado ocorrer após a ação a. \[EU(a) = \sum_{s'} P(RESULTADO(a) = s' | a) \cdot U(s')\] onde \(P(RESULTADO(a) = s' | a)\) é a probabilidade de chegar ao estado \(s'\) após a ação \(a\), e \(U(s')\) é a utilidade do estado \(s'\).

O agente racional deve escolher a ação que tem a maior utilidade esperada. Isso requer:

  1. Um modelo de incerteza (probabilidades de resultados).
  2. Uma função de utilidade (preferências sobre os resultados).

Exemplo: Um agente em um ambiente estocástico tem duas ações possíveis, A1 e A2.

  • Ação A1:
    • Resulta em Estado S_bom com probabilidade 0.8 (Utilidade = 10)
    • Resulta em Estado S_ruim com probabilidade 0.2 (Utilidade = 0)
    • \(EU(A1) = (0.8 \times 10) + (0.2 \times 0) = 8\)
  • Ação A2:
    • Resulta em Estado S_medio com probabilidade 0.5 (Utilidade = 7)
    • Resulta em Estado S_muito_ruim com probabilidade 0.5 (Utilidade = 1)
    • \(EU(A2) = (0.5 \times 7) + (0.5 \times 1) = 3.5 + 0.5 = 4\)

Neste caso, o agente racional escolheria a Ação A1 porque sua utilidade esperada (8) é maior que a da Ação A2 (4).

Exemplos em Python (Conceitual)

Vamos ilustrar um agente simplificado que toma decisões baseadas na utilidade esperada em um ambiente estocástico.

import random

class StochasticEnvironment:
    def __init__(self, outcomes):
        self.outcomes = outcomes # Dicionário de ações -> {resultado: probabilidade}

    def simulate_action(self, action):
        possible_outcomes = list(self.outcomes.get(action, {}).keys())
        probabilities = list(self.outcomes.get(action, {}).values())
        
        # Simula o resultado da ação com base nas probabilidades
        if possible_outcomes:
            return random.choices(possible_outcomes, weights=probabilities, k=1)
        return "nenhum_resultado"

class UtilityBasedDecisionAgent:
    def __init__(self, utility_function):
        self.utility_function = utility_function # Dicionário de estado -> utilidade

    def calculate_expected_utility(self, action_outcomes_prob):
        """
        Calcula a utilidade esperada para uma dada ação.
        action_outcomes_prob: {estado_resultante: probabilidade}
        """
        expected_utility = 0
        for state, probability in action_outcomes_prob.items():
            utility_of_state = self.utility_function.get(state, 0) # 0 se o estado não tem utilidade definida
            expected_utility += probability * utility_of_state
        return expected_utility

    def decide_action(self, possible_actions_with_probs):
        """
        Escolhe a ação com a maior utilidade esperada.
        possible_actions_with_probs: {action: {estado_resultante: probabilidade}}
        """
        best_action = None
        max_expected_utility = -float('inf') # Começa com valor negativo infinito

        print("\nAvaliação de Utilidade Esperada:")
        for action, outcomes_prob in possible_actions_with_probs.items():
            eu = self.calculate_expected_utility(outcomes_prob)
            print(f"  Ação '{action}': Utilidade Esperada = {eu}")
            if eu > max_expected_utility:
                max_expected_utility = eu
                best_action = action
        
        return best_action, max_expected_utility

if __name__ == "__main__":
    # 1. Definir a função de utilidade do agente (quão 'bom' é cada estado)
    my_utility_function = {
        "ganhar_premio": 100,
        "empatar": 10,
        "perder_tudo": -50,
        "concluir_tarefa": 20,
        "tempo_perdido": -5
    }

    # 2. Definir o ambiente (resultados prováveis das ações)
    # Exemplo: um jogo simples com duas ações
    game_actions_outcomes = {
        "apostar_alto": {
            "ganhar_premio": 0.3,
            "empatar": 0.2,
            "perder_tudo": 0.5
        },
        "apostar_baixo": {
            "ganhar_premio": 0.1,
            "empatar": 0.7,
            "perder_tudo": 0.2
        },
        "nao_apostar": {
            "tempo_perdido": 0.8,
            "concluir_tarefa": 0.2
        }
    }

    # 3. Criar o agente e tomar uma decisão
    agent = UtilityBasedDecisionAgent(my_utility_function)
    
    chosen_action, eu_value = agent.decide_action(game_actions_outcomes)
    print(f"\nAgente escolheu a ação: '{chosen_action}' com Utilidade Esperada de: {eu_value}")

    # Simular o ambiente com a ação escolhida (opcional)
    env = StochasticEnvironment(game_actions_outcomes)
    simulated_result = env.simulate_action(chosen_action)
    print(f"Resultado simulado da ação '{chosen_action}': {simulated_result} (Utilidade: {my_utility_function.get(simulated_result, 0)})")

Neste exemplo, o agente não apenas sabe o que é “bom” (utilidade), mas também considera a probabilidade de cada resultado ao escolher a melhor ação. Isso é crucial para a racionalidade em ambientes incertos.

Considerações Finais

A análise das características do ambiente é o primeiro passo crítico no projeto de qualquer agente inteligente. Ambientes mais complexos (parcialmente observáveis, estocásticos, dinâmicos, sequenciais, contínuos, multiagentes) exigem agentes mais sofisticados, com modelos internos, capacidades de planejamento, funções de utilidade e, frequentemente, mecanismos de aprendizado para se adaptar e otimizar seu desempenho ao longo do tempo. Compreender essas dimensões nos permite escolher as ferramentas e abordagens de IA mais apropriadas para o problema em questão.

Verificação de Aprendizagem

Responda às seguintes questões para solidificar seu entendimento sobre os ambientes de agentes e a tomada de decisão.

  1. Classificação de Ambientes:

    Para cada um dos cenários abaixo, classifique o ambiente de acordo com as 6 dimensões (Observabilidade, Determinismo, Episódico/Sequencial, Estático/Dinâmico, Discreto/Contínuo, Único Agente/Multiagente) e justifique brevemente cada classificação:

    1. Um agente que joga pôquer online contra outros jogadores humanos.
    2. Um agente que controla um termostato residencial para manter uma temperatura alvo.
    3. Um robô que monta carros em uma linha de produção totalmente automatizada.
  2. Impacto no Design do Agente:

    1. Por que um agente em um ambiente parcialmente observável geralmente precisa manter um “estado interno” ou “modelo do mundo”, enquanto um em um ambiente totalmente observável pode não precisar?
    2. Qual é a principal implicação para um agente se o ambiente for dinâmico em vez de estático?
  3. Tomada de Decisão Racional:

    1. Explique o conceito de utilidade esperada. Por que maximizar a utilidade esperada é a abordagem racional para a tomada de decisão em ambientes estocásticos?

    2. Considere um agente que precisa escolher entre duas ações:

      • Ação X: Leva ao Estado A (Utilidade 50) com 70% de chance, e ao Estado B (Utilidade 10) com 30% de chance.
      • Ação Y: Leva ao Estado C (Utilidade 60) com 40% de chance, e ao Estado D (Utilidade 0) com 60% de chance. Qual ação um agente racional deveria escolher? Mostre seus cálculos.
  4. Projeto de Agentes para Ambientes Específicos:

    Imagine que você está projetando um agente para gerenciar a iluminação de uma estufa agrícola.

    • O agente pode controlar a intensidade das luzes.
    • Sensores medem a luz natural, temperatura e umidade.
    • O objetivo é otimizar o crescimento das plantas, minimizando o consumo de energia.
    1. Descreva o ambiente usando o modelo PEAS.
    2. Classifique o ambiente usando as 6 dimensões.
    3. Que tipo de agente (dos 5 discutidos na aula anterior) seria mais adequado para esta tarefa e por quê? Que componentes internos (modelo do mundo, metas, função de utilidade, aprendizado) você consideraria essenciais para este agente?

Referências Bibliográficas

RUSSELL, Stuart J.; NORVIG, Peter. Inteligência Artificial: Um Enfoque Moderno. 2. ed. Rio de Janeiro: Prentice Hall, 2004.