diff --git a/report/figures/arquitetura-deliberativa.png b/report/figures/arquitetura-deliberativa.png new file mode 100644 index 0000000..cda8878 Binary files /dev/null and b/report/figures/arquitetura-deliberativa.png differ diff --git a/report/out/main.pdf b/report/out/main.pdf index 0af8d51..de292f8 100644 Binary files a/report/out/main.pdf and b/report/out/main.pdf differ diff --git a/report/src/bibliography.bib b/report/src/bibliography.bib index 1132923..ac631b7 100644 --- a/report/src/bibliography.bib +++ b/report/src/bibliography.bib @@ -130,3 +130,10 @@ @misc{ist:leic:resumos:procura-informada url = "{https://resumos.leic.pt/ia/procura-informada/}", note = "[Online; acedido em Maio 12, 2024]", } + +@misc{isel:iasa:slides:arq-agentes-deliberativos, + author = "{Luis Morgado}", + title = "{Arquitetura de Agentes Deliberativos}", + year = {2024}, + note = "[Online; acedido em Junho 11, 2024]", +} diff --git a/report/src/chapters/01_introduction.tex b/report/src/chapters/01_introduction.tex index 4ad7a7f..75e4913 100644 --- a/report/src/chapters/01_introduction.tex +++ b/report/src/chapters/01_introduction.tex @@ -3,12 +3,18 @@ \chapter{Introdução}\label{ch:introducao} Este relatório documenta o projeto desenvolvido no âmbito da unidade curricular de Inteligência Artificial para Sistemas Autónomos (IASA), da Licenciatura em Engenharia Informática e de Computadores (LEIC). O projeto tem como objetivo a aprendizagem de conceitos de inteligência artificial e a sua aplicação no desenvolvimento de sistemas autónomos. -O capítulo~\ref{ch:enquadramento-teorico} descreve esses conceitos que servem de base aos restantes temas estudados e ao projeto realizado. -O projeto está dividido em duas partes: +\section{Organização do Documento}\label{sec:organizacao-documento} + +O presente documento está organizado da seguinte forma: \begin{itemize} - \item \textbf{Parte 1}: Desenvolvimento de uma biblioteca em \textit{java} que fornece os mecanismos base para a implementação dos subsistemas que representam os conceitos gerais de inteligência artificial (e.g., agente, ambiente) e outros conceitos relacionados (e.g., máquina de estados); Desenvolvimento de um jogo em Java que integra essa biblioteca (ver capítulo~\ref{ch:projeto-parte1}); - \item \textbf{Parte 2}: Desenvolvimento de um agente reativo em \textit{python} com módulos comportamentais para recolher alvos e evitar obstáculos num ambiente com dimensões fixas (ver capítulo~\ref{ch:projeto-parte2}). + \item \textbf{Enquadramento Teórico}: Descrição dos conceitos de inteligência artificial e de sistemas autónomos, que servem de base ao projeto realizado; + \item \textbf{Projeto}: Descrição do projeto desenvolvido, dividido em quatro partes, cada uma com um objetivo específico: + \begin{itemize} + \item \textbf{Parte 1}: Desenvolvimento de uma biblioteca em \textit{java} que fornece os mecanismos base para a implementação dos subsistemas que representam os conceitos gerais de inteligência artificial (e.g., agente, ambiente) e outros conceitos relacionados (e.g., máquina de estados); Desenvolvimento de um jogo que integra essa biblioteca (ver capítulo~\ref{ch:projeto-parte1}); + \item \textbf{Parte 2}: Desenvolvimento de um agente reativo em \textit{python} com módulos comportamentais para recolher alvos e evitar obstáculos num ambiente com dimensões fixas (ver capítulo~\ref{ch:projeto-parte2}). + \item \textbf{Parte 3}: Desenvolvimento de uma biblioteca para procuras em espaços de estados (PEE) em \textit{python} que envolveu a implementação de diferentes estratégias de procura; Desenvolvimento de uma biblioteca para modelação de problemas de procura em \textit{python} que permite a definição de problemas concretos de forma independente da estratégia de procura a aplicar; Modelação de um problema concreto de procura (ver capítulo~\ref{ch:projeto-parte3}). + \end{itemize} \end{itemize} Cada parte do projeto está organizada de forma a descrever o objetivo principal no contexto geral do projeto; fazer uma síntese dos conceitos estudados que se acharam relevantes para a sua implementação; caracterização do ambiente onde o agente vai atuar; descrever a implementação realizada, nomeadamente, a arquitetura do agente usada; justificar as principais decisões tomadas e a sua relação com os conceitos estudados; e apresentar a estrutura do código desenvolvido. diff --git a/report/src/chapters/03_project-part1.tex b/report/src/chapters/03_project-part1.tex index d9fe44c..f09b12d 100644 --- a/report/src/chapters/03_project-part1.tex +++ b/report/src/chapters/03_project-part1.tex @@ -1,12 +1,12 @@ \chapter{Projeto - Parte 1} \label{ch:projeto-parte1} -Esta parte do projeto incidiu principalmente sobre desenvolvimento de uma biblioteca, em \textit{java}, para providenciar abstrações dos subsistemas que representam conceito gerais de inteligência artificial (e.g., agente, ambiente) (ver figura~\ref{fig:modelo-agente-ambiente}) e outros conceitos relacionados (e.g., máquina de estados, conceito de transição de estado). +Esta parte do projeto incidiu, principalmente, sobre desenvolvimento de uma biblioteca para providenciar abstrações dos subsistemas que representam conceito gerais de inteligência artificial (e.g., agente, ambiente) (ver figura~\ref{fig:modelo-agente-ambiente}) e outros conceitos relacionados (e.g., máquina de estados, conceito de transição de estado). Para tal, foi necessário definir uma arquitetura de software que permitisse a implementação dos diferentes subsistemas de forma independente e modular, seguindo as diretrizes (i.e., métricas, princípios e padrões) que garantem a qualidade da arquitetura desenvolvida. A implementação da biblioteca foi feita com base na consulta e compressão de diagramas UML e de sequência de forma a garantir a correta implementação dos diferentes subsistemas. -Por fim foi desenvolvido um jogo (ver secção~\ref{sec:desenvolvimento-do-jogo}) que integra a biblioteca desenvolvida, permitindo a interação com o jogador por meio de comandos em texto. +Por fim, foi desenvolvido um jogo que integra a biblioteca, permitindo a interação com o jogador por meio de comandos em texto. \section{Arquitetura de software}\label{sec:arquitetura-de-software} diff --git a/report/src/chapters/04_project-part2.tex b/report/src/chapters/04_project-part2.tex index f7a4aab..226f076 100644 --- a/report/src/chapters/04_project-part2.tex +++ b/report/src/chapters/04_project-part2.tex @@ -1,6 +1,6 @@ \chapter{Projeto - Parte 2}\label{ch:projeto-parte2} -Nesta fase do projeto, o objetivo foi criar, em \textit{python}, um sistema inteligente capaz de se movimentar num espaço com dimensões fixas onde existem obstáculos. +Nesta fase do projeto, o objetivo foi criar um sistema inteligente capaz de se movimentar num espaço com dimensões fixas onde existem obstáculos. A finalidade do agente prospetor é recolher os alvos e evitar os obstáculos presentes no ambiente (ver figura~\ref{fig:agente-prospetor}). O agente pode ser considerado homólogo a um robô móvel autónomo (e.g., um robô que aspira sozinho a casa), que se pode mover nos quatro sentidos cardeais (i.e., norte, sul, este e oeste). @@ -12,7 +12,10 @@ \chapter{Projeto - Parte 2}\label{ch:projeto-parte2} Retirado de~\cite{isel:iasa:slides:arq-agentes-reativos-parte-2}, slide 13.}\label{fig:agente-prospetor} \end{figure} -Para que o agente possa atingir os objetivos propostos, foi necessário implementar (ver secção~\ref{sec:implementacao-agente-reativo}) um agente reativo e os módulos comportamentais associados, que definem os objetivos de forma implícita. +Para que o agente possa atingir os objetivos propostos, foi necessário implementar um agente reativo e os seus módulos comportamentais associados. +O agente reativo foi implementado com base na biblioteca ECR (Esquemas Comportamentais Reativos) criada para esta fase do projeto, que expõe os mecanismos base de comportamento (e.g., reação, estímulo, resposta). +A interação com o ambiente foi realizada através da biblioteca SAE (Simulador de Ambiente de Execução), +que foi disponibilizada para esta fase do projeto. Tal como em fases anteriores, a implementação foi feita com base na consulta e compressão de diagramas UML e de sequência de forma a garantir a correta implementação dos diferentes subsistemas. @@ -174,7 +177,6 @@ \section{Biblioteca SAE}\label{sec:biblioteca-sae} 3.}\label{fig:sae-interface-grafica} \end{figure} - \section{Caracterização do Ambiente}\label{sec:caracterizacao-ambiente} O ambiente onde o agente reativo se movimenta é virtual, bidimensional, com dimensões fixas e composto por alvos e obstáculos estáticos. Pode ser caracterizado (ver secção~\ref{sec:ambiente}) por ser: diff --git a/report/src/chapters/05_project-part3.tex b/report/src/chapters/05_project-part3.tex index edbaa0e..cff819b 100644 --- a/report/src/chapters/05_project-part3.tex +++ b/report/src/chapters/05_project-part3.tex @@ -1,6 +1,11 @@ \chapter{Projeto - Parte 3}\label{ch:projeto-parte3} -TODO: Nesta fase do projeto, o objetivo foi criar, em \textit{python} +Nesta fase do projeto, foram abordadas as temáticas de raciocínio automático e implementados mecanismos de procura em espaços de estados, que servem como base para a implementação de um futuro agente deliberativo. +Foi também realizada uma biblioteca para modelação de problemas, servindo como argumento para que a aplicação de um determinado mecanismo de procura não fosse dependente da especificidade do problema. + +No final desta fase, foi modelado um problema de procura concreto, de forma a aplicar as diferentes estratégias de procura implementadas e avaliar o seu desempenho. + +Tal como em fases anteriores, a implementação foi feita com base na consulta e compressão de diagramas UML e de sequência de forma a garantir a correta implementação dos diferentes subsistemas. \section{Raciocínio Automático}\label{sec:raciocinio-automatico} @@ -17,7 +22,7 @@ \section{Raciocínio Automático}\label{sec:raciocinio-automatico} De forma a resolver um determinado problema, através do raciocínio automático, é necessário representar o conhecimento do seu domínio através de representações simbólicas internas ao sistema - modelo do problema - com a informação necessária para a resolução do mesmo. Estas representações servem de base à simulação para exploração e avaliação de opções possíveis, e são obtidas através de processos de codificação (i.e., da informação concreta do problema em estruturas simbólicas internas) e de descodificação (i.e., processo inverso). -A imagem~\ref{fig:representacao-problema} ilustra um exemplo de codificação e descodificação de um problema. +Um exemplo de codificação e descodificação de um problema é ilustrado na figura~\ref{fig:representacao-problema}. \begin{figure}[H] \begin{center} @@ -31,7 +36,8 @@ \section{Raciocínio Automático}\label{sec:raciocinio-automatico} \subsection{Modelação de um Problema}\label{subsec:modelacao-problema} O modelo de um problema é uma representação simbólica interna ao sistema, que contém a informação necessária para a resolução do problema. -O mecanismo de raciocínio automático é responsável por manipular esta representação, de forma a inferir conclusões e a resolver o problema. Esta representação tem como base os seguintes conceitos: +O mecanismo de raciocínio automático é responsável por manipular esta representação, de forma a inferir conclusões e a resolver o problema. +Esta representação tem como base os seguintes conceitos: \begin{itemize} \item \textbf{Estado}: Representação única e simbólica de um conjunto de informações concretas que caracterizam um estado da modelação de um problema. No âmbito do raciocínio automático, os estados abstraem os aspetos (configurações) estruturais que caracterizam o problema. Ao conjunto de estados possíveis de um problema e às transições entre eles, dá-se o nome de espaço de estados; @@ -40,7 +46,7 @@ \subsection{Modelação de um Problema}\label{subsec:modelacao-problema} Associado a um operador estão duas funções: uma que gera o estado sucessor a partir de um dado estado e outra que define o custo associado a essa transição, e que pode depender ou não do estado atual e do estado sucessor; \item \textbf{Transição}: Em contraste com o operador, a transição é a ação efetiva da passagem de um estado para outro (geram o estado sucessor), que ocorre quando um operador é aplicado sobre as representações internas dos estados. \item \textbf{Problema}: Dá suporte ao raciocínio automático, modelando um problema ao qual está inerente uma finalidade; - Associado a um problema está o estado inicial, um conjunto de operadores e uma função predicado~\cite{stanford:fp:function-predicates} que verifica se um estado recebido é um estado objetivo ou objetivos explicítos. + Associado a um problema está o estado inicial, um conjunto de operadores e uma função predicado~\cite{stanford:fp:function-predicates} que verifica se um estado recebido é um estado objetivo (i.e., que satisfaz a finalidade do problema). O problema considera-se resolvido quando um estado objetivo é atingido. \end{itemize} @@ -172,7 +178,7 @@ \subsubsection{Procura em Profundidade}\label{subsubsec:procura-profundidade} De notar que, a ordem de geração dos nós sucessores depende da ordem dos operadores aplicados~\cite{isel:iasa:slides:proc-espaco-estados-parte-1} e que a complexidade espacial deste algoritmo é de $O(bm)$ se for implementado de forma recursiva, e de $O(m)$ se for implementado de forma iterativa. -\paragraph{Procura em Profundidade Limitada}\label{par:procura-profundidade-limitada} +\subsubsection{Procura em Profundidade Limitada}\label{subsubsec:procura-profundidade-limitada} A procura em profundidade limitada, é uma variação da procura em profundidade, onde é definido um limite de profundidade, $l$, para a exploração da árvore de procura. Com esta procura introduz-se um novo possível estado, o estado de fracasso, ou seja, se a profundidade máxima for atingida e não existir um nó objetivo, a procura termina sem solução. @@ -189,7 +195,7 @@ \subsubsection{Procura em Profundidade}\label{subsubsec:procura-profundidade} \label{fig:alg-proc-prof-limitada} \end{figure} -\paragraph{Procura em Profundidade Iterativa}\label{par:procura-profundidade-iterativa} +\subsubsection{Procura em Profundidade Iterativa}\label{subsubsec:procura-profundidade-iterativa} A procura em profundidade iterativa, é uma variação da procura em profundidade limitada, onde é realizada uma procura em profundidade com um limite de profundidade, $l$. Caso não seja encontrada uma solução, é realizada uma nova procura em profundidade com um limite de profundidade superior ao que foi utilizado anteriormente, e assim sucessivamente até que a solução seja encontrada. @@ -291,7 +297,8 @@ \subsubsection{Procura Sôfrega}\label{subsubsec:procura-sofrega} A procura sôfrega, também conhecida por procura gananciosa (\textit{Greedy Search}), é um mecanismo de procura por melhor primeiro, caracterizado por expandir o nó que tem o menor valor de uma função de avaliação, $f(n)$. O avaliador, associado a esta procura e que determina a prioridade do nó, é exclusivamente a função heurística, $h(n)$, que representa a estimativa do custo do melhor caminho desde o nó $n$ até ao nó objetivo. -Esta estratégia tenta minimizar a estimativa de custo para atingir o objetivo não tendo em conta o percurso já explorado (só olha para a frente). Desta forma produz soluções subótimas, porque a função de heurística pode não ser admissível, ou seja, $h(n)$ pode ser maior que o custo real, $h^*(n)$. +Esta estratégia tenta minimizar a estimativa de custo para atingir o objetivo não tendo em conta o percurso já explorado (só olha para a frente). +Desta forma produz soluções subótimas, porque a função de heurística pode não ser admissível, ou seja, $h(n)$ pode ser maior que o custo real, $h^*(n)$. \subsubsection{Procura A*}\label{subsubsec:procura-a-estrela} @@ -332,13 +339,60 @@ \subsubsection{Procura A*}\label{subsubsec:procura-a-estrela} \label{fig:comp-metodos-proc} \end{figure} -\section{Problema de Contagem} -TODO: falar sobre como foi feita a moduleção do problema de contagem (src/contagem/) +\section{Aplicação das Estratégias de Procura}\label{sec:aplicacao-estrategias-procura} + +De forma a aplicar as estratégias de procura mencionadas a algo concreto, foi modelado um problema de contagem usando os componentes descritos na secção~\ref{subsec:modelacao-problema}. + +O problema de contagem é caracterizado por um valor inicial, um valor final e um conjunto de incrementos possíveis, +onde o objetivo é atingir ou superar o valor final a partir do valor inicial, através destes. +Por exemplo, se: o valor inicial for 0, o valor final for 9 e os incrementos possíveis forem [1, 2], então a solução ótima deverá ser, por exemplo, os estados: [0, 2, 4, 6, 8], com os incrementos [2, 2, 2, 2, 1]. + +Para as procuras informadas, foi necessário definir uma heurística admissível que refletisse a distância entre valores, para o sistema +poder optar por transições de estado que minimizam a distância ao estado objetivo. + +Com o problema modelado foram aplicadas as estratégias de procura estudadas e analisados os resultados obtidos, +nomeadamente a solução encontrada, o custo e a dimensão associada, bem como o número de nós processados e o número máximo de nós mantidos em memória (i.e., de forma a inferir a complexidade espacial). +Os resultados obtidos estão representados na tabela~\ref{tab:resultados-procura-contagem}. + +\begin{table}[htbp] + \centering + \caption{Resultados da aplicação das estratégias de procura ao problema de contagem.} + \label{tab:resultados-procura-contagem} + \vspace{0.2cm} + \begin{tabular}{|c|c|c|c|c|} + \hline + \textbf{Mecanismo de Procura} & \textbf{Solução} & \textbf{Custo} & \multicolumn{2}{c|}{\textbf{Máximo de Nós}} \\ \cline{4-5} + & & & \textbf{processados} & \textbf{memória} \\ + + \hline + ProcuraProfundidade & [0, 2, 4, 6, 8] & 20.0 & 6 & 6 \\ + \hline + ProcuraProfLim & [0, 2, 4, 6, 8] & 20.0 & 6 & 6 \\ + \hline + ProcuraProfIter & [0, 2, 4, 6, 8] & 20.0 & 6 & 6 \\ + \hline + ProcuraLargura & [0, 1, 3, 5, 7] & 17.0 & 10 & 2 \\ + \hline + ProcuraCustoUnif & [0, 1, 2, 3, 4, 5, 6, 7, 8] & 9.0 & 16 & 5 \\ + \hline + ProcuraSofrega & [0, 2, 4, 6, 8] & 17.0 & 6 & 6 \\ + \hline + ProcuraAA & [0, 1, 2, 3, 4, 5, 6, 7, 8] & 9.0 & 10 & 10 \\ + \hline + \end{tabular} +\end{table} + + +Através dos resultados obtidos, é possível concluir que a procura de custo uniforme e a procura A* são as estratégias que encontram a solução ótima, sendo que a procura A* apresenta o maior balanceamento entre a complexidade temporal e espacial. +As outras estratégias encontram soluções subótimas, no entanto, a procura em largura apresenta uma das soluções com menor dimensão e com menor número de nós mantidos em memória. +É também possível observar que a procura sôfrega sacrifica o custo da solução em prol da complexidade temporal (apresenta uma das soluções com o menor número de nós processados), sugerindo uma abordagem gulosa, como era expectável. + +De forma a testar o possível aparecimento de ciclos nas estratégias de procura que não são em grafo, foi adicionado um terceiro operador à modelação do problema de contagem - o operador (-1). +Com a adição deste operador, verificou-se que, nas estratégias de procura em profundidade, a procura é infinita, visto que existe a formação de ciclos (e.g., [-1, 1, 2, -1, 1, 2, -1, \ldots]). -\subsection{Escolha da Estratégia de Procura} +Este exercício permitiu perceber que a escolha da estratégia de procura ideal dependerá de uma análise cuidada dos fatores associados ao problema em questão, de forma a garantir a resolução eficiente e eficaz do mesmo. -TODO: falar sobre a escolha da estratégia de procura e a implementação respetiva falar sobre os resultados da aplicação de cada estratégia de procura (para o problema de contagem) (src/contagem/) \section{Estrutura do Projeto}\label{sec:estrutura-do-projeto-3} @@ -347,7 +401,7 @@ \section{Estrutura do Projeto}\label{sec:estrutura-do-projeto-3} \begin{itemize} \item \textit{agente/contagem}: Integra a modulação que foi feita para um determinado problema de contagem, bem como o ficheiro onde lhe são aplicadas as estratégias de procura estudadas; \item \textit{lib/mod}: Contém classes que ajudam a modular um problema de forma abstrata (i.e., conceito de operador, estado) - \item \textit{lib/pee}: Contém sub-módulos que permitem modular as diferentes estratégias de procura em espaço de estados estudadas: + \item \textit{lib/pee}: Contém sub-módulos que permitem modular as diferentes estratégias de procura em espaço de estados (pee) estudadas: \begin{itemize} \item \textit{largura}: Contém classes que representam a estratégia de procura em largura e os seus componentes (e.g., fronteira-fifo); \item \textit{profundidade}: Contém classes que representam a estratégia de procura em profundidade, os seus componentes (e.g., fronteira-lifo) e variantes (e.g., profundidade-limitada, profundidade-iterativa); diff --git a/report/src/chapters/06_project-part4.tex b/report/src/chapters/06_project-part4.tex index cdf6aa7..959b81d 100644 --- a/report/src/chapters/06_project-part4.tex +++ b/report/src/chapters/06_project-part4.tex @@ -1,3 +1,34 @@ \chapter{Projeto - Parte 4}\label{ch:projeto-parte4} -\lipsum[1-2] + +\section{Arquitetura Deliberativa}\label{sec:arquitetura-deliberativa} + +Conforme foi abordado na secção~\ref{sec:arquiteturas-reativa-memoria}, um agente reativo com memória age com conhecimento do presente, através de reações a estímulos, e com conhecimento do passado, através da memorização de percepções e de ações passadas. +Já um agente com uma arquitetura deliberativa, para além de ter o conhecimento que um agente reativo apresenta, tem a capacidade de antecipar o futuro, através da simulação de cenários, e de tomar decisões com base nessa antecipação. + +Na arquitetura deliberativa, o agente é composto por três componentes~\cite{isel:iasa:slides:arq-agentes-deliberativos}: + +Na arquitectura deliberativa, a memória é o componente que desempenha um papel central na geração do comportamento do agente. +É através da memória que o agente tem a capacidade de representar o mundo e os mecanismos de deliberação~\cite{isel:iasa:slides:arq-agentes-deliberativos}. +, conforme representado na figura~\ref{fig:arquitetura-deliberativa}. + +\begin{figure}[H] + \begin{center} + \resizebox{100mm}{!}{\includegraphics{../figures/arquitetura-deliberativa}} + \end{center} + \caption{Arquitetura deliberativa. + Retirado de~\cite{isel:iasa:slides:arq-agentes-deliberativos}, slide 16.} + \label{fig:arquitetura-deliberativa} +\end{figure} + +É baseada em representações de conhecimento do domínio do problema, as quais +suportam a exploração de opções por simulação interna, para atingir objectivos +explicitamente representados, fixos ou gerados dinamicamente, tendo por base +processos de deliberação sobre que objectivos concretizar e quais os meios a utilizar + +Numa arquitectura deliberativa o comportamento é gerado com base +em processos de planeamento suportados por representações internas +do ambiente (modelo do mundo) + + +\section{Implementação do Agente Deliberativo}\label{sec:implementacao-agente-deliberativo} diff --git a/report/src/preamble.tex b/report/src/preamble.tex index 46ecb48..7572e6b 100644 --- a/report/src/preamble.tex +++ b/report/src/preamble.tex @@ -3,6 +3,7 @@ \usepackage[utf8]{inputenc} % see https://tex.stackexchange.com/questions/44694/fontenc-vs-inputenc \usepackage[portuguese]{babel} +\usepackage{multirow} \addto{\captionsportuguese}{\renewcommand{\bibname}{Referências}} \addto{\captionsportuguese}{\renewcommand{\contentsname}{Índice}} \addto{\captionsportuguese}{\renewcommand{\appendixname}{Apêndice}}