Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
7e8bdc7
a
mariofernandezz Mar 20, 2023
09489b8
Merge branch 'Mario' into Aina
mariofernandezz Mar 21, 2023
ff0e4e0
prueba
hectorfortuno Mar 21, 2023
92be7c6
a
mariofernandezz Mar 22, 2023
b97f764
Merge remote-tracking branch 'origin/Aina' into Mario
mariofernandezz Mar 22, 2023
03bbf93
Merge remote-tracking branch 'origin/Aina' into Mario
mariofernandezz Mar 22, 2023
95e05ca
Merge remote-tracking branch 'origin/Aina' into Mario
mariofernandezz Mar 23, 2023
d91e1a6
a
mariofernandezz Mar 23, 2023
0518198
Merge remote-tracking branch 'origin/Aina' into Mario
mariofernandezz Mar 23, 2023
d2a8ede
Merge remote-tracking branch 'origin/Aina' into Mario
mariofernandezz Mar 23, 2023
ede86d2
Merge remote-tracking branch 'origin/main' into Mario
mariofernandezz Mar 25, 2023
ae02d82
a
ainaluis Mar 26, 2023
2cd13ca
a
ainaluis Mar 26, 2023
d2cbf95
a
mariofernandezz Mar 28, 2023
958321b
a
ainaluis Mar 28, 2023
d5d54a5
Falta comentar algunas funciones
mariofernandezz Mar 28, 2023
023fe72
main y SA buenos
ainaluis Mar 29, 2023
8351005
Merge branch 'Aina' of https://github.com/mariofernandezz/IA into Aina
hectorfortuno Mar 29, 2023
95d5265
a
ainaluis Mar 30, 2023
8f6952f
5b random de la 5
ainaluis Mar 30, 2023
a2ffdc3
version antes merge
ainaluis Mar 30, 2023
294f893
Merge branch 'Hector' into Aina
ainaluis Mar 30, 2023
2124813
a
ainaluis Mar 30, 2023
e08b767
Merge branch 'Hector' into Aina v2
ainaluis Mar 30, 2023
18db2c6
Versión def antes de comentarios
ainaluis Mar 30, 2023
abaec67
version completa. faltan comentarios
ainaluis Mar 30, 2023
30bab97
Update README.md
hectorfortuno Apr 3, 2023
3ce0e40
Update README.md
hectorfortuno Apr 3, 2023
6a058dd
Update README.md
hectorfortuno Apr 3, 2023
996f645
Update Estado.java
hectorfortuno Apr 3, 2023
ee69447
Update README.md
hectorfortuno Apr 3, 2023
dc4a8b3
Versión ya definitiva, faltan parametros SA buenos
hectorfortuno Apr 3, 2023
f099c2c
readme
hectorfortuno Apr 3, 2023
07ff47b
fuera
hectorfortuno Apr 3, 2023
cc1caff
out
hectorfortuno Apr 3, 2023
bc4cfc7
getM()
hectorfortuno Apr 3, 2023
f55fbfc
valores SA
hectorfortuno Apr 3, 2023
82ac444
valores SA
hectorfortuno Apr 3, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
680 changes: 237 additions & 443 deletions Estado.java

Large diffs are not rendered by default.

98 changes: 45 additions & 53 deletions Lab1Demo.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
// SCRIPT DE JAVA UTILIZADO PARA LANZAR EJECUCIONES SIMPLES

import java.util.Scanner;

import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import aima.search.framework.Problem;
Expand All @@ -12,100 +13,98 @@

