Heurística

6 respostas
TedLoprao

E aí galera!!!
Percebi que o pessoal ta falando direto em heurística, alguém teria alguns exemplos de implementação e alguma documentação sobre isso.

To fazendo um trabalho e tava precisando disso…

Valew pessoal

6 Respostas

danieldestro

Procure sobre Heurística no campo da Inteligência Artificial.

S

definitivamente vc nao ajudou hahaha :lol:
alguem tem? gostaria de estudar os algoritimos…

smota

definitivamente vc nao ajudou hahaha :lol:
alguem tem? gostaria de estudar os algoritimos…

ehehe ele não ajudou porque é meio dificil ajudar com isso :?

Heurística não é um algoritmo ou um conceito … é um nome para a função usada para nortear decisões de algoritmos em Inteligencia Articial, esses sim tem nomes (A*, Vizinho mais proximo, etc.) …

A função heuristica pode ser a distancia entre dois pontos, quantidade de peças fora do lugar, etc. etc. etc., depende do problema (embora o povo esteja viajando em heurísticas sem domínio).

[]s

TedLoprao

Certo, mas eu quero qualquer tipo de exemplo e documentação, visto que será para fins de um trabalho acadêmico… Já achei várias informações na web, pensei que talvez alguém poderia me ajudar com algo já tenha usado para esse fim…

S

pow, intaum coloca algoritimos desses A* e esse tal de Vizinho mais proximo :smiley:

smota

Bem ... se vc quer ver mesmo ...

Uma boa pagina introdutoria sobre IA [url]http://www.fei.br/eletrica/rbianchi/ia/ia-fapema.html[/url]

Desculpa ai pessoal, vou postar um codigo em C :shock:

