Você está na página 1de 11

PROCURA HEURISCA

SOFREGA
TRABALHO PRTICO


Responsvel Bruno Rafael Cruz Oliveira, 1010136
Data 16.outubro.2012 Ref Ficha 11
DIRC.009.02













Curso Engenharia Informtica
Unidade Curricular Inteligncia Artificial
Ano / Semestre 3. / 1.
Ano Letivo 2012/2013
Docente Celestino Gonalves


Procura Heurstica Sfrega

Programa desenvolvido em linguagem java, com o intuito de criar um programa que exemplificasse a procura heurstica
sfrega.

O objetivo final foi alcanado com sucesso, tendo a seguinte estrutura.




Menu de Cidades de Destino, onde se encontram todas as cidades onde pode comear a nossa procura.





De seguido podemos ver dois exemplos as correr na aplicao, no primeiro exemplo resolvemos o problema colocado na
aula (caminho de Arad ate Bucharest) enquanto que no segundo exemplo fizemos o caminho de Neamt ate Bucharest.

































Exemplo 1

























Exemplo 2












ANEXO


package ficha11;

import java.util.ArrayList;
import java.util.Scanner;

/**
*
* @author Bruno
*/
public class Ficha11
{
private static String[] lrecta; //definir o array de linha recta
private static int [] lrectaValor;
private static int filhos[] ; //declarar valores dos filhos
private static String caminho[]; //GUARDAR O CAMINHO POR ONDE PASSA
private static String caminhoCusto[][]; //para guardar o custo real entre cidades -- INICIO - FIM - CUSTO
private static int caminhoCustoValor[];
private static int custo = 0;
private static int valor = 400; // Guarda valor do filho, 999 para termos a certeza ke temos um menor.
private static String v; //valor de cima mas numa string para o if
private static String cidade;
private static String nomecidade;
private static int nfilhos = 0; //PARA DIZERMOS QUANTOS FILHOS TEM CADA CIDADE
private static boolean estado; //estado do while
private static int y = 2; //indixe do vector caminho
private static String origem; //ORIGEM DA CIDADE
private static String destino; // DISTINO CIDADE
private static int iteracao=0;

public static void main(String[] args)
{
lrecta = new String[20];//TAMANHO DA TABELA DO ARRAY
lrectaValor = new int[20];

lrecta[0] = "Arad"; lrectaValor[0] = 366;
lrecta[1] = "Bucharest"; lrectaValor[1] = 0;
lrecta[2] = "Craiova"; lrectaValor[2] = 160;
lrecta[3] = "Dobreta"; lrectaValor[3] = 242;
lrecta[4] = "Eforie"; lrectaValor[4] = 161;
lrecta[5] = "Fagaras"; lrectaValor[5] = 178;
lrecta[6] = "Giurgiu"; lrectaValor[6] = 77;
lrecta[7]= "Hirsova"; lrectaValor[7] = 151;
lrecta[8] = "Iasi"; lrectaValor[8] = 226;
lrecta[9] = "Lugoj"; lrectaValor[9] = 244;
lrecta[10] = "Mehadia"; lrectaValor[10] = 241;
lrecta[11] = "Neamt"; lrectaValor[11] = 234;
lrecta[12] = "Oradea"; lrectaValor[12] = 380;
lrecta[13] = "Pitesti"; lrectaValor[13] = 98;
lrecta[14] = "Rimnicu"; lrectaValor[14] = 193;
lrecta[15] = "Sibiu"; lrectaValor[15] = 253;
lrecta[16] = "Timisoara"; lrectaValor[16] = 329;
lrecta[17] = "Urzuceni"; lrectaValor[17] = 80;
lrecta[18] = "Vaslui"; lrectaValor[18] = 199;
lrecta[19] = "Zerind"; lrectaValor[19] = 374;

caminhoCusto = new String [46][2];
caminhoCustoValor = new int[46];

caminhoCusto[0][0] = "Oradea"; caminhoCusto[0][1] = "Zerind"; caminhoCustoValor[0] = 71;
caminhoCusto[1][0] = "Oradea"; caminhoCusto[1][1] = "Sibiu"; caminhoCustoValor[1] = 151;

caminhoCusto[2][0] = "Zerind"; caminhoCusto[2][1] = "Oradea"; caminhoCustoValor[2] = 71;
caminhoCusto[3][0] = "Zerind"; caminhoCusto[3][1] = "Arad"; caminhoCustoValor[3] = 75;


caminhoCusto[4][0] = "Arad"; caminhoCusto[4][1] = "Zerind"; caminhoCustoValor[4] = 75;
caminhoCusto[5][0] = "Arad"; caminhoCusto[5][1] = "Sibiu"; caminhoCustoValor[5] = 140;
caminhoCusto[6][0] = "Arad"; caminhoCusto[6][1] = "Timisoara"; caminhoCustoValor[6] = 118;

caminhoCusto[7][0] = "Timisoara"; caminhoCusto[7][1] = "Arad"; caminhoCustoValor[7] = 118;
caminhoCusto[8][0] = "Timisoara"; caminhoCusto[8][1] = "Lugoj"; caminhoCustoValor[8] = 111;

caminhoCusto[9][0]= "Lujog"; caminhoCusto[9][1] = "Timisoara"; caminhoCustoValor[9] = 111;
caminhoCusto[10][0]= "Lujog"; caminhoCusto[10][1] = "Mehadia"; caminhoCustoValor[10] = 70;

caminhoCusto[11][0]= "Mehadia"; caminhoCusto[11][1] = "Lugoj"; caminhoCustoValor[11] = 70;
caminhoCusto[12][0]= "Mehadia"; caminhoCusto[12][1] = "Dobreta"; caminhoCustoValor[12] = 75;

caminhoCusto[13][0]= "Dobreta"; caminhoCusto[13][1] = "Mehadia"; caminhoCustoValor[13] = 75;
caminhoCusto[14][0]= "Dobreta"; caminhoCusto[14][1] = "Craiova"; caminhoCustoValor[14] = 120;

caminhoCusto[15][0]= "Craiova"; caminhoCusto[15][1] = "Dobreta"; caminhoCustoValor[15] = 120;
caminhoCusto[16][0]= "Craiova"; caminhoCusto[16][1] = "Rimnicu"; caminhoCustoValor[16] = 146;
caminhoCusto[17][0]= "Craiova"; caminhoCusto[17][1] = "Pitesti"; caminhoCustoValor[17] = 138;

caminhoCusto[18][0]= "Rimnicu"; caminhoCusto[18][1] = "Craiova"; caminhoCustoValor[18] = 146;
caminhoCusto[19][0]= "Rimnicu"; caminhoCusto[19][1] = "Sibiu"; caminhoCustoValor[19] = 80;
caminhoCusto[20][0]= "Rimnicu"; caminhoCusto[20][1] = "Pitesti"; caminhoCustoValor[20] = 97;

caminhoCusto[21][0]= "Sibiu"; caminhoCusto[21][1] = "Oradea"; caminhoCustoValor[21] = 151;
caminhoCusto[22][0]= "Sibiu"; caminhoCusto[22][1] = "Arad"; caminhoCustoValor[22] = 140;
caminhoCusto[23][0]= "Sibiu"; caminhoCusto[23][1] = "Romnicu"; caminhoCustoValor[23] = 80;
caminhoCusto[24][0]= "Sibiu"; caminhoCusto[24][1] = "Fagaras"; caminhoCustoValor[24] = 99;

caminhoCusto[25][0]= "Fagaras"; caminhoCusto[25][1] = "Sibiu"; caminhoCustoValor[25] = 99;
caminhoCusto[26][0]= "Fagaras"; caminhoCusto[26][1] = "Bucharest"; caminhoCustoValor[26] = 211;

caminhoCusto[27][0]= "Pitesti"; caminhoCusto[27][1] = "Rimnicu"; caminhoCustoValor[27] = 97;
caminhoCusto[28][0]= "Pitesti"; caminhoCusto[28][1] = "Craiova"; caminhoCustoValor[28] = 138;
caminhoCusto[29][0]= "Pitesti"; caminhoCusto[29][1] = "Bucharest"; caminhoCustoValor[29] = 101;

caminhoCusto[30][0]= "Bucharest"; caminhoCusto[30][1] = "Fagaras"; caminhoCustoValor[30] = 211;
caminhoCusto[31][0]= "Bucharest"; caminhoCusto[31][1] = "Pitesti"; caminhoCustoValor[31] = 101;
caminhoCusto[32][0]= "Bucharest"; caminhoCusto[32][1] = "Giurgiu"; caminhoCustoValor[32] = 90;
caminhoCusto[33][0]= "Bucharest"; caminhoCusto[33][1] = "Urziceni"; caminhoCustoValor[33] = 85;

caminhoCusto[34][0]= "Giurgiu"; caminhoCusto[34][1] = "Bucharest"; caminhoCustoValor[34] = 90;

caminhoCusto[35][0]= "Urziceni"; caminhoCusto[35][1] = "Bucharest"; caminhoCustoValor[35] = 85;
caminhoCusto[36][0]= "Urziceni"; caminhoCusto[36][1] = "Hirsova"; caminhoCustoValor[36] = 98;
caminhoCusto[37][0]= "Urziceni"; caminhoCusto[37][1] = "Vaslui"; caminhoCustoValor[37] = 142;

caminhoCusto[38][0]= "Hirsova"; caminhoCusto[38][1] = "Urziceni"; caminhoCustoValor[38] = 98;
caminhoCusto[39][0]= "Hirsova"; caminhoCusto[39][1] = "Eforie"; caminhoCustoValor[39] = 86;

caminhoCusto[40][0]= "Eforie"; caminhoCusto[40][1] = "Hirsova"; caminhoCustoValor[40] = 86;

caminhoCusto[41][0]= "Vaslui"; caminhoCusto[41][1] = "Urziceni"; caminhoCustoValor[41] = 142;
caminhoCusto[42][0]= "Vaslui"; caminhoCusto[42][1] = "Iasi"; caminhoCustoValor[42] = 92;

caminhoCusto[43][0]= "Iasi"; caminhoCusto[43][1] = "Vaslui"; caminhoCustoValor[43] = 92;
caminhoCusto[44][0]= "Iasi"; caminhoCusto[44][1] = "Neamt"; caminhoCustoValor[44] = 87;

caminhoCusto[45][0]= "Neamt"; caminhoCusto[45][1] = "Iasi"; caminhoCustoValor[45] = 87;



// //ESCREVER AS CIDADES
// for (int i=0; i<20 ; i++ )
// {
// for (int j=0; j<2 ; j++)
// {
// System.out.println(lrecta[i][j]);

// }
// }
// System.out.println("---------------------------------------------");

//DECLARAR FILHOS DAS CIDADES
//cidade = "Arad"; // a primeira CIdade a ser visualizada
Scanner in = new Scanner(System.in);

System.out.println(" ** MENU DE CIDADE DE ORIGEM ** ");
System.out.println("| 1 | Arad | 2 | Zerind |");
System.out.println("| 3 | Craiova | 4 | Dobreta |");
System.out.println("| 5 | Eforie | 6 | Fagaras |");
System.out.println("| 7 | Giurgiu | 8 | Hirsova |");
System.out.println("| 9 | Iasi |10 | Lugoj |");
System.out.println("|11 | Mehadia |12 | Neamt |");
System.out.println("|13 | Oradea |14 | Pitesti |");
System.out.println("|15 | Rimnicu |16 | Sibiu |");
System.out.println("|17 | Timisoara |18 | Urzuceni |");
System.out.println("|19 | Vaslui | - | ------- |");
System.out.println("|Introduza a Cidade Inicial? |");
String opcao = in.nextLine();

switch(opcao)
{
case "1":
cidade = "Arad";
System.out.println(cidade);
break;
case "2":
cidade = "Zerind";
System.out.println(cidade);
break;
case "3":
cidade = "Craiova";
System.out.println(cidade);
break;
case "4":
cidade = "Dobreta";
System.out.println(cidade);
break;
case "5":
cidade = "Eforie";
System.out.println(cidade);
break;
case "6":
cidade = "Fagaras";
System.out.println(cidade);
break;
case "7":
cidade = "Giurgiu";
System.out.println(cidade);
break;
case "8":
cidade = "Hirsova";
System.out.println(cidade);
break;
case "9":
cidade = "Iasi";
System.out.println(cidade);
break;
case "10":
cidade = "Lugoj";
System.out.println(cidade);
break;
case "11":
cidade = "Mehadia";
System.out.println(cidade);
break;

case "12":
cidade = "Neamt";
System.out.println(cidade);
break;
case "13":
cidade = "Oradea";
System.out.println(cidade);
break;
case "14":
cidade = "Pitesti";
System.out.println(cidade);
break;
case "15":
cidade = "Rimnicu";
System.out.println(cidade);
break;
case "16":
cidade = "Sibiu";
System.out.println(cidade);
break;
case "17":
cidade = "Timisoara";
System.out.println(cidade);
break;
case "18":
cidade = "Urzuceni";
System.out.println(cidade);
break;
case "19":
cidade = "Vaslui";
System.out.println(cidade);
break;

}




// cidade = "Sibiu";
custo = 0; // valor de inicio de ARAD

caminho = new String[100];
caminho[0]=cidade; //PARA COMEAR A ESCREVER O CAMINHO
estado = true;

System.out.println("*********************************\n");
System.out.println("* PROCURA HEURISTICA SOFREGA *\n");
System.out.println("*********************************\n\n");

System.out.println("***** ITERAO 1 ******");

while(estado == true)
{
switch(cidade)
{
case "Arad":
filhos = new int[3];
filhos[0] = 374;
filhos[1] = 253;
filhos[2] = 329;
nfilhos = 3;
break;
case "Bucharest":
filhos = new int[4];
filhos[0] = 178;
filhos[1] = 98;
filhos[2] = 77;
filhos[3] = 80;

nfilhos = 4;
break;
case "Craiova":
filhos = new int[3];
filhos[0] = 193; //rimnicu
filhos[1] = 242; //dobreta
filhos[2] = 98; //pitesti
nfilhos = 3;
break;
case "Dobreta":
filhos = new int[2];
filhos[0] = 241; //mehadia
filhos[1] = 160; //craiova
nfilhos = 2;
break;
case "Eforie":
filhos = new int[1];
filhos[0] = 151; //hisova
nfilhos = 1;
break;
case "Fagaras":
filhos = new int[2];
filhos[0] = 253; //sibiu
filhos[1] = 0; //bucharest
nfilhos = 2;
break;
case "Giurgiu":
filhos = new int[1];
filhos[0] = 0; //bucharest
nfilhos = 1;
break;
case "Hirsova":
filhos = new int[2];
filhos[0] = 80; //urziceni
filhos[1] = 161; //eforie
nfilhos = 2;
break;
case "Iasi":
filhos = new int[2];
filhos[0] = 234; //neant
filhos[1] = 199; //vaslui
nfilhos = 2;
break;
case "Lugoj":
filhos = new int[2];
filhos[0] = 329; //timisoara
filhos[1] = 241; //mehadia
nfilhos = 2;
break;
case "Mehadia":
filhos = new int[2];
filhos[0] = 244; //lugoj
filhos[1] = 242; //dobreta
nfilhos = 2;
break;
case "Neamt":
filhos = new int[1];
filhos[0] = 226; //iasi
nfilhos = 1;
break;
case "Oradea":
filhos = new int[2];
filhos[0] = 253; //sibiu
filhos[1] = 374; //zerind
nfilhos = 2;
break;
case "Pitesti":
filhos = new int[3];

filhos[0] = 193; //rimnicu
filhos[1] = 160; //craiova
filhos[2] = 0; //bucharest
nfilhos = 3;
break;
case "Rimnicu":
filhos = new int[3];
filhos[0] = 253; //sibiu
filhos[1] = 160; //craiova
filhos[2] = 98; //pitesti
nfilhos = 3;
break;
case "Sibiu":
filhos = new int[4];
filhos[0] = 380; //oradea
filhos[1] = 366; //arad
filhos[2] = 178; //fagaras
filhos[3] = 193; //rimnicu
nfilhos = 4;
break;
case "Timisoara":
filhos = new int[2];
filhos[0] = 366; //arad
filhos[1] = 244; //lugoj
nfilhos = 2;
break;
case "Urzuceni":
filhos = new int[3];
filhos[0] = 199; //vaslui
filhos[1] = 0; //bucharest
filhos[2] = 151; //hirsova
nfilhos = 3;
break;
case "Vaslui":
filhos = new int[2];
filhos[0] = 226; //iasi
filhos[1] = 80; //urzuceni
nfilhos = 2;
break;
case "Zerind":
filhos = new int[2];
filhos[0] = 380; //oradea
filhos[1] = 366; //arad
nfilhos = 2;
break;
}



//CALCULAR QUAL O VALOR MAIS PEQUENO DO N
for (int i = 0; i < nfilhos ; i++ )
{
if (valor > filhos[i])
{
valor = filhos[i]; //valor da cidade mais pequena
System.out.println("O VALOR MAIS PEQUENO DO NO : ");
System.out.println(filhos[i]);
//aqui temos o valor em numero, precisamos de encontrar a cidade
}
}

//ENCONTRAR CIDADE
for (int i = 0; i < 20; i++)
{


if (lrectaValor[i] == valor) //ENCONTRAR A CIDADE
{

origem = cidade;
cidade = lrecta[i];
caminho[y] = cidade; //indice de caminho
y++;
destino = cidade;
int iteracao = y;
iteracao -= 1;
System.out.println("\n\n**************************");
System.out.println("Iterao: "+iteracao);
System.out.println("**************************\n");
System.out.println("Cidades Seleccionadas ");
System.out.println("Cidade de Origem : "+origem);
System.out.println("Cidade de Destino: "+destino);

//System.out.println(cidade);
}
}


for (int i =0; i< 45 ; i++)
{
if ((caminhoCusto[i][0] == origem)&& (caminhoCusto[i][1] == destino) )
{
int valorCusto = caminhoCustoValor[i]; //VALOR DO CUSTO ENTRE CIDADE

custo += valorCusto; // somar o custo
System.out.println("CUSTO Entre as Cidades: "+ custo);
}
}

System.out.println("#########");
System.out.println("Custo Linha Recta :"+valor);
System.out.println("Proxima Cidade a analisar: "+cidade);
if(valor == 0){
estado = false;
}
}

//ESCREVER CAMINHO PERCORRDO
System.out.println("\n\nCaminho:");

for(int i=0 ; i<y ; i++){
iteracao = i;

System.out.println(" - "+caminho[i]+" Iteracao: "+i);
}
System.out.println("Custo Final: "+custo);
}
}

Você também pode gostar