Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Jacare SP
Setembro/2015
RA: 2504098261
RA: 2505000265
Felipe Bondio
RA: 2505000269
RA: 2524419934
RA: 2505000275
RA: 4423853085
10 srie
Professor: Eduardo
Jacare - SP
Setembro/2015
Sumrio
1. EVOLUO DA INTELIGNCIA ARTIFICIAL..................................................4
1.1Clssica (1956-1970)...................................................................................5
1.2 Romntica (1970-1980)...............................................................................5
1.3 Moderna (1980-1990).....................................................................................5
1.4 Clssica.......................................................................................................6
1.5 Romntica...................................................................................................7
1.6 Moderna......................................................................................................8
2.0 GRAFOS EM LINGUAGEM DE PROGRAMAO C....................................9
2.1 Registro.....................................................................................................10
2.2 Main...........................................................................................................11
2.3 Menu..........................................................................................................12
2.4 Insero das Arestas.................................................................................13
2.5 Impresso da lista de adjacentes..............................................................18
2.6 Busca em largura......................................................................................20
2.7 Busca em profundidade............................................................................23
2.8 Cdigo completo Grafo.............................................................................25
3. RESOLUO DE PROBLEMAS POR MEIO DE BUSCA.............................34
3.1 Agentes de resoluo de problemas.........................................................34
3.2 Busca.........................................................................................................34
3.3 Formulao de problemas.........................................................................35
3.4 Espao de estados....................................................................................36
3.5 Selecionando um espao de estados.......................................................36
3.6 Problemas do mundo real.........................................................................39
3.7 Busca de solues....................................................................................40
3.8 Descrio informal do algoritmo geral de busca em rvore.....................41
3.9 Estados vs. Ns........................................................................................42
4.0 Algoritmo geral de busca em rvore.........................................................43
4.1 Estratgias de busca.................................................................................43
1960 Pr - IA
Perodo do empreendimento;
Dada impossibilidade de uma definio formal precisa para IA, visto que
para tanto seria necessrio definir, primeiramente, a prpria inteligncia, foram
propostas algumas definies operacionais: uma mquina inteligente se ela capaz
de solucionar uma classe de problemas que requerem inteligncia para serem
solucionados por seres humanos; inteligncia Artificial a parte da cincia da
computao que compreende o projeto de sistemas computacionais que exibam
caractersticas associadas, quando presentes no comportamento humano,
inteligncia; ou ainda Inteligncia Artificial o estudo das faculdades mentais atravs
do uso de modelos computacionais. Outros se recusam a propor uma definio para o
termo e preferem estabelecer os objetivos da IA: tornar os computadores mais teis e
compreender os princpios que tornam a inteligncia possvel.
1.1Clssica (1956-1970)
problema,
mecanismos
de
ligao
procedural
visando
maior
eficincia
computacional.
Motivo do fracasso: subestimao da quantidade de conhecimento
necessria para tratar mesmo o mais banal problema de senso comum.
1.3 Moderna (1980-1990)
1.4 Clssica
Esta situao levou a dois tipos diferentes de soluo: (i) uso de mtodos
formais de inferncia mais fracos do que a lgica de primeira ordem que garantissem
certa eficincia aos programas, por exemplo, lgicas multivalores, e linguagens
terminolgicas. Desenvolveram-se mtodos heursticos e lgicas no convencionais
para permitir a representao de crenas, incoerncias e incompletudes, por exemplo,
lgica modal, lgica de excees e lgica nebulosa.
1.5 Romntica
1.6 Moderna
aprendizagem,
representao
de
conhecimento,
aquisio
de
Grafo no direcionado:
Registro;
Main;
Menu;
Insero das Arestas;
Impresso da lista de adjacncia;
Busca em largura;
Busca em profundidade;
Para o garfo direcionado, a nica coisa que mudar ser a insero das
arestas, voc utilizara somente o primeiro teste que demonstrado na funo.
2.1 Registro
O registro onde ficara as informaes sobre o que cada espao de
memria ter que armazenar. Em relao ao registro voc pode utilizar duas formas
simples, uma consiste em apenas um espao de memria de um ponteiro para uma
lista de encadeada, o outro armazenar no s um ponteiro mais tambm qual ponto
aquele. Daremos nfase somente a que possui dois campos, pois sua lista de
adjacncia ser do mesmo tipo que ela, logo no precisaremos criar outro registro.
Registro com dois campos. Um para guardar o ponto do grafo e outro um
ponteiro para uma lista de adjacncia, lista de adjacncia so todos os pontos para
qual aquele ponto est ligado:
typedef struct x{
int num;
struct x *prox;
}x;
Esse registro ser utilizado em ambas as buscas, vale lembrar que a busca
em profundidade trabalha com a ideia da pilha (LIFO) o primeiro que entra o ltimo
a sair, e a busca em largura trabalha coma ideia da fila (FIFO) o primeiro que entra
o primeiro que sai.
typedef struct sentinela{
struct pilha *inicio;
struct pilha *fim;
}sentinela;
int tam;
printf("Tamanho do vetor: ");
scanf("%d",&tam);
Alocao do Grafo
if(!grafo){
puts("ERRO\n");system("pause");exit(0);
Se o espao de memoria
Foi alocado
}
system("cls");
menu(grafo,tam);
2.3 Menu
A funo menu, consiste apenas em inicializar todos os campos do nosso
grafo e ler do usurio qual a opo desejada e a parti da chamar as funes
correspondente a escolha.
void menu(x *grafo, int tam){
int op,i;
for(i=0;i<tam;i++){
grafo[i].num=i;
grafo[i].prox=NULL;
}
system("cls");
do{
printf("\t 1 - Inserir Arestas\n");
printf("\t 2 - Imprimir\n");
printf("\t 3 - Busca em Profundidade\n");
printf("\t 4 - Busca em Largura\n");
printf("\t 5 - Sair\n\n");
printf("Opcao: ");
scanf("%d",&op);
Imprime as
Opes
switch(op){
case 1: grafo=insere_aresta(grafo,tam);break;
case 2: imprime(grafo,tam);break;
Chama a funo
case3: busca_em_prof(grafo,tam,grafo[0].num);break;
Correspondente
A escolha do usurio
case4: busca_largura(grafo,tam,grafo[0].num);break;
case 5:exit(0);break;
default: printf(erro);break;
}
system("pause");
system("cls");
}while(op!=5);
}
0
3
0
3
A lista de adjacncia do ponto 0 ser todos esses pontos que ele est ligado,
mas como no direcionado, esses pontos tambm vo apontar para o ponto 0
0
1
1
0
0
0
2
3
0
1
2
3
0
0
3
0
1
2
3
1
2
3
0
3
3
3
2
3
Caso contrrio, ele aloca dois espaos em memria, um para cada nmero,
lembrando novamente de que como no um grafo direcionado, ambos apontam
para ambos.
else{
novo=(x *)malloc(sizeof(x));
novo->prox=NULL;
novo->num=n2;
novo->prox=grafo[n1].prox;
grafo[n1].prox=novo;
out=(x *)malloc(sizeof(x));
out->prox=NULL;
out->num=n1;
out->prox=grafo[n2].prox;
grafo[n2].prox=out;
}
Funo completa:
x *insere_aresta(x *grafo, int tam){
int n1,n2,i;
x *novo, *out;
x *aux;
printf("Insira a aresta\n");
printf("1 Ponto: ");
scanf("%d",&n1);
printf("2 Ponto: ");
scanf("%d",&n2);
if(n1==n2){
novo=(x *)malloc(sizeof(x));
novo->num=n2;
novo->prox=NULL;
novo->prox=grafo[n1].prox;
grafo[n1].prox=novo;
}
else{
novo=(x *)malloc(sizeof(x));
novo->prox=NULL;
novo->num=n2;
novo->prox=grafo[n1].prox;
grafo[n1].prox=novo;
out=(x *)malloc(sizeof(x));
out->prox=NULL;
out->num=n1;
out->prox=grafo[n2].prox;
grafo[n2].prox=out;
}
printf("\n\tOK\n\n");
return grafo;
}
1
2
Posi
o atual
A funo ira imprimir o valor que est na varivel auxiliar, depois passar
para a prximo da lista de adjacncia, at que o prximo seja nulo, quando isso
ocorrer a funo passar para a prxima posio do grafo, se ele estava na
posio 0 vai para 1, se estava na 1 vai para a posio 2 assim sucessivamente,
at que tenha imprimido todas as posies do grafo.
for(i=0;i<tam;i++){
visitados[i]=0;
Inicializa o vetor de
visitados
sent=insere_fila(sent,inicio);
while(sent->fim!=NULL){
pos=sent->inicio->num;
sent=desenfila(sent);
if(visitados[pos]!=1){
visitados[pos]=1;
printf(" %d ",pos);
}
aux = grafo[pos].prox;
while(aux!=NULL){
if(visitados[aux->num]!=1){
Insere na
fila
y=aux->num;
sent=insere_fila(sent,y);
}
Insere na
fila
aux=aux->prox;
}
}
}
pilha *aux=p;
p=p->prox;
free(aux);
return p;
}
int visitados[tam];
pilha *p=NULL;
int i,pos,y;
x *aux;
for(i=0;i<tam;i++){
visitados[i]=0;
Inicializa o vetor de
visitados
p=empilha(p,inicio);
while(p!=NULL){
pos=p->num;
p=desempilha(p);
if(visitados[pos]!=1){
visitados[pos]=1;
printf(" %d ",pos);
}
Insere na
fila
aux = grafo[pos].prox;
while(aux!=NULL){
if(visitados[aux->num]!=1){
y=aux->num;
p=empilha(p,y);
}
Insere na
pilha
aux=aux->prox;
}
}
}
/************************************************************/
void menu(x *grafo, int tam);
x *insere_aresta(x *grafo, int tam);
void imprime(x *grafo, int tam);
void busca_em_prof(x *grafo, int tam, int inicio);
pilha *desempilha(pilha *p);
pilha *empilha(pilha *p, int num);
sentinela *insere_fila(sentinela *filas, int num);
sentinela *desenfila(sentinela *filas);
void busca_largura(x *grafo, int tam, int inicio);
/************************************************************/
int main(){
x *grafo=NULL;
int tam;
if(!grafo){
puts("ERRO\n");system("pause");exit(0);
}
system("cls");
menu(grafo,tam);
}
/************************************************************/
void menu(x *grafo, int tam){
int op,i;
for(i=0;i<tam;i++){
grafo[i].num=i;
grafo[i].prox=NULL;
}
system("cls");
do{
printf("\t 1 - Inserir Arestas\n");
printf("\t 2 - Imprimir\n");
printf("\t 3 - Busca em Profundidade\n");
printf("\t 4 - Busca em Largura\n");
printf("\t 5 - Sair\n\n");
printf("Opcao: ");
scanf("%d",&op);
switch(op){
case 1: grafo=insere_aresta(grafo,tam);break;
case 2: imprime(grafo,tam);break;
case 3: busca_em_prof(grafo,tam,grafo[0].num);break;
case 4: busca_largura(grafo,tam,grafo[0].num);break;
case 5:exit(0);break;
default: printf(erro);break;
}
system("pause");
system("cls");
}while(op!=5);
}
/************************************************************/
int n1,n2,i;
x *novo, *out;
x *aux;
printf("Insira a aresta\n");
printf("1 Ponto: ");
scanf("%d",&n1);
printf("2 Ponto: ");
scanf("%d",&n2);
if(n1==n2){
novo=(x *)malloc(sizeof(x));
novo->num=n2;
novo->prox=NULL;
novo->prox=grafo[n1].prox;
grafo[n1].prox=novo;
}
else{
novo=(x *)malloc(sizeof(x));
novo->prox=NULL;
novo->num=n2;
novo->prox=grafo[n1].prox;
grafo[n1].prox=novo;
out=(x *)malloc(sizeof(x));
out->prox=NULL;
out->num=n1;
out->prox=grafo[n2].prox;
grafo[n2].prox=out;
}
printf("\n\tOK\n\n");
return grafo;
}
/************************************************************/
void imprime(x *grafo, int tam){
x *aux;
int i;
for(i=0;i<tam;i++){
printf("Lista do Numero: %d :",grafo[i].num);
if(grafo[i].prox==NULL)
continue;
aux=grafo[i].prox;
while(aux!=NULL){
printf(" ->%d",aux->num);
aux=aux->prox;
}
puts("\n\n");
}
}
/************************************************************/
pilha *empilha(pilha *p, int num){
pilha *aux=(pilha *)malloc(sizeof(pilha));
aux->num=num;
if(p!=NULL)
aux->prox=p;
else
aux->prox=NULL;
return aux;
}
/************************************************************/
pilha *desempilha(pilha *p){
pilha *aux=p;
p=p->prox;
free(aux);
return p;
}
/************************************************************/
void
int visitados[tam];
pilha *p=NULL;
int i,pos,y;
x *aux;
for(i=0;i<tam;i++){
visitados[i]=0;
}
p=empilha(p,inicio);
while(p!=NULL){
pos=p->num;
p=desempilha(p);
if(visitados[pos]!=1){
visitados[pos]=1;
printf(" %d ",pos);
}
aux = grafo[pos].prox;
while(aux!=NULL){
if(visitados[aux->num]!=1){
y=aux->num;
p=empilha(p,y);
}
aux=aux->prox;
}
}
}
/************************************************************/
sentinela *insere_fila(sentinela *sent, int num){
pilha *aux=(pilha *)malloc(sizeof(pilha));
aux->num=num;
aux->prox=NULL;
if(sent->fim==NULL){
sent->inicio=aux;
sent->fim=aux;
}else{
sent->fim->prox=aux;
sent->fim=aux;
}
return sent;
}
/************************************************************/
sentinela *desenfila(sentinela *fila){
pilha *aux;
if(fila->inicio == fila->fim){
free(fila->inicio);
fila->inicio=NULL;
fila->fim=NULL;
} else{
aux=fila->inicio;
fila->inicio=fila->inicio->prox;
free(aux);
}
return fila;
}
/************************************************************/
void busca_largura(x *grafo, int tam, int inicio){
int visitados[tam];
sentinela *sent=(sentinela *)malloc(sizeof(sentinela));
sent->inicio=NULL;
sent->fim=NULL;
int i,pos,y;
x *aux;
for(i=0;i<tam;i++){
visitados[i]=0;
}
sent=insere_fila(sent,inicio);
while(sent->fim!=NULL){
pos=sent->inicio->num;
sent=desenfila(sent);
if(visitados[pos]!=1){
visitados[pos]=1;
printf(" %d ",pos);
}
aux = grafo[pos].prox;
while(aux!=NULL){
if(visitados[aux->num]!=1){
y=aux->num;
sent=insere_fila(sent,y);
}
aux=aux->prox;
}
}
}
3.2 Busca
Um agente com vrias opes imediatas pode decidir o que fazer comparando
diferentes sequncias de aes possveis.
Esse processo de procurar pela melhor sequncia chamado de busca.
Exemplo: Romnia
Formular objetivo:
Estar em Bucareste
Formular problema:
estados: cidades
aes: dirigir entre as cidades
Encontrar soluo:
sequncia de cidades, ex., Arad, Sibiu, Fagaras, Bucareste.
2.
ao
3.
4.
ex.,
soma
das
distncias,
nmero
de
aes
executadas, etc.
caminho.
Agente
de
soluo
de
Problemas
sucessora.
O espao de estados pode ser interpretado como um grafo em que os
ns so estados e os arcos so aes.
3.5 Selecionando um espao de estados
O mundo real absurdamente complexo
O espao de estados uma abstrao
vazio
Estado inicial: Qualquer um
Funo sucessor: gera os estados vlidos que resultam da tentativa de
executar as quatro aes (mover espao vazio para esquerda, direita,
acima ou abaixo)
Teste de objetivo: Verifica se o estado corresponde configurao
objetivo.
Custo do caminho: Cada passo custa 1, e assim o custo do caminho
o nmero de passos do caminho
Problema de roteamento
Encontrar a melhor rota de um ponto a outro (aplicaes: redes
de computadores, planejamento militar, planejamento de viagens
areas)
Problemas de tour
Visitar cada ponto pelo menos uma vez
Caixeiro viajante
Layout de VLSI
Posicionamento de componentes e conexes em um chip
Projeto de protenas
Encontrar uma sequncia de aminocidos que sero
incorporados em uma protena tridimensional para curar alguma
doena.
Pesquisas na Web
fcil pensar na Web como um grafo de ns conectados por links
estados.
Busca: seguir um caminho, deixando os outros para depois.
A estratgia de busca determina qual caminho seguir.
de ns
Estratgias so avaliadas de acordo com os seguintes critrios:
completeza: o algoritmo sempre encontra a soluo se ela existe?
complexidade de tempo: nmero de ns gerados
complexidade de espao: nmero mximo de ns na memria
otimizao: a estratgia encontra a soluo tima?