Esse eh um programinha bem didatico de IA, um robo tem que sair de um ponto da sala e chegar ao outro desviando de obstaculos.
Usei o A* e o principal dele esta na função main() no bloco da linha for (k=0; k<MAX_SUCESSORES; k++) {
Ele nao vai ser muito util se vc nao souber o conceito de IA (por exemplo pq ele lista os sucessores).
A heuristica neste caso esta implementada na função calculaH() que simplesmente mede a hipotenusa entre os dois pontos, ignorando os obstaculos.
O custo real do movimento eh a função calculaG() mas vc descobre o que ela faz :P

la vai:

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;conio.h&gt;
#include &lt;math.h&gt;

#define ALTURA 5
#define LARGURA 5
#define MAX_SUCESSORES 8
#define VISUAL 1

typedef struct &#123;char posicao&#91;ALTURA&#93;&#91;LARGURA&#93;;
&#125; MAPA;


typedef struct &#123;
	       int posX;
	       int posY;
&#125; ESTADO;


typedef struct NOH &#123;
	       ESTADO estado;
	       float g;
	       float h;
	       struct NOH *pAntecessor;
	       struct NOH *pSucessores&#91;MAX_SUCESSORES&#93;;
	       struct NOH *pListaAntecessor;
	       struct NOH *pListaSucessor;
&#125; NOH;


float calculaH&#40;ESTADO aAtual, ESTADO aObjetivo&#41; &#123;
  return &#40;&#40;float&#41; sqrt&#40; &#40;double&#41;abs&#40;aAtual.posX-aObjetivo.posX&#41;+
                          &#40;double&#41;abs&#40;aAtual.posY-aObjetivo.posY&#41;&#41;&#41;;
&#125;

float calculaG&#40;int posAtual, int posProx&#41; &#123;
      if&#40;posAtual==posProx&#41; &#123;
     //Continuo na mesma direcao
              return &#40;float&#41; 1;  //custo apenas do passo
      &#125; else if&#40;abs&#40;posAtual - posProx&#41; &gt; &#40;MAX_SUCESSORES/2&#41;&#41; &#123;
      //Movimento maior que 180 graus, viro na outra direcao
              return &#40;float&#41; &#40;&#40;MAX_SUCESSORES - abs&#40;posAtual - posProx&#41;&#41; //custo da virada
                             + &#40;float&#41; 1.0&#41;; //custo do passo
      &#125; else &#123;
      //Movimento menor que 180 graus
              return &#40;float&#41; &#40;abs&#40;posAtual-posProx&#41; //custo da virada
                             + &#40;float&#41; 1.0&#41;; //custo do passo
      &#125;
&#125;

NOH *criarNOH&#40;&#41; &#123;
	NOH *pNOHCriado;
	int i;
	pNOHCriado=&#40;NOH *&#41; malloc&#40;sizeof &#40;NOH&#41;&#41;;
	if &#40;pNOHCriado == 0&#41;  &#123;
	    printf&#40;&quot;Falha ao alocar Mem¢ria!&quot;&#41;;
		exit&#40;1&#41;;
	&#125;
	for &#40;i=0; i&lt;MAX_SUCESSORES; i++&#41; &#123;
		pNOHCriado-&gt;pSucessores&#91;i&#93; = 0;
	&#125;
	pNOHCriado-&gt;pListaAntecessor = 0;
	pNOHCriado-&gt;pListaSucessor = 0;
	return pNOHCriado;
&#125;


NOH *naLista&#40;ESTADO aEstado, NOH * aLista&#41; &#123;
	NOH *resultado;
	NOH *pTemp;
	resultado=0;
	pTemp=aLista;
	while &#40;&#40;pTemp!=0&#41;&amp;&amp;&#40;resultado==0&#41;&#41; &#123;
		if &#40;&#40;pTemp-&gt;estado.posX==aEstado.posX&#41;&amp;&amp;&#40;pTemp-&gt;estado.posY==aEstado.posY&#41;&#41; &#123;
			resultado=pTemp;
		&#125;
		pTemp=pTemp-&gt;pListaSucessor;
	&#125;
	return resultado;
&#125;

void imprimeTela&#40;MAPA *mp, ESTADO *pos&#41; &#123;
	int i,j;
	for&#40;i=0;i&lt;ALTURA;i++&#41; &#123;
		for&#40;j=0;j&lt;LARGURA;j++&#41; &#123;
			if&#40;j==0&#41;
				printf&#40;&quot;|&quot;&#41;;

			if&#40;pos-&gt;posX !=j || pos-&gt;posY !=i&#41;
				printf&#40;&quot;%c&quot;,
					&#40;&#40;mp-&gt;posicao&#91;j&#93;&#91;i&#93;=='0'&#41; ? 0xB0 &#58; 0xB2&#41;
				&#41;;
			else
				printf&#40;&quot;%c&quot;, 0x01&#41;;

			if&#40;j==LARGURA-1&#41;
				printf&#40;&quot;|&quot;&#41;;
		&#125; //for j
		printf&#40;&quot;
&quot;&#41;;
	&#125; //for i
	printf&#40;&quot;
&quot;&#41;;
	getch&#40;&#41;;
&#125;

int main&#40;void&#41; &#123;
	MAPA mapaDoProblema;
	ESTADO objetivo;
	NOH *pRaiz;
	NOH *pAbertos;
	NOH *pFechados;
	NOH *pTemp;
	int achou;
	NOH *jaExiste;
	NOH *pIncluindo;
	int incluindo;
        int posAtual=0;
	int k;
	int acompanha = VISUAL;

	/* monta o mapa do problema */
	int i, j;

	pTemp=0;

	for &#40;i=0; i&lt;ALTURA; i++&#41; &#123;
		for &#40;j=0; j&lt;LARGURA; j++&#41;  &#123;
			mapaDoProblema.posicao&#91;j&#93;&#91;i&#93;='0';
		&#125;
	&#125;
	mapaDoProblema.posicao&#91;2&#93;&#91;0&#93;='1';
	mapaDoProblema.posicao&#91;1&#93;&#91;1&#93;='1';
	mapaDoProblema.posicao&#91;2&#93;&#91;1&#93;='1';
	mapaDoProblema.posicao&#91;3&#93;&#91;1&#93;='1';
	mapaDoProblema.posicao&#91;2&#93;&#91;2&#93;='1';
	mapaDoProblema.posicao&#91;1&#93;&#91;3&#93;='1';
	mapaDoProblema.posicao&#91;2&#93;&#91;3&#93;='1';
	mapaDoProblema.posicao&#91;4&#93;&#91;3&#93;='1';
	/* mapa do problema montado*/

	objetivo.posX=4;
	objetivo.posY=0;

	pRaiz=&#40;NOH *&#41; malloc&#40;sizeof &#40;NOH&#41;&#41;;
	if &#40;pRaiz == 0&#41; &#123;
	   printf&#40;&quot;Falha ao alocar Memória!&quot;&#41;;
	   exit&#40;1&#41;;
	&#125;

	pRaiz-&gt;estado.posX=0;
	pRaiz-&gt;estado.posY=0;
	pRaiz-&gt;g=0;
	pRaiz-&gt;h=calculaH&#40;pRaiz-&gt;estado, objetivo&#41;;
	pRaiz-&gt;pAntecessor = 0;

	/*
	printf&#40;&quot;--------------------------------- 
&quot;&#41;;
	printf&#40;&quot;DADOS INICIAIS
&quot;&#41;;
	printf&#40;&quot;X = &quot;&#41;; fflush&#40;stdin&#41;;
	scanf&#40;&quot;%d
&quot;, &amp;&#40;pRaiz-&gt;estado.posX&#41;&#41;;
	printf&#40;&quot;Y = &quot;&#41;; fflush&#40;stdin&#41;;
	scanf&#40;&quot;%d
&quot;, &amp;&#40;pRaiz-&gt;estado.posY&#41;&#41;;
	printf&#40;&quot;--------------------------------- 
&quot;&#41;;
	printf&#40;&quot;--------------------------------- 
&quot;&#41;;
	printf&#40;&quot;OBJETIVO
&quot;&#41;;
	printf&#40;&quot;X = &quot;&#41;; fflush&#40;stdin&#41;;
	scanf&#40;&quot;%d
&quot;, &amp;&#40;objetivo.posX&#41;&#41;;
	printf&#40;&quot;Y = &quot;&#41;; fflush&#40;stdin&#41;;
	scanf&#40;&quot;%d
&quot;, &amp;&#40;objetivo.posY&#41;&#41;;
	printf&#40;&quot;--------------------------------- 
&quot;&#41;;
	*/

	for &#40;i=0; i&lt;MAX_SUCESSORES; i++&#41; &#123;
		pRaiz-&gt;pSucessores&#91;i&#93; = 0;
        &#125;
	pRaiz-&gt;pListaAntecessor = 0;
	pRaiz-&gt;pListaSucessor = 0;

	pAbertos=pRaiz;
	pFechados=0;
	achou=0;

	if&#40;acompanha&#41;
		printf&#40;&quot;

 Limpando 

&quot;&#41;;

	while &#40; &#40;achou==0&#41; &amp;&amp; &#40;pAbertos!=0&#41; &#41;  &#123;
		//Tira o n¢ de abertos e coloca em fechados.
		pTemp=pAbertos;
		if&#40;acompanha&#41;
			printf&#40;&quot;Analisando No %d %d 
&quot;, pTemp-&gt;estado.posX, pTemp-&gt;estado.posY&#41;;

		pAbertos=&#40;NOH *&#41; pTemp-&gt;pListaSucessor;
		if &#40;pAbertos!=0&#41; &#123;
			pAbertos-&gt;pListaAntecessor=0;
		&#125;
		if &#40;pFechados!=0&#41; &#123;
			pFechados-&gt;pListaAntecessor=pTemp;
		&#125;
		pTemp-&gt;pListaSucessor=pFechados;
		pFechados=pTemp;

		//Verifica se eh um estado meta
		if &#40;&#40;pTemp-&gt;estado.posX==objetivo.posX&#41;&amp;&amp;&#40;pTemp-&gt;estado.posY==objetivo.posY&#41;&#41; &#123;
                        NOH *pFinal;
			achou=1;
                        //Retorna Resultado
			printf&#40;&quot;Resultado&#58; %d,%d

&quot;, pTemp-&gt;estado.posX, pTemp-&gt;estado.posY&#41;;
			pTemp = pFechados;
                        while&#40;pTemp-&gt;pAntecessor!=0&#41; &#123;
                              printf&#40;&quot;-&gt; %d,%d 
&quot;, pTemp-&gt;estado.posX, pTemp-&gt;estado.posY&#41;;
                              imprimeTela&#40;&amp;mapaDoProblema, &amp;&#40;pTemp-&gt;estado&#41;&#41;;
                              pTemp = pTemp-&gt;pAntecessor;
                        &#125;
			imprimeTela&#40;&amp;mapaDoProblema, &amp;&#40;pTemp-&gt;estado&#41;&#41;;
			
		&#125; else &#123;//Gerar os sucessores...

			//Gera sucessor Norte
			if &#40;&#40;pTemp-&gt;estado.posY&gt;0&#41;&amp;&amp;&#40;mapaDoProblema.posicao&#91;pTemp-&gt;estado.posX&#93;&#91;pTemp-&gt;estado.posY-1&#93;=='0'&#41;&#41; &#123;
				pTemp-&gt;pSucessores&#91;0&#93;= criarNOH&#40;&#41;;
				pTemp-&gt;pSucessores&#91;0&#93;-&gt;estado.posX=pTemp-&gt;estado.posX;
				pTemp-&gt;pSucessores&#91;0&#93;-&gt;estado.posY=pTemp-&gt;estado.posY-1;
				pTemp-&gt;pSucessores&#91;0&#93;-&gt;g=pTemp-&gt;g + calculaG&#40;posAtual,0&#41;;
				pTemp-&gt;pSucessores&#91;0&#93;-&gt;h=calculaH&#40;pTemp-&gt;pSucessores&#91;0&#93;-&gt;estado, objetivo&#41;;
				pTemp-&gt;pSucessores&#91;0&#93;-&gt;pAntecessor = pTemp;
				
				if&#40;acompanha&#41; &#123;
					printf&#40;&quot;Gerando Sucessor Norte %d %d - &quot;, pTemp-&gt;estado.posX, pTemp-&gt;estado.posY-1&#41;;
					printf&#40;&quot;g= %f, h= %f 
&quot;,pTemp-&gt;pSucessores&#91;0&#93;-&gt;g, pTemp-&gt;pSucessores&#91;0&#93;-&gt;h&#41;;
				&#125;
			&#125;
			
			//Gera sucessor Nordeste
			if &#40; &#40;pTemp-&gt;estado.posY&gt;0 &amp;&amp; pTemp-&gt;estado.posX&lt;4&#41; &amp;&amp;
				 &#40;mapaDoProblema.posicao&#91;pTemp-&gt;estado.posX+1&#93;&#91;pTemp-&gt;estado.posY-1&#93;=='0'&#41;&#41; &#123;
				pTemp-&gt;pSucessores&#91;1&#93;= criarNOH&#40;&#41;;
				pTemp-&gt;pSucessores&#91;1&#93;-&gt;estado.posX=pTemp-&gt;estado.posX+1;
				pTemp-&gt;pSucessores&#91;1&#93;-&gt;estado.posY=pTemp-&gt;estado.posY-1;
				pTemp-&gt;pSucessores&#91;1&#93;-&gt;g=pTemp-&gt;g + calculaG&#40;posAtual,1&#41;;
				pTemp-&gt;pSucessores&#91;1&#93;-&gt;h=calculaH&#40;pTemp-&gt;pSucessores&#91;1&#93;-&gt;estado, objetivo&#41;;
				pTemp-&gt;pSucessores&#91;1&#93;-&gt;pAntecessor = pTemp;

				if&#40;acompanha&#41; &#123;
					printf&#40;&quot;Gerando Sucessor Nordeste %d %d - &quot;, pTemp-&gt;estado.posX+1, pTemp-&gt;estado.posY-1&#41;;
					printf&#40;&quot;g= %f, h= %f 
&quot;,pTemp-&gt;pSucessores&#91;1&#93;-&gt;g, pTemp-&gt;pSucessores&#91;1&#93;-&gt;h&#41;;
				&#125;
			&#125;

			//Gera sucessor Leste
			if &#40;&#40;pTemp-&gt;estado.posX&lt;4&#41;&amp;&amp;&#40;mapaDoProblema.posicao&#91;pTemp-&gt;estado.posX+1&#93;&#91;pTemp-&gt;estado.posY&#93;=='0'&#41;&#41; &#123;
				pTemp-&gt;pSucessores&#91;2&#93;= criarNOH&#40;&#41;;
				pTemp-&gt;pSucessores&#91;2&#93;-&gt;estado.posX=pTemp-&gt;estado.posX+1;
				pTemp-&gt;pSucessores&#91;2&#93;-&gt;estado.posY=pTemp-&gt;estado.posY;
				pTemp-&gt;pSucessores&#91;2&#93;-&gt;g=pTemp-&gt;g + calculaG&#40;posAtual,2&#41;;
				pTemp-&gt;pSucessores&#91;2&#93;-&gt;h=calculaH&#40;pTemp-&gt;pSucessores&#91;2&#93;-&gt;estado, objetivo&#41;;
				pTemp-&gt;pSucessores&#91;2&#93;-&gt;pAntecessor = pTemp;
				if&#40;acompanha&#41; &#123;
					printf&#40;&quot;Gerando Sucessor Leste %d %d - &quot;, pTemp-&gt;estado.posX+1, pTemp-&gt;estado.posY&#41;;
					printf&#40;&quot;g= %f, h= %f 
&quot;,pTemp-&gt;pSucessores&#91;2&#93;-&gt;g, pTemp-&gt;pSucessores&#91;2&#93;-&gt;h&#41;;
				&#125;
			&#125;

			//Gera sucessor Sudeste
			if &#40; &#40;pTemp-&gt;estado.posY&lt;4 &amp;&amp; pTemp-&gt;estado.posX&lt;4&#41;&amp;&amp;
				 &#40;mapaDoProblema.posicao&#91;pTemp-&gt;estado.posX+1&#93;&#91;pTemp-&gt;estado.posY+1&#93;=='0'&#41;&#41; &#123;
				pTemp-&gt;pSucessores&#91;3&#93;= criarNOH&#40;&#41;;
				pTemp-&gt;pSucessores&#91;3&#93;-&gt;estado.posX=pTemp-&gt;estado.posX+1;
				pTemp-&gt;pSucessores&#91;3&#93;-&gt;estado.posY=pTemp-&gt;estado.posY+1;
				pTemp-&gt;pSucessores&#91;3&#93;-&gt;g=pTemp-&gt;g + calculaG&#40;posAtual,3&#41;;
				pTemp-&gt;pSucessores&#91;3&#93;-&gt;h=calculaH&#40;pTemp-&gt;pSucessores&#91;3&#93;-&gt;estado, objetivo&#41;;
				pTemp-&gt;pSucessores&#91;3&#93;-&gt;pAntecessor = pTemp;
				if&#40;acompanha&#41; &#123;
					printf&#40;&quot;Gerando Sucessor Sudeste %d %d - &quot;, pTemp-&gt;estado.posX+1, pTemp-&gt;estado.posY+1&#41;;
					printf&#40;&quot;g= %f, h= %f 
&quot;,pTemp-&gt;pSucessores&#91;3&#93;-&gt;g, pTemp-&gt;pSucessores&#91;3&#93;-&gt;h&#41;;
				&#125;
			&#125;

			//Gera sucessor Sul
			if &#40;&#40;pTemp-&gt;estado.posY&lt;4&#41;&amp;&amp;&#40;mapaDoProblema.posicao&#91;pTemp-&gt;estado.posX&#93;&#91;pTemp-&gt;estado.posY+1&#93;=='0'&#41;&#41; &#123;
				pTemp-&gt;pSucessores&#91;4&#93;= criarNOH&#40;&#41;;
				pTemp-&gt;pSucessores&#91;4&#93;-&gt;estado.posX=pTemp-&gt;estado.posX;
				pTemp-&gt;pSucessores&#91;4&#93;-&gt;estado.posY=pTemp-&gt;estado.posY+1;
				pTemp-&gt;pSucessores&#91;4&#93;-&gt;g=pTemp-&gt;g + calculaG&#40;posAtual,4&#41;;
				pTemp-&gt;pSucessores&#91;4&#93;-&gt;h=calculaH&#40;pTemp-&gt;pSucessores&#91;4&#93;-&gt;estado, objetivo&#41;;
				pTemp-&gt;pSucessores&#91;4&#93;-&gt;pAntecessor = pTemp;
				if&#40;acompanha&#41; &#123;
					printf&#40;&quot;Gerando Sucessor Sul %d %d - &quot;, pTemp-&gt;estado.posX, pTemp-&gt;estado.posY+1&#41;;
					printf&#40;&quot;g= %f, h= %f 
&quot;,pTemp-&gt;pSucessores&#91;4&#93;-&gt;g, pTemp-&gt;pSucessores&#91;4&#93;-&gt;h&#41;;
				&#125;
			&#125;

			//Gera sucessor Sudoeste
			if &#40; &#40;pTemp-&gt;estado.posY&lt;4 &amp;&amp; pTemp-&gt;estado.posX&gt;0&#41;&amp;&amp;
				 &#40;mapaDoProblema.posicao&#91;pTemp-&gt;estado.posX-1&#93;&#91;pTemp-&gt;estado.posY+1&#93;=='0'&#41;&#41; &#123;
				pTemp-&gt;pSucessores&#91;5&#93;= criarNOH&#40;&#41;;
				pTemp-&gt;pSucessores&#91;5&#93;-&gt;estado.posX=pTemp-&gt;estado.posX-1;
				pTemp-&gt;pSucessores&#91;5&#93;-&gt;estado.posY=pTemp-&gt;estado.posY+1;
				pTemp-&gt;pSucessores&#91;5&#93;-&gt;g=pTemp-&gt;g + calculaG&#40;posAtual,5&#41;;
				pTemp-&gt;pSucessores&#91;5&#93;-&gt;h=calculaH&#40;pTemp-&gt;pSucessores&#91;5&#93;-&gt;estado, objetivo&#41;;
				pTemp-&gt;pSucessores&#91;5&#93;-&gt;pAntecessor = pTemp;
				if&#40;acompanha&#41; &#123;
					printf&#40;&quot;Gerando Sucessor Sudoeste %d %d - &quot;, pTemp-&gt;estado.posX-1, pTemp-&gt;estado.posY+1&#41;;
					printf&#40;&quot;g= %f, h= %f 
&quot;,pTemp-&gt;pSucessores&#91;5&#93;-&gt;g, pTemp-&gt;pSucessores&#91;5&#93;-&gt;h&#41;;
				&#125;
			&#125;
  
			//Gera sucessor Oeste
			if &#40;&#40;pTemp-&gt;estado.posX&gt;0&#41;&amp;&amp;&#40;mapaDoProblema.posicao&#91;pTemp-&gt;estado.posX-1&#93;&#91;pTemp-&gt;estado.posY&#93;=='0'&#41;&#41; &#123;
				pTemp-&gt;pSucessores&#91;6&#93;= criarNOH&#40;&#41;;
				pTemp-&gt;pSucessores&#91;6&#93;-&gt;estado.posX=pTemp-&gt;estado.posX-1;
				pTemp-&gt;pSucessores&#91;6&#93;-&gt;estado.posY=pTemp-&gt;estado.posY;
				pTemp-&gt;pSucessores&#91;6&#93;-&gt;g=pTemp-&gt;g + calculaG&#40;posAtual,6&#41;;
				pTemp-&gt;pSucessores&#91;6&#93;-&gt;h=calculaH&#40;pTemp-&gt;pSucessores&#91;6&#93;-&gt;estado, objetivo&#41;;
				pTemp-&gt;pSucessores&#91;6&#93;-&gt;pAntecessor = pTemp;
				if&#40;acompanha&#41; &#123;
					printf&#40;&quot;Gerando Sucessor Oeste %d %d - &quot;, pTemp-&gt;estado.posX-1, pTemp-&gt;estado.posY&#41;;
					printf&#40;&quot;g= %f, h= %f 
&quot;,pTemp-&gt;pSucessores&#91;6&#93;-&gt;g, pTemp-&gt;pSucessores&#91;6&#93;-&gt;h&#41;;
				&#125;
			&#125;

			//Gera sucessor Noroeste
			if &#40; &#40;pTemp-&gt;estado.posY&gt;0 &amp;&amp; pTemp-&gt;estado.posX&gt;4&#41; &amp;&amp;
				 &#40;mapaDoProblema.posicao&#91;pTemp-&gt;estado.posX-1&#93;&#91;pTemp-&gt;estado.posY-1&#93;=='0'&#41;&#41; &#123;
				pTemp-&gt;pSucessores&#91;7&#93;= criarNOH&#40;&#41;;
				pTemp-&gt;pSucessores&#91;7&#93;-&gt;estado.posX=pTemp-&gt;estado.posX-1;
				pTemp-&gt;pSucessores&#91;7&#93;-&gt;estado.posY=pTemp-&gt;estado.posY-1;
				pTemp-&gt;pSucessores&#91;7&#93;-&gt;g=pTemp-&gt;g + calculaG&#40;posAtual,7&#41;;
				pTemp-&gt;pSucessores&#91;7&#93;-&gt;h=calculaH&#40;pTemp-&gt;pSucessores&#91;7&#93;-&gt;estado, objetivo&#41;;
				pTemp-&gt;pSucessores&#91;7&#93;-&gt;pAntecessor = pTemp;
				if&#40;acompanha&#41; &#123;
					printf&#40;&quot;Gerando Sucessor Noroeste %d %d - &quot;, pTemp-&gt;estado.posX-1, pTemp-&gt;estado.posY-1&#41;;
					printf&#40;&quot;g= %f, h= %f 
&quot;,pTemp-&gt;pSucessores&#91;7&#93;-&gt;g, pTemp-&gt;pSucessores&#91;7&#93;-&gt;h&#41;;
				&#125;
			&#125;
                        if&#40;acompanha&#41;
                                     getch&#40;&#41;;
                                     
			for &#40;k=0; k&lt;MAX_SUCESSORES; k++&#41; &#123;
				if &#40;pTemp-&gt;pSucessores&#91;k&#93;!=0&#41; &#123;
					//printf&#40;&quot;Analisando sucessor %d 
&quot;, k&#41;;
					jaExiste=naLista&#40;pTemp-&gt;pSucessores&#91;k&#93;-&gt;estado, pAbertos&#41;;
					if &#40;jaExiste!=0&#41; &#123;
						//Verifica se o novo caminho eh melhor e atualiza o no.
						free&#40;pTemp-&gt;pSucessores&#91;k&#93;&#41;;
						pTemp-&gt;pSucessores&#91;k&#93;=jaExiste;
					&#125; else &#123;
						jaExiste=naLista&#40;pTemp-&gt;pSucessores&#91;k&#93;-&gt;estado, pFechados&#41;;
						if &#40;jaExiste!=0&#41; &#123;
							//Verifica se o novo caminho eh melhor e atualiza o noh
							free&#40;pTemp-&gt;pSucessores&#91;k&#93;&#41;;
							pTemp-&gt;pSucessores&#91;k&#93;=jaExiste;
                                                        posAtual = k;
						&#125; else &#123;//inclui o novo no em Abertos
							if &#40;pAbertos==0&#41; &#123;
								pAbertos=pTemp-&gt;pSucessores&#91;k&#93;;
							&#125; else &#123;
								pIncluindo=pAbertos;
								incluindo=1;
								while &#40;incluindo==1&#41; &#123;
									if &#40;pIncluindo-&gt;g+pIncluindo-&gt;h &lt; pTemp-&gt;pSucessores&#91;k&#93;-&gt;g+pTemp-&gt;pSucessores&#91;k&#93;-&gt;h&#41; &#123;
										if &#40;pIncluindo-&gt;pListaSucessor!=0&#41; &#123;
											pIncluindo=pIncluindo-&gt;pListaSucessor;
										&#125; else &#123;
											pIncluindo-&gt;pListaSucessor=pTemp-&gt;pSucessores&#91;k&#93;;
											incluindo=0;
                                                                                        posAtual = k;
										&#125;
									&#125; else &#123;
										//inclui o noh antes de pIncluindo;
										pTemp-&gt;pSucessores&#91;k&#93;-&gt;pListaSucessor=pIncluindo;
										pTemp-&gt;pSucessores&#91;k&#93;-&gt;pListaAntecessor=pIncluindo-&gt;pListaAntecessor;
										pIncluindo-&gt;pListaAntecessor=pTemp-&gt;pSucessores&#91;k&#93;;
										incluindo=0;
									&#125;
								&#125;
							&#125;
						&#125;
					&#125;
				&#125;
			&#125;
		&#125;
	&#125;

	if &#40;achou!=0&#41;  &#123;
		printf&#40;&quot;
A solução foi encontrada!
&quot;&#41;;
		/* Mostrar resultado */
	&#125; else  &#123;
		printf&#40;&quot;Fracasso, não foi poss¡vel encontrar uma solução!
&quot;&#41;;
	&#125;

	while &#40;pAbertos!=0&#41; &#123;
		pTemp=pAbertos;
		pAbertos=&#40;NOH *&#41; pTemp-&gt;pListaSucessor;
		free&#40;pTemp&#41;;
	&#125;

	while &#40;pFechados!=0&#41; &#123;
		pTemp=pFechados;
		pFechados=&#40;NOH *&#41; pTemp-&gt;pListaSucessor;
		free&#40;pTemp&#41;;
	&#125;

        return 0;
&#125;
Criado 14 de maio de 2003
Ultima resposta 16 de mai. de 2003
Respostas 6
Participantes 4