Escolar Documentos
Profissional Documentos
Cultura Documentos
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);
}
}