public class Lab1Demo {
public static void main(String[] args){

// Se obtienen los parametros de la solucion
Scanner scan = new Scanner(System.in);
System.out.println("Cuantos participantes hay? (N)");
int N = scan.nextInt();
System.out.println("Cuantos son conductores? (M)");
int M = scan.nextInt();
System.out.println("Introduce una seed");
int seed = scan.nextInt();
System.out.println("¿Qué algoritmo quieres usar? \n(1) Hill Climbing \n(2) Simulated Annealing");
int alg = scan.nextInt();
System.out.println("¿Qué heurística quieres usar? \n(1) Min distancia \n(2) Min distancia y conductores");
int h = scan.nextInt();



// Creacion y print del estado inicial, en caso de que sea posible crearlo
System.out.println("\nSolución inicial -->");
Estado estado = new Estado(N, M, seed);
estado.solucionInicial5();
if (!estado.solucionInicial2()){ // Cambiar aquí la solución inicial
System.out.println("No se ha podido generar una solución inicial");
return;
}
mostrarMetricas(estado);

long startTime = System.currentTimeMillis();
Lab1HillClimbingSearch(estado);
if (alg==1) Lab1HillClimbingSearch(estado, h); // Se realiza la busqueda local usando Hill Climbing
else Lab1SimulatedAnnealingSearch(estado, h); // Se realiza la busqueda local usando Simulated Annealing
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
System.out.println("Tiempo de ejecución: " + elapsedTime + " milisegundos");

startTime = System.currentTimeMillis();
Lab1SimulatedAnnealingSearch(estado);
endTime = System.currentTimeMillis();
elapsedTime = endTime - startTime;
System.out.println("Tiempo de ejecución: " + elapsedTime + " milisegundos");

startTime = System.currentTimeMillis();
Lab1SimulatedAnnealingIterationSearch(estado);
endTime = System.currentTimeMillis();
elapsedTime = endTime - startTime;
System.out.println("Tiempo de ejecución: " + elapsedTime + " milisegundos");
}



// Muestra por pantalla la lista de eventos, la distancia recorrida y el número de usuarios que hacen de conductor del (estado)
private static void mostrarMetricas(Estado estado){
int ncond = estado.numeroConductores();
int dist = estado.kilometrajeSolucion();
int dist = estado.kilometrajeEstado();
System.out.println("Eventos: " + estado.getEventos());
System.out.println("Distancia recorrida: " + dist);
System.out.println("Conductores usados: " + ncond);
}

private static void Lab1HillClimbingSearch(Estado estado) {

// Búsqueda utilizando el algoritmo de Hill-Climbing
private static void Lab1HillClimbingSearch(Estado estado, int h) {
System.out.println("\nLab1 HillClimbing -->");
try {
Problem problem = new Problem(estado,new Lab1SuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction2());
Problem problem;
if (h==1) problem = new Problem(estado,new Lab1SuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction1());
else problem = new Problem(estado,new Lab1SuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction2());
Search search = new HillClimbingSearch();
SearchAgent agent = new SearchAgent(problem,search);

//printActions(agent.getActions());
printInstrumentation(agent.getInstrumentation());

Estado estadoSolucion = (Estado) search.getGoalState();
mostrarMetricas(estadoSolucion);

printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}

private static void Lab1SimulatedAnnealingSearch(Estado estado) {

// Búsqueda utilizando el algoritmo de Simulated Annealing
private static void Lab1SimulatedAnnealingSearch(Estado estado, int h) {
System.out.println("\nLab1 Simulated Annealing -->");
try {
Problem problem = new Problem(estado,new Lab1SASuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction2());
SimulatedAnnealingSearch search = new SimulatedAnnealingSearch(100000,100,10,0.001);
//search.traceOn();
SearchAgent agent = new SearchAgent(problem,search);
//printActions(agent.getActions());
printInstrumentation(agent.getInstrumentation());

Estado estadoSolucion = (Estado) search.getGoalState();
mostrarMetricas(estadoSolucion);
} catch (Exception e) {
e.printStackTrace();
}
}
// Definición de los parámetros del algoritmo
int it = 10000000;
int itpc = 100;
int k = 25;
double lambda = 0.0001;

private static void Lab1SimulatedAnnealingIterationSearch(Estado estado) {
System.out.println("\nLab1 Simulated Annealing Iterations-->");
try {
Problem problem = new Problem(estado,new Lab1SAIterationsSuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction2());
SimulatedAnnealingSearch search = new SimulatedAnnealingSearch(100000,100,10,0.001);
Problem problem;
if (h==1) problem = new Problem(estado,new Lab1SASuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction1());
else problem = new Problem(estado,new Lab1SASuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction2());
SimulatedAnnealingSearch search = new SimulatedAnnealingSearch(it, itpc, k, lambda);
//search.traceOn();
SearchAgent agent = new SearchAgent(problem,search);
//printActions(agent.getActions());
printInstrumentation(agent.getInstrumentation());

Estado estadoSolucion = (Estado) search.getGoalState();
mostrarMetricas(estadoSolucion);
System.out.println("It: " + it + ". It por cambio de temperatura: " + itpc + ". k: " + k + ". lambda: " + lambda);
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}


//*********************************************************************************************
//******************************* FUNCIONES AUXILIARES ****************************************
//*********************************************************************************************

private static void printInstrumentation(Properties properties) {
Iterator keys = properties.keySet().iterator();
while (keys.hasNext()) {
Expand All @@ -115,12 +114,5 @@ private static void printInstrumentation(Properties properties) {
}

}

private static void printActions(List actions) {
for (int i = 0; i < actions.size(); i++) {
String action = (String) actions.get(i);
System.out.println(action);
}
}

}
116 changes: 116 additions & 0 deletions Lab1Experimentos.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
// SCRIPT DE JAVA UTILIZADO PARA EL DISEÑO DE EXPERIMENTOS

import java.util.Iterator;
import java.util.Properties;

import aima.search.framework.Problem;
import aima.search.framework.Search;
import aima.search.framework.SearchAgent;
import aima.search.informed.HillClimbingSearch;
import aima.search.informed.SimulatedAnnealingSearch;

public class Lab1Experimentos {
public static void main(String[] args){

int N, M, seed, alg, h;

if (args.length != 5) {
System.out.println("Debes ingresar 5 valores separados por espacios");
return;
}

N = Integer.parseInt(args[0]);
M = Integer.parseInt(args[1]);
seed = Integer.parseInt(args[2]);
alg = Integer.parseInt(args[3]);
h = Integer.parseInt(args[4]);

// Creacion y print del estado inicial, en caso de que sea posible crearlo
System.out.println("\nSolución inicial -->");
Estado estado = new Estado(N, M, seed);
if (!estado.solucionInicial2()){ // Cambiar aquí la solución inicial
System.out.println("No se ha podido generar una solución inicial");
return;
}
mostrarMetricas(estado);

long startTime = System.currentTimeMillis();
if (alg==1) Lab1HillClimbingSearch(estado, h); // Se realiza la busqueda local usando Hill Climbing
else Lab1SimulatedAnnealingSearch(estado, h); // Se realiza la busqueda local usando Simulated Annealing
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
System.out.println("Tiempo de ejecución: " + elapsedTime + " milisegundos");
}


// Muestra por pantalla la lista de eventos, la distancia recorrida y el número de usuarios que hacen de conductor del (estado)
private static void mostrarMetricas(Estado estado){
int ncond = estado.numeroConductores();
int dist = estado.kilometrajeEstado();
System.out.println("Eventos: " + estado.getEventos());
System.out.println("Distancia recorrida: " + dist);
System.out.println("Conductores usados: " + ncond);
}


// Búsqueda utilizando el algoritmo de Hill-Climbing
private static void Lab1HillClimbingSearch(Estado estado, int h) {
System.out.println("\nLab1 HillClimbing -->");
try {
Problem problem;
if (h==1) problem = new Problem(estado,new Lab1SuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction1());
else problem = new Problem(estado,new Lab1SuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction2());
Search search = new HillClimbingSearch();
SearchAgent agent = new SearchAgent(problem,search);

Estado estadoSolucion = (Estado) search.getGoalState();
mostrarMetricas(estadoSolucion);
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}


// Búsqueda utilizando el algoritmo de Simulated Annealing
private static void Lab1SimulatedAnnealingSearch(Estado estado, int h) {
System.out.println("\nLab1 Simulated Annealing -->");
try {
// Definición de los parámetros del algoritmo
int it = 1000000;
int itpc = 100;
int k = 25;
double lambda = 0.0001;

Problem problem;
if (h==1) problem = new Problem(estado,new Lab1SASuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction1());
else problem = new Problem(estado,new Lab1SASuccessorFunction(), new Lab1GoalTest(),new Lab1HeuristicFunction2());
SimulatedAnnealingSearch search = new SimulatedAnnealingSearch(it, itpc, k, lambda);
//search.traceOn();
SearchAgent agent = new SearchAgent(problem,search);

Estado estadoSolucion = (Estado) search.getGoalState();
mostrarMetricas(estadoSolucion);
System.out.println("It: " + it + ". It por cambio de temperatura: " + itpc + ". k: " + k + ". lambda: " + lambda);
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}


//*********************************************************************************************
//******************************* FUNCIONES AUXILIARES ****************************************
//*********************************************************************************************

private static void printInstrumentation(Properties properties) {
Iterator keys = properties.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
String property = properties.getProperty(key);
System.out.println(key + " : " + property);
}

}

}
6 changes: 4 additions & 2 deletions Lab1HeuristicFunction1.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// DEFINICIÓN DE LA FUNCIÓN HEURISTICA 1

import aima.search.framework.HeuristicFunction;

public class Lab1HeuristicFunction1 implements HeuristicFunction {
Expand All @@ -11,8 +13,8 @@ public boolean equals(Object obj) {

// Heurística 1: Se considera únicamente la suma de distancia recorrida por todos los conductores
public double getHeuristicValue(Object s) {
Estado estado = (Estado)s;
return estado.kilometrajeSolucion();
Estado estado = (Estado)s;
return estado.kilometrajeEstado();
}
}

34 changes: 2 additions & 32 deletions Lab1HeuristicFunction2.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
// DEFINICIÓN DE LA FUNCIÓN HEURISTICA 2

// Penalizar manzanas sin pasajeros completos (antes de acabar la trayectoria?)

// Solución Inicial --> Poner a cada conductor pasajeros dentro del rectangulo de su path.

import java.util.ArrayList;

import aima.search.framework.HeuristicFunction;

public class Lab1HeuristicFunction2 implements HeuristicFunction {
Expand All @@ -17,34 +11,10 @@ public boolean equals(Object obj) {
return retValue;
}


public double getHeuristicValue(Object s) {
Estado estado = (Estado)s;
ArrayList<ArrayList<Integer>> eventos = estado.getEventos();
double ncond = 0;
for (int i=0; i<estado.getM(); i++){
if (eventos.get(i).size()>0) {
ncond+=1;
}
}
//System.out.println(sum/(300*estado.getN()) + (ncond/estado.getM()));
return 0.75*estado.kilometrajeSolucion()/estado.get_distInicial() + 0.25*ncond/estado.getM();
}

/*
// Heurística 2: Se considera la suma de la distancia recorrida por todos los conductores y el número de conductores de la solución
// REDEFINIR QUÉ IMPORTANCIA LE DAMOS A CADA COSA (CONDUCTORES Y KM)!!
public double getHeuristicValue(Object s) {
Estado estado = (Estado)s;
ArrayList<ArrayList<Integer>> eventos = estado.getEventos();
int sum = 0;
for (int i=0; i<estado.M; i++){
if (eventos.get(i).size()>0) {
sum += estado.kilometrajeConductor_manzanasLibres(eventos.get(i));
}
}
return sum;
}*/

return estado.kilometrajeEstado() + 70*estado.numeroConductores();
}

}
Loading