From 101e419dc6e53a4360f9ad519094c38c4e3e809d Mon Sep 17 00:00:00 2001 From: pacopua <113210040+pacopua@users.noreply.github.com> Date: Sun, 13 Oct 2024 16:45:15 +0200 Subject: [PATCH 01/16] Create hola --- hola | 1 + 1 file changed, 1 insertion(+) create mode 100644 hola diff --git a/hola b/hola new file mode 100644 index 0000000..ffd8eeb --- /dev/null +++ b/hola @@ -0,0 +1 @@ +salu2 From 02bc5bb7893115d5092f50451b047955447116bd Mon Sep 17 00:00:00 2001 From: pacopua <113210040+pacopua@users.noreply.github.com> Date: Sun, 13 Oct 2024 16:48:05 +0200 Subject: [PATCH 02/16] Delete hola --- hola | 1 - 1 file changed, 1 deletion(-) delete mode 100644 hola diff --git a/hola b/hola deleted file mode 100644 index ffd8eeb..0000000 --- a/hola +++ /dev/null @@ -1 +0,0 @@ -salu2 From 39097a64bee0ec087dac7d30396c60e120540ff2 Mon Sep 17 00:00:00 2001 From: pacopua <113210040+pacopua@users.noreply.github.com> Date: Sun, 13 Oct 2024 16:53:38 +0200 Subject: [PATCH 03/16] Update_Estado_FuncionesSwap.java --- src/com/lluc/practicaIA1/Estado.java | 177 +++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) diff --git a/src/com/lluc/practicaIA1/Estado.java b/src/com/lluc/practicaIA1/Estado.java index 3a2ec0e..f2af5de 100644 --- a/src/com/lluc/practicaIA1/Estado.java +++ b/src/com/lluc/practicaIA1/Estado.java @@ -68,6 +68,183 @@ public double heuristicoCoseFelicidad() { return felicidad + coste; } + public boolean moure_paquete(int ip, int oferta_desti, Paquetes paquetes, Transporte ofertas) { + Paquete p = paquetes.get(ip); + double peso_paquete = p.getPeso(); + + vecOfertas[vecPaquetes[ip]] += peso_paquete; + vecOfertas[oferta_desti] -= peso_paquete; + + Oferta oferta_des = ofertas.get(oferta_desti); + Oferta oferta_og = ofertas.get(vecPaquetes[ip]); + + if (oferta_des.getPesomax() < vecOfertas[oferta_desti]) return false; + + coste += oferta_des.getPrecio()*peso_paquete; + coste -= oferta_og.getPrecio()*peso_paquete; + + int ofertadesti_tempal = 0; + if(oferta_des.getDias() == 3 || oferta_des.getDias() == 4) ofertadesti_tempal = 1; + else if (oferta_des.getDias() == 5) ofertadesti_tempal = 2; + + int ofertaog_tempal = 0; + if(oferta_og.getDias() == 3 || oferta_og.getDias() == 4) ofertaog_tempal = 1; + else if (oferta_og.getDias() == 5) ofertaog_tempal = 2; + + //precio guardar en almacen + coste -= ofertaog_tempal* 0.25 * peso_paquete; + coste += ofertadesti_tempal* 0.25 * peso_paquete; + + if(p.getPrioridad() == Paquete.PR1) { + if(oferta_des.getDias() > 1) return false; + } + else if(p.getPrioridad() == Paquete.PR2) { + if(oferta_des.getDias() > 3) return false; + } + + int antelacion_original = 0; + if(p.getPrioridad() == Paquete.PR2) { + if(oferta_og.getDias() == 1) antelacion_original = 1; + } + else if(p.getPrioridad() == Paquete.PR3) { + if(oferta_og.getDias() == 1) antelacion_original = 2; + if(oferta_og.getDias() == 2 || oferta_og.getDias() == 3) antelacion_original = 1; + } + + felicidad -= antelacion_original; + + int nueva_antelacion = 0; + + if(p.getPrioridad() == Paquete.PR2) { + if(oferta_des.getDias() == 1) nueva_antelacion = 1; + } + else if(p.getPrioridad() == Paquete.PR3) { + if(oferta_des.getDias() == 1) nueva_antelacion = 2; + if(oferta_des.getDias() == 2 || oferta_des.getDias() == 3) nueva_antelacion = 1; + } + + felicidad += nueva_antelacion; + + vecPaquetes[ip] = oferta_desti; + + return true; + + } + + public boolean swap(int paquete_1, int paquete_2, Paquetes paquetes, Transporte ofertas) { + int ofertap1 = vecPaquetes[paquete_1]; + int ofertap2 = vecPaquetes[paquete_2]; + + double peso_paquete1 = paquetes.get(paquete_1).getPeso(); + double peso_paquete2 = paquetes.get(paquete_2).getPeso(); + + vecOfertas[ofertap1] += peso_paquete1 - peso_paquete2; + vecOfertas[ofertap2] -= peso_paquete1 - peso_paquete2; + + Oferta oferta1 = ofertas.get(ofertap1); + Oferta oferta2 = ofertas.get(ofertap2); + + if (oferta1.getPesomax() < vecOfertas[ofertap1]) return false; + if (oferta2.getPesomax() < vecOfertas[ofertap2]) return false; + + //Calculamos los costes segun el precio de la oferta + coste -= oferta1.getPrecio()*peso_paquete1 + oferta2.getPrecio()*peso_paquete2; + coste += oferta1.getPrecio()*peso_paquete2 + oferta2.getPrecio()*peso_paquete1; + + int dias2 = oferta2.getDias(); + int dias1 = oferta1.getDias(); + + Paquete paquete1 = paquetes.get(paquete_1); + Paquete paquete2 = paquetes.get(paquete_2); + + + //comprobamos is la nueva asignacion cumple la demanda de dias + if(paquete1.getPrioridad() == Paquete.PR1) { + if(oferta2.getDias() != 1) return false; + } + else if(paquete1.getPrioridad() == Paquete.PR2) { + if(oferta2.getDias() > 3) return false; + } + + if(paquete2.getPrioridad() == Paquete.PR1) { + if(oferta1.getDias() != 1) return false; + } + else if(paquete2.getPrioridad() == Paquete.PR2) { + if(oferta1.getDias() > 3) return false; + } + + //calcular con que antelacion iban a llegar los paquetes en la distribucion original + + int antelacion_original1 = 0; + int antelacion_original2 = 0; + + if(paquete1.getPrioridad() == Paquete.PR2) { + if(oferta1.getDias() == 1) antelacion_original1 = 1; + } + else if(paquete1.getPrioridad() == Paquete.PR3) { + if(oferta1.getDias() == 1) antelacion_original1 = 2; + if(oferta1.getDias() == 2 || oferta1.getDias() == 3) antelacion_original1 = 1; + } + + if(paquete2.getPrioridad() == Paquete.PR2) { + if(oferta2.getDias() == 1) antelacion_original2 = 1; + } + else if(paquete2.getPrioridad() == Paquete.PR3) { + if(oferta2.getDias() == 1) antelacion_original2 = 2; + if(oferta2.getDias() == 2 || oferta2.getDias() == 3) antelacion_original2 = 1; + } + + felicidad -= antelacion_original2 + antelacion_original1; + + //calculamos la nueva antelacion con la que llegaran los paquetes segun las asignaciones hechas + + int antelacion_postcambio1 = 0; + int antelacion_postcambio2 = 0; + + if(paquete1.getPrioridad() == Paquete.PR2) { + if(oferta2.getDias() == 1) antelacion_postcambio1 = 1; + } + else if(paquete1.getPrioridad() == Paquete.PR3) { + if(oferta2.getDias() == 1) antelacion_postcambio1 = 2; + if(oferta2.getDias() == 2 || oferta2.getDias() == 3) antelacion_postcambio1 = 1; + } + + + if(paquete2.getPrioridad() == Paquete.PR2) { + if(oferta1.getDias() == 1) antelacion_postcambio2 = 1; + } + else if(paquete2.getPrioridad() == Paquete.PR3) { + if(oferta1.getDias() == 1) antelacion_postcambio2 = 2; + if(oferta1.getDias() == 2 || oferta2.getDias() == 3) antelacion_postcambio2 = 1; + } + + felicidad += antelacion_postcambio1 + antelacion_postcambio2; + + //Calculamos los costes segun el cambio de tiempo que están en almacenaje + int oferta1_tempal = 0; + if(oferta1.getDias() == 3 || oferta1.getDias() == 4) oferta1_tempal = 1; + else if (oferta1.getDias() == 5) oferta1_tempal = 2; + + int oferta2_tempal = 0; + if(oferta2.getDias() == 3 || oferta2.getDias() == 4) oferta2_tempal = 1; + else if (oferta2.getDias() == 5) oferta2_tempal = 2; + + /*Aquests valors assignats a oferta1_tempal i oferta2_tempal es basen en el contingut del pdf + El pdf dice que si una oferta es de 3 a 4 dias, se llevan el paquete en un dia + si es de 5 dias se lleva el paquete en dos dias + si es de 1 a 2 dias, se llevan el paquete ese mismo dia, por lo tanto no lo incluyo en el coste? + */ + + coste -= oferta1_tempal*0.25 * peso_paquete1 + oferta2_tempal*0.25 * peso_paquete2; + coste += oferta1_tempal*0.25 * peso_paquete2 + oferta2_tempal*0.25 * peso_paquete1; + + vecPaquetes[paquete_1] = ofertap2; + vecPaquetes[paquete_2] = ofertap1; + return true; + } + + + public void imprimir(Paquetes paquetes, Transporte transporte) { for (int i = 0; i < vecOfertas.length; ++i) { System.out.println("Oferta: " + i + " peso libre " + vecOfertas[i]); From 44a479eb9a24cac1917415ffe48bd6781f8c7373 Mon Sep 17 00:00:00 2001 From: "verenisse.famara.caceres" Date: Sun, 13 Oct 2024 17:10:33 +0200 Subject: [PATCH 04/16] Imprimir TABLA --- src/com/lluc/practicaIA1/Estado.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/com/lluc/practicaIA1/Estado.java b/src/com/lluc/practicaIA1/Estado.java index f2af5de..5546803 100644 --- a/src/com/lluc/practicaIA1/Estado.java +++ b/src/com/lluc/practicaIA1/Estado.java @@ -243,8 +243,25 @@ else if(paquete2.getPrioridad() == Paquete.PR3) { return true; } - + //IMPRIMIR COMO TABLA + public void imprimir_tabla(Paquetes paquetes, Transporte transporte) { + for (int i = 0; i < vecOfertas.length; ++i) { + double peso_acumulado = 0.00; + System.out.println("---------------------------------------------------------------------------------------------------------"); + System.out.print("| Oferta: " + i + ", Peso_acumulado(" + peso_acumulado + "kg) |"); + //System.out.println(transporte.get(i).toString()); + for (int j = 0; j < vecPaquetes.length; ++j) { + if (vecPaquetes[j] == i) { + peso_acumulado += paquetes.get(j).getPeso(); + System.out.print(" Paquete: " + j + "Peso(" + paquetes.get(j).getPeso() + "kg), Peso_acumulado(" + peso_acumulado + "kg) |"); + //System.out.println(paquetes.get(j).toString()); + } + } + System.out.print(" Peso libre " + vecOfertas[i] + "kg |"); + } + } + //IMPRIMIR ORIGINAL public void imprimir(Paquetes paquetes, Transporte transporte) { for (int i = 0; i < vecOfertas.length; ++i) { System.out.println("Oferta: " + i + " peso libre " + vecOfertas[i]); From 79117b8a5c1749f9cba70a62c801cfe1e50b76a9 Mon Sep 17 00:00:00 2001 From: "lluc.santamaria" Date: Sun, 13 Oct 2024 17:33:30 +0200 Subject: [PATCH 05/16] modificacion tonta --- fichero_tonto.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fichero_tonto.txt b/fichero_tonto.txt index a19abfe..26b670c 100644 --- a/fichero_tonto.txt +++ b/fichero_tonto.txt @@ -1 +1 @@ -Hola +Adeu \ No newline at end of file From b59fa7c89ceacdf9f8cd6194f85c49d705933fa5 Mon Sep 17 00:00:00 2001 From: pacopua <113210040+pacopua@users.noreply.github.com> Date: Sun, 13 Oct 2024 18:04:41 +0200 Subject: [PATCH 06/16] Added class GoalTest.java --- src/com/lluc/practicaIA1/GoalTest.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/com/lluc/practicaIA1/GoalTest.java diff --git a/src/com/lluc/practicaIA1/GoalTest.java b/src/com/lluc/practicaIA1/GoalTest.java new file mode 100644 index 0000000..62c8359 --- /dev/null +++ b/src/com/lluc/practicaIA1/GoalTest.java @@ -0,0 +1,7 @@ +public class GoalTest{ + + public boolean isGoalState(Object state){ + + return false; + } +} \ No newline at end of file From 36662bf25da90ff2d440b6511f74c97ea020ea22 Mon Sep 17 00:00:00 2001 From: "lluc.santamaria" Date: Sun, 13 Oct 2024 18:09:00 +0200 Subject: [PATCH 07/16] Main completo --- src/com/lluc/practicaIA1/Main.java | 62 ++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/src/com/lluc/practicaIA1/Main.java b/src/com/lluc/practicaIA1/Main.java index 4cbb857..e607151 100644 --- a/src/com/lluc/practicaIA1/Main.java +++ b/src/com/lluc/practicaIA1/Main.java @@ -4,9 +4,11 @@ import IA.Azamon.Paquetes; import IA.Azamon.Transporte; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; +import java.util.*; + +import aima.search.framework.*; +import aima.search.informed.HillClimbingSearch; +import aima.search.informed.SimulatedAnnealingSearch; public class Main { public static void main(String[] args) { @@ -24,5 +26,59 @@ public int compare(Paquete p1, Paquete p2) { } }); Estado inicial = new Estado(paquetes, transporte); + azamonHillClimbingSearch(inicial); + azamonSimulatedAnnealingSearch(inicial); + } + + private static void azamonHillClimbingSearch(Estado estado) { + System.out.println("\nAzamon HillClimbing -->"); + try { + SuccessorFunction successorFunction = new SuccessorFunction(); + GoalTest goalTest = new GoalTest(); + HeuristicFunction1 heuristicFunction1 = new HeuristicFunction1(); + Problem problem = new Problem(estado, successorFunction, goalTest, heuristicFunction1); + Search search = new HillClimbingSearch(); + SearchAgent agent = new SearchAgent(problem,search); + + System.out.println(); + printActions(agent.getActions()); + printInstrumentation(agent.getInstrumentation()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void azamonSimulatedAnnealingSearch(Estado estado) { + try { + SuccessorFunctionSA successorFunction = new SuccessorFunctionSA(); + GoalTest goalTest = new GoalTest(); + HeuristicFunction1 heuristicFunction1 = new HeuristicFunction1(); + Problem problem = new Problem(estado, successorFunction, goalTest, heuristicFunction1); + Search search = new SimulatedAnnealingSearch(2000,100,5,0.001); + SearchAgent agent = new SearchAgent(problem, search); + + System.out.println(); + printActions(agent.getActions()); + printInstrumentation(agent.getInstrumentation()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + 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); + } + + } + + private static void printActions(List actions) { + for (int i = 0; i < actions.size(); i++) { + String action = (String) actions.get(i); + System.out.println(action); + } } } From 7c8529d65e5ef3662ddd4fa108349144fd7e2891 Mon Sep 17 00:00:00 2001 From: "lluc.santamaria" Date: Sun, 13 Oct 2024 18:15:45 +0200 Subject: [PATCH 08/16] Main completo --- src/com/lluc/practicaIA1/Main.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/lluc/practicaIA1/Main.java b/src/com/lluc/practicaIA1/Main.java index e607151..785daa2 100644 --- a/src/com/lluc/practicaIA1/Main.java +++ b/src/com/lluc/practicaIA1/Main.java @@ -26,6 +26,7 @@ public int compare(Paquete p1, Paquete p2) { } }); Estado inicial = new Estado(paquetes, transporte); + // Seleccionar uno azamonHillClimbingSearch(inicial); azamonSimulatedAnnealingSearch(inicial); } From cc4e76875a6dda0d1ba567dc1d0661d0a144b99f Mon Sep 17 00:00:00 2001 From: "lluc.santamaria" Date: Sun, 13 Oct 2024 18:26:46 +0200 Subject: [PATCH 09/16] Cambio nombres --- src/com/lluc/practicaIA1/GoalTest.java | 2 ++ src/com/lluc/practicaIA1/Main.java | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/com/lluc/practicaIA1/GoalTest.java b/src/com/lluc/practicaIA1/GoalTest.java index 62c8359..e9c5639 100644 --- a/src/com/lluc/practicaIA1/GoalTest.java +++ b/src/com/lluc/practicaIA1/GoalTest.java @@ -1,3 +1,5 @@ +package com.lluc.practicaIA1; + public class GoalTest{ public boolean isGoalState(Object state){ diff --git a/src/com/lluc/practicaIA1/Main.java b/src/com/lluc/practicaIA1/Main.java index 785daa2..f75828b 100644 --- a/src/com/lluc/practicaIA1/Main.java +++ b/src/com/lluc/practicaIA1/Main.java @@ -34,9 +34,9 @@ public int compare(Paquete p1, Paquete p2) { private static void azamonHillClimbingSearch(Estado estado) { System.out.println("\nAzamon HillClimbing -->"); try { - SuccessorFunction successorFunction = new SuccessorFunction(); - GoalTest goalTest = new GoalTest(); - HeuristicFunction1 heuristicFunction1 = new HeuristicFunction1(); + AzamonSuccessorFunction successorFunction = new AzamonSuccessorFunction(); + AzamonGoalTest goalTest = new AzamonGoalTest(); + AzamonHeuristicFunction1 heuristicFunction1 = new AzamonHeuristicFunction1(); Problem problem = new Problem(estado, successorFunction, goalTest, heuristicFunction1); Search search = new HillClimbingSearch(); SearchAgent agent = new SearchAgent(problem,search); @@ -51,9 +51,9 @@ private static void azamonHillClimbingSearch(Estado estado) { private static void azamonSimulatedAnnealingSearch(Estado estado) { try { - SuccessorFunctionSA successorFunction = new SuccessorFunctionSA(); - GoalTest goalTest = new GoalTest(); - HeuristicFunction1 heuristicFunction1 = new HeuristicFunction1(); + AzamonSuccessorFunctionSA successorFunction = new AzamonSuccessorFunctionSA(); + AzamonGoalTest goalTest = new AzamonGoalTest(); + AzamonHeuristicFunction1 heuristicFunction1 = new AzamonHeuristicFunction1(); Problem problem = new Problem(estado, successorFunction, goalTest, heuristicFunction1); Search search = new SimulatedAnnealingSearch(2000,100,5,0.001); SearchAgent agent = new SearchAgent(problem, search); From 8629360fbd03e8b8b7ac8c42a87a3dd3f6b1091f Mon Sep 17 00:00:00 2001 From: "lluc.santamaria" Date: Sun, 13 Oct 2024 18:28:32 +0200 Subject: [PATCH 10/16] Cambio nombres --- src/com/lluc/practicaIA1/Estado.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/lluc/practicaIA1/Estado.java b/src/com/lluc/practicaIA1/Estado.java index f6ac93c..00c024b 100644 --- a/src/com/lluc/practicaIA1/Estado.java +++ b/src/com/lluc/practicaIA1/Estado.java @@ -62,7 +62,7 @@ public double heuristicoCoste() { return -coste; } - public double heuristicoCoseFelicidad() { + public double heuristicoCosteFelicidad() { return felicidad - coste; } From 48eebc0967845e492f820287f0d175f00490ab91 Mon Sep 17 00:00:00 2001 From: "verenisse.famara.caceres" Date: Sun, 13 Oct 2024 18:54:51 +0200 Subject: [PATCH 11/16] Successor Functions --- .../practicaIA1/AzamonSuccessorFunction.java | 26 +++++++++++ .../AzamonSuccessorFunctionSA.java | 43 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/com/lluc/practicaIA1/AzamonSuccessorFunction.java create mode 100644 src/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.java diff --git a/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java b/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java new file mode 100644 index 0000000..e50eec9 --- /dev/null +++ b/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java @@ -0,0 +1,26 @@ +package com.lluc.practicaIA1; +import IA.Azamon.Paquetes; +import IA.Azamon.Transporte; +import IA.probTSP.ProbTSPBoard; +import aima.search.framework.Successor; + +import java.util.*; + +public class AzamonSuccessorFunction /*implements SuccessorFunction*/ { + public List getSuccessors(Paquetes paquetes, Transporte transporte) { + ArrayList retVal = new ArrayList(); + + for (int i = 0; i < paquetes.size(); i++) { + for (int j = i + 1; j < paquetes.size(); j++) { + Estado newState = new Estado(paquetes, transporte); + + if(newState.swap(i, j, paquetes, transporte)){ + String S = ("INTERCAMBIO " + " " + i + " " + j + " " + newState.toString()); + retVal.add(new Successor(S, newState)); + } + } + } + + return retVal; + } +} diff --git a/src/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.java b/src/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.java new file mode 100644 index 0000000..778e0e8 --- /dev/null +++ b/src/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.java @@ -0,0 +1,43 @@ +package com.lluc.practicaIA1; + +import IA.Azamon.Paquetes; +import IA.Azamon.Transporte; +import IA.probTSP.ProbTSPBoard; +import IA.probTSP.ProbTSPHeuristicFunction; +import aima.search.framework.Successor; +import aima.search.framework.SuccessorFunction; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class AzamonSuccessorFunctionSA /*implements SuccessorFunction*/ { + public List getSuccessors(int npaq, Paquetes paquetes, Transporte transporte) { + ArrayList retVal = new ArrayList(); + //ProbTSPHeuristicFunction TSPHF = new ProbTSPHeuristicFunction(); + Random myRandom=new Random(); + int i,j; + + // Nos ahorramos generar todos los sucesores escogiendo un par de paquetes al azar + + i=myRandom.nextInt(npaq); + + do{ + j=myRandom.nextInt(npaq); + } while (i==j); + + + //ProbTSPBoard newBoard = new ProbTSPBoard(board.getNCities(), board.getPath(), board.getDists()); + Estado newState = new Estado(paquetes, transporte); + + if(newState.swap(i, j, paquetes, transporte)) { + + //double v = TSPHF.getHeuristicValue(newBoard); + String S = ("INTERCAMBIO " + " " + i + " " + j + " " + newState.toString()); + + retVal.add(new Successor(S, newState)); + } + + return retVal; + } +} From f4482596c241fd449fcf6226c13ea53a90e0fb03 Mon Sep 17 00:00:00 2001 From: Adria Cebrian Ruiz Date: Wed, 16 Oct 2024 17:34:04 +0200 Subject: [PATCH 12/16] Asignacion de subclases --- practicaIA1.iml | 3 +- .../{GoalTest.java => AzamonGoalTest.java} | 4 +- .../practicaIA1/AzamonHeuristicFunction1.java | 11 ++++ .../practicaIA1/AzamonHeuristicFunction2.java | 11 ++++ .../practicaIA1/AzamonSuccessorFunction.java | 22 +++++-- .../AzamonSuccessorFunctionSA.java | 4 +- src/com/lluc/practicaIA1/Estado.java | 60 ++++++++++++++----- src/com/lluc/practicaIA1/Main.java | 6 +- 8 files changed, 93 insertions(+), 28 deletions(-) rename src/com/lluc/practicaIA1/{GoalTest.java => AzamonGoalTest.java} (54%) create mode 100644 src/com/lluc/practicaIA1/AzamonHeuristicFunction1.java create mode 100644 src/com/lluc/practicaIA1/AzamonHeuristicFunction2.java diff --git a/practicaIA1.iml b/practicaIA1.iml index 35a07c1..3a747d0 100644 --- a/practicaIA1.iml +++ b/practicaIA1.iml @@ -7,7 +7,6 @@ - - + \ No newline at end of file diff --git a/src/com/lluc/practicaIA1/GoalTest.java b/src/com/lluc/practicaIA1/AzamonGoalTest.java similarity index 54% rename from src/com/lluc/practicaIA1/GoalTest.java rename to src/com/lluc/practicaIA1/AzamonGoalTest.java index e9c5639..729e894 100644 --- a/src/com/lluc/practicaIA1/GoalTest.java +++ b/src/com/lluc/practicaIA1/AzamonGoalTest.java @@ -1,6 +1,8 @@ package com.lluc.practicaIA1; -public class GoalTest{ +import aima.search.framework.GoalTest; + +public class AzamonGoalTest implements GoalTest { public boolean isGoalState(Object state){ diff --git a/src/com/lluc/practicaIA1/AzamonHeuristicFunction1.java b/src/com/lluc/practicaIA1/AzamonHeuristicFunction1.java new file mode 100644 index 0000000..7187a65 --- /dev/null +++ b/src/com/lluc/practicaIA1/AzamonHeuristicFunction1.java @@ -0,0 +1,11 @@ +package com.lluc.practicaIA1; + +import aima.search.framework.HeuristicFunction; + +public class AzamonHeuristicFunction1 implements HeuristicFunction{ + public double getHeuristicValue(Object o) { + Estado estado = (Estado) o; + return estado.heuristicoCoste(); + //return estado.heuristicoCosteFelicidad(); + } +} diff --git a/src/com/lluc/practicaIA1/AzamonHeuristicFunction2.java b/src/com/lluc/practicaIA1/AzamonHeuristicFunction2.java new file mode 100644 index 0000000..efc3620 --- /dev/null +++ b/src/com/lluc/practicaIA1/AzamonHeuristicFunction2.java @@ -0,0 +1,11 @@ +package com.lluc.practicaIA1; + +import aima.search.framework.HeuristicFunction; + +public class AzamonHeuristicFunction2 implements HeuristicFunction{ + public double getHeuristicValue(Object o) { + Estado estado = (Estado) o; + //return estado.heuristicoCoste(); + return estado.heuristicoCosteFelicidad(); + } +} \ No newline at end of file diff --git a/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java b/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java index e50eec9..6dd8eec 100644 --- a/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java +++ b/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java @@ -3,23 +3,35 @@ import IA.Azamon.Transporte; import IA.probTSP.ProbTSPBoard; import aima.search.framework.Successor; +import aima.search.framework.SuccessorFunction; import java.util.*; -public class AzamonSuccessorFunction /*implements SuccessorFunction*/ { - public List getSuccessors(Paquetes paquetes, Transporte transporte) { +public class AzamonSuccessorFunction implements SuccessorFunction { + public List getSuccessors(Object a) { ArrayList retVal = new ArrayList(); - + Estado estado_actual = (Estado) a; + Paquetes paquetes = estado_actual.get_paquetes(); + Transporte transporte = estado_actual.get_transporte(); for (int i = 0; i < paquetes.size(); i++) { for (int j = i + 1; j < paquetes.size(); j++) { - Estado newState = new Estado(paquetes, transporte); + Estado newState = new Estado(estado_actual); - if(newState.swap(i, j, paquetes, transporte)){ + if(newState.swap(i, j)){ String S = ("INTERCAMBIO " + " " + i + " " + j + " " + newState.toString()); retVal.add(new Successor(S, newState)); } } } + for (int i = 0; i < paquetes.size(); ++i) { + for (int j = 0; j < transporte.size(); ++j) { + Estado newState = new Estado(estado_actual); + if(newState.moure_paquete(i, j)) { + String S = "MOVIDO paquete: " + i + " a la oferta " + j; + retVal.add(new Successor(S, newState)); + } + } + } return retVal; } diff --git a/src/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.java b/src/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.java index 778e0e8..fc1518f 100644 --- a/src/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.java +++ b/src/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.java @@ -28,9 +28,9 @@ public List getSuccessors(int npaq, Paquetes paquetes, Transporte transporte) { //ProbTSPBoard newBoard = new ProbTSPBoard(board.getNCities(), board.getPath(), board.getDists()); - Estado newState = new Estado(paquetes, transporte); + Estado newState = new Estado(); - if(newState.swap(i, j, paquetes, transporte)) { + if(newState.swap(i, j)) { //double v = TSPHF.getHeuristicValue(newBoard); String S = ("INTERCAMBIO " + " " + i + " " + j + " " + newState.toString()); diff --git a/src/com/lluc/practicaIA1/Estado.java b/src/com/lluc/practicaIA1/Estado.java index 00c024b..baf0baa 100644 --- a/src/com/lluc/practicaIA1/Estado.java +++ b/src/com/lluc/practicaIA1/Estado.java @@ -10,12 +10,15 @@ public class Estado { - int vecPaquetes[]; - double vecOfertas[]; - double coste = 0; - double felicidad = 0; + public static Paquetes paquetes; + public static Transporte transporte; + public int vecPaquetes[]; + public double vecOfertas[]; + public double coste = 0; + public double felicidad = 0; - Estado(Paquetes paquetes, Transporte transporte) { + Estado() { + //Seguramente esto esta mal, pero hace el apanyo, ya veremos vecPaquetes = new int[paquetes.size()]; vecOfertas = new double[transporte.size()]; @@ -23,11 +26,36 @@ public class Estado { vecOfertas[i] = transporte.get(i).getPesomax(); } - generarSolucion1(paquetes, transporte); - imprimir(paquetes, transporte); + generarSolucion1(); + imprimir(); } - void generarSolucion1(Paquetes paquetes, Transporte transporte) { + Estado(Estado a) { + //Seguramente esto esta mal, pero hace el apanyo, ya veremos + vecPaquetes = new int[paquetes.size()]; + int n_paquetes = paquetes.size(); + for (int i = 0; i < n_paquetes; ++i) { + this.vecPaquetes[i] = a.vecPaquetes[i]; + } + int n_ofertas = transporte.size(); + for(int i = 0; i < n_ofertas; ++i) { + this.vecOfertas[i] = a.vecOfertas[i]; + } + vecOfertas = new double[transporte.size()]; + + for (int i = 0; i < transporte.size(); ++i) { + vecOfertas[i] = transporte.get(i).getPesomax(); + } + + generarSolucion1(); + imprimir(); + } + + public Paquetes get_paquetes() {return paquetes;} + public Transporte get_transporte() {return transporte;} + + + void generarSolucion1() { int iOferta = 0; int iPaquete = 0; Oferta oferta = transporte.get(iOferta); @@ -66,15 +94,15 @@ public double heuristicoCosteFelicidad() { return felicidad - coste; } - public boolean moure_paquete(int ip, int oferta_desti, Paquetes paquetes, Transporte ofertas) { + public boolean moure_paquete(int ip, int oferta_desti) { Paquete p = paquetes.get(ip); double peso_paquete = p.getPeso(); vecOfertas[vecPaquetes[ip]] += peso_paquete; vecOfertas[oferta_desti] -= peso_paquete; - Oferta oferta_des = ofertas.get(oferta_desti); - Oferta oferta_og = ofertas.get(vecPaquetes[ip]); + Oferta oferta_des = transporte.get(oferta_desti); + Oferta oferta_og = transporte.get(vecPaquetes[ip]); if (oferta_des.getPesomax() < vecOfertas[oferta_desti]) return false; @@ -129,7 +157,7 @@ else if(p.getPrioridad() == Paquete.PR3) { } - public boolean swap(int paquete_1, int paquete_2, Paquetes paquetes, Transporte ofertas) { + public boolean swap(int paquete_1, int paquete_2) { int ofertap1 = vecPaquetes[paquete_1]; int ofertap2 = vecPaquetes[paquete_2]; @@ -139,8 +167,8 @@ public boolean swap(int paquete_1, int paquete_2, Paquetes paquetes, Transporte vecOfertas[ofertap1] += peso_paquete1 - peso_paquete2; vecOfertas[ofertap2] -= peso_paquete1 - peso_paquete2; - Oferta oferta1 = ofertas.get(ofertap1); - Oferta oferta2 = ofertas.get(ofertap2); + Oferta oferta1 = transporte.get(ofertap1); + Oferta oferta2 = transporte.get(ofertap2); if (oferta1.getPesomax() < vecOfertas[ofertap1]) return false; if (oferta2.getPesomax() < vecOfertas[ofertap2]) return false; @@ -242,7 +270,7 @@ else if(paquete2.getPrioridad() == Paquete.PR3) { } //IMPRIMIR COMO TABLA - public void imprimir_tabla(Paquetes paquetes, Transporte transporte) { + public void imprimir_tabla() { for (int i = 0; i < vecOfertas.length; ++i) { double peso_acumulado = 0.00; System.out.println("---------------------------------------------------------------------------------------------------------"); @@ -260,7 +288,7 @@ public void imprimir_tabla(Paquetes paquetes, Transporte transporte) { } //IMPRIMIR ORIGINAL - public void imprimir(Paquetes paquetes, Transporte transporte) { + public void imprimir() { for (int i = 0; i < vecOfertas.length; ++i) { System.out.println("Oferta: " + i + " peso libre " + vecOfertas[i]); System.out.println(transporte.get(i).toString()); diff --git a/src/com/lluc/practicaIA1/Main.java b/src/com/lluc/practicaIA1/Main.java index f75828b..c90258e 100644 --- a/src/com/lluc/practicaIA1/Main.java +++ b/src/com/lluc/practicaIA1/Main.java @@ -12,7 +12,6 @@ public class Main { public static void main(String[] args) { - int npaq = 5; int seed = 1; double ratio = 2; @@ -25,7 +24,10 @@ public int compare(Paquete p1, Paquete p2) { return p1.getPrioridad() - p2.getPrioridad(); } }); - Estado inicial = new Estado(paquetes, transporte); + Estado inicial = new Estado(); + Estado.paquetes = paquetes; + Estado.transporte = transporte; + // Seleccionar uno azamonHillClimbingSearch(inicial); azamonSimulatedAnnealingSearch(inicial); From de5c75ba645f665f0bdd7503b9e9b32dc5eb9f5e Mon Sep 17 00:00:00 2001 From: Adria Cebrian Ruiz Date: Wed, 16 Oct 2024 18:45:33 +0200 Subject: [PATCH 13/16] Probando que funciona el heuristico --- .../practicaIA1/AzamonSuccessorFunction.java | 2 +- src/com/lluc/practicaIA1/Estado.java | 29 +++++++++++-------- src/com/lluc/practicaIA1/Main.java | 23 +++++++++------ 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java b/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java index 6dd8eec..c52c189 100644 --- a/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java +++ b/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java @@ -27,7 +27,7 @@ public List getSuccessors(Object a) { for (int j = 0; j < transporte.size(); ++j) { Estado newState = new Estado(estado_actual); if(newState.moure_paquete(i, j)) { - String S = "MOVIDO paquete: " + i + " a la oferta " + j; + String S = "MOVIDO paquete: " + i + " a la oferta " + j + newState.toString(); retVal.add(new Successor(S, newState)); } } diff --git a/src/com/lluc/practicaIA1/Estado.java b/src/com/lluc/practicaIA1/Estado.java index baf0baa..a449100 100644 --- a/src/com/lluc/practicaIA1/Estado.java +++ b/src/com/lluc/practicaIA1/Estado.java @@ -38,17 +38,12 @@ public class Estado { this.vecPaquetes[i] = a.vecPaquetes[i]; } int n_ofertas = transporte.size(); + vecOfertas = new double[n_ofertas]; for(int i = 0; i < n_ofertas; ++i) { this.vecOfertas[i] = a.vecOfertas[i]; } - vecOfertas = new double[transporte.size()]; - - for (int i = 0; i < transporte.size(); ++i) { - vecOfertas[i] = transporte.get(i).getPesomax(); - } - - generarSolucion1(); - imprimir(); + this.coste = a.coste; + this.felicidad = a.felicidad; } public Paquetes get_paquetes() {return paquetes;} @@ -87,17 +82,20 @@ else if (paquete.getPrioridad() == Paquete.PR3 && oferta.getDias() < 4) { } public double heuristicoCoste() { - return -coste; + return +coste; } public double heuristicoCosteFelicidad() { - return felicidad - coste; + return -felicidad + coste; } public boolean moure_paquete(int ip, int oferta_desti) { Paquete p = paquetes.get(ip); double peso_paquete = p.getPeso(); - + + //si intenta moure a la mateixa oferta retorna error + if (vecPaquetes[ip] == oferta_desti) return false; + vecOfertas[vecPaquetes[ip]] += peso_paquete; vecOfertas[oferta_desti] -= peso_paquete; @@ -160,7 +158,10 @@ else if(p.getPrioridad() == Paquete.PR3) { public boolean swap(int paquete_1, int paquete_2) { int ofertap1 = vecPaquetes[paquete_1]; int ofertap2 = vecPaquetes[paquete_2]; - + + //si la asignació d'oferta es la mateixa per els dos paquets no la contemplem + if(ofertap1 == ofertap2) return false; + double peso_paquete1 = paquetes.get(paquete_1).getPeso(); double peso_paquete2 = paquetes.get(paquete_2).getPeso(); @@ -300,4 +301,8 @@ public void imprimir() { } } } + public String toString() { + String s = "coste: " + coste; + return s; + } } diff --git a/src/com/lluc/practicaIA1/Main.java b/src/com/lluc/practicaIA1/Main.java index c90258e..4679c73 100644 --- a/src/com/lluc/practicaIA1/Main.java +++ b/src/com/lluc/practicaIA1/Main.java @@ -12,12 +12,19 @@ public class Main { public static void main(String[] args) { - int npaq = 5; - int seed = 1; - double ratio = 2; + System.out.println("introduce el número de paquetes"); + Scanner scanner = new Scanner(System.in); + int npaq = scanner.nextInt(); + System.out.println("introduce la semilla"); + scanner = new Scanner(System.in); + int seed = scanner.nextInt(); + System.out.println("introduce el ratio"); + scanner = new Scanner(System.in); + double ratio = scanner.nextDouble(); Paquetes paquetes = new Paquetes(npaq, seed); Transporte transporte = new Transporte(paquetes, ratio, seed); - + Estado.paquetes = paquetes; + Estado.transporte = transporte; paquetes.sort(new Comparator() { @Override public int compare(Paquete p1, Paquete p2) { @@ -25,12 +32,10 @@ public int compare(Paquete p1, Paquete p2) { } }); Estado inicial = new Estado(); - Estado.paquetes = paquetes; - Estado.transporte = transporte; // Seleccionar uno azamonHillClimbingSearch(inicial); - azamonSimulatedAnnealingSearch(inicial); + //azamonSimulatedAnnealingSearch(inicial); } private static void azamonHillClimbingSearch(Estado estado) { @@ -50,7 +55,7 @@ private static void azamonHillClimbingSearch(Estado estado) { e.printStackTrace(); } } - + /* private static void azamonSimulatedAnnealingSearch(Estado estado) { try { AzamonSuccessorFunctionSA successorFunction = new AzamonSuccessorFunctionSA(); @@ -67,7 +72,7 @@ private static void azamonSimulatedAnnealingSearch(Estado estado) { e.printStackTrace(); } } - + */ private static void printInstrumentation(Properties properties) { Iterator keys = properties.keySet().iterator(); while (keys.hasNext()) { From dedaf6a2f7c310163490e6a001c7e28deaab1084 Mon Sep 17 00:00:00 2001 From: Adria Cebrian Ruiz Date: Wed, 16 Oct 2024 22:42:24 +0200 Subject: [PATCH 14/16] Continuacion pruebas hill climbing --- .../practicaIA1/AzamonSuccessorFunction.java | 4 +- src/com/lluc/practicaIA1/Estado.java | 47 +++++++++++++++---- src/com/lluc/practicaIA1/Main.java | 12 ++++- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java b/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java index c52c189..f1566ff 100644 --- a/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java +++ b/src/com/lluc/practicaIA1/AzamonSuccessorFunction.java @@ -18,7 +18,7 @@ public List getSuccessors(Object a) { Estado newState = new Estado(estado_actual); if(newState.swap(i, j)){ - String S = ("INTERCAMBIO " + " " + i + " " + j + " " + newState.toString()); + String S = ("INTERCAMBIO " + " " + i + " " + j + " " + newState.toStringSimple()); retVal.add(new Successor(S, newState)); } } @@ -27,7 +27,7 @@ public List getSuccessors(Object a) { for (int j = 0; j < transporte.size(); ++j) { Estado newState = new Estado(estado_actual); if(newState.moure_paquete(i, j)) { - String S = "MOVIDO paquete: " + i + " a la oferta " + j + newState.toString(); + String S = "MOVIDO paquete: " + i + " a la oferta " + j + newState.toStringSimple(); retVal.add(new Successor(S, newState)); } } diff --git a/src/com/lluc/practicaIA1/Estado.java b/src/com/lluc/practicaIA1/Estado.java index a449100..25e6ff3 100644 --- a/src/com/lluc/practicaIA1/Estado.java +++ b/src/com/lluc/practicaIA1/Estado.java @@ -12,6 +12,7 @@ public class Estado { public static Paquetes paquetes; public static Transporte transporte; + public static double pesos_maximos = 0; public int vecPaquetes[]; public double vecOfertas[]; public double coste = 0; @@ -24,7 +25,10 @@ public class Estado { for (int i = 0; i < transporte.size(); ++i) { vecOfertas[i] = transporte.get(i).getPesomax(); - } + pesos_maximos += transporte.get(i).getPesomax(); + } + + generarSolucion1(); imprimir(); @@ -102,7 +106,7 @@ public boolean moure_paquete(int ip, int oferta_desti) { Oferta oferta_des = transporte.get(oferta_desti); Oferta oferta_og = transporte.get(vecPaquetes[ip]); - if (oferta_des.getPesomax() < vecOfertas[oferta_desti]) return false; + if (0 > vecOfertas[oferta_desti]) return false; coste += oferta_des.getPrecio()*peso_paquete; coste -= oferta_og.getPrecio()*peso_paquete; @@ -171,8 +175,8 @@ public boolean swap(int paquete_1, int paquete_2) { Oferta oferta1 = transporte.get(ofertap1); Oferta oferta2 = transporte.get(ofertap2); - if (oferta1.getPesomax() < vecOfertas[ofertap1]) return false; - if (oferta2.getPesomax() < vecOfertas[ofertap2]) return false; + if (0 > vecOfertas[ofertap1]) return false; + if (0 > vecOfertas[ofertap2]) return false; //Calculamos los costes segun el precio de la oferta coste -= oferta1.getPrecio()*peso_paquete1 + oferta2.getPrecio()*peso_paquete2; @@ -275,7 +279,7 @@ public void imprimir_tabla() { for (int i = 0; i < vecOfertas.length; ++i) { double peso_acumulado = 0.00; System.out.println("---------------------------------------------------------------------------------------------------------"); - System.out.print("| Oferta: " + i + ", Peso_acumulado(" + peso_acumulado + "kg) |"); + System.out.print("| Oferta: " + i + " Peso maximo de la oferta: " + transporte.get(i).getPesomax() + ", Peso_acumulado(" + peso_acumulado + "kg) |"); //System.out.println(transporte.get(i).toString()); for (int j = 0; j < vecPaquetes.length; ++j) { if (vecPaquetes[j] == i) { @@ -284,12 +288,15 @@ public void imprimir_tabla() { //System.out.println(paquetes.get(j).toString()); } } - System.out.print(" Peso libre " + vecOfertas[i] + "kg |"); - } + System.out.print("Peso libre " + vecOfertas[i] + "kg |"); + } } //IMPRIMIR ORIGINAL public void imprimir() { + System.out.println("peso maximo: " + pesos_maximos); + System.out.println("coste: " + coste); + for (int i = 0; i < vecOfertas.length; ++i) { System.out.println("Oferta: " + i + " peso libre " + vecOfertas[i]); System.out.println(transporte.get(i).toString()); @@ -302,7 +309,31 @@ public void imprimir() { } } public String toString() { - String s = "coste: " + coste; + //String s = "coste: " + coste; + String s = ""; + double peso_libre = 0; + for (int i = 0; i < vecOfertas.length; ++i) { + double peso_acumulado = 0.00; + s += "--------------------------------------------------------------------------------------------------------- \n"; + s += "| Oferta: " + i + " Peso maximo de la oferta: " + transporte.get(i).getPesomax() + ", Peso_acumulado(" + peso_acumulado + "kg) |"; + //System.out.println(transporte.get(i).toString()); + for (int j = 0; j < vecPaquetes.length; ++j) { + if (vecPaquetes[j] == i) { + peso_acumulado += paquetes.get(j).getPeso(); + s += " Paquete: " + j + "Peso(" + paquetes.get(j).getPeso() + "kg), Peso_acumulado(" + peso_acumulado + "kg) |"; + //System.out.println(paquetes.get(j).toString()); + } + } + s += " Peso libre " + vecOfertas[i] + "kg |"; + peso_libre += vecOfertas[i]; + } + s += "peso_libre_total: " + peso_libre + "\n"; + s += "coste: " + coste + "\n"; return s; } + + public String toStringSimple() { + String s = "Coste: " + coste; + return s; + } } diff --git a/src/com/lluc/practicaIA1/Main.java b/src/com/lluc/practicaIA1/Main.java index 4679c73..49f165e 100644 --- a/src/com/lluc/practicaIA1/Main.java +++ b/src/com/lluc/practicaIA1/Main.java @@ -34,6 +34,7 @@ public int compare(Paquete p1, Paquete p2) { Estado inicial = new Estado(); // Seleccionar uno + inicial.imprimir_tabla(); azamonHillClimbingSearch(inicial); //azamonSimulatedAnnealingSearch(inicial); } @@ -51,6 +52,7 @@ private static void azamonHillClimbingSearch(Estado estado) { System.out.println(); printActions(agent.getActions()); printInstrumentation(agent.getInstrumentation()); + } catch (Exception e) { e.printStackTrace(); } @@ -78,15 +80,23 @@ private static void printInstrumentation(Properties properties) { while (keys.hasNext()) { String key = (String) keys.next(); String property = properties.getProperty(key); - System.out.println(key + " : " + property); + System.out.println(key + " $ " + property); } } private static void printActions(List actions) { + for (int i = 0; i < actions.size(); i++) { String action = (String) actions.get(i); System.out.println(action); } + + /* + int n = actions.size() - 1; + String action = (String) actions.get(n); + System.out.println(action); + */ } + } From a453a153a3b81fc4ffc041664fa951c9abd2d6e6 Mon Sep 17 00:00:00 2001 From: Adria Cebrian Ruiz Date: Wed, 16 Oct 2024 22:42:48 +0200 Subject: [PATCH 15/16] Continuacion pruebas hill climbing --- .idea/.gitignore | 3 + .idea/libraries/llibreries.xml | 11 ++ .idea/misc.xml | 6 + .idea/modules.xml | 8 ++ .idea/uiDesigner.xml | 124 ++++++++++++++++++ .idea/vcs.xml | 6 + .../com/lluc/practicaIA1/AzamonGoalTest.class | Bin 0 -> 482 bytes .../AzamonHeuristicFunction1.class | Bin 0 -> 653 bytes .../AzamonHeuristicFunction2.class | Bin 0 -> 662 bytes .../practicaIA1/AzamonSuccessorFunction.class | Bin 0 -> 2255 bytes .../AzamonSuccessorFunctionSA.class | Bin 0 -> 1753 bytes .../com/lluc/practicaIA1/Estado.class | Bin 0 -> 7866 bytes .../com/lluc/practicaIA1/Main$1.class | Bin 0 -> 888 bytes .../com/lluc/practicaIA1/Main.class | Bin 0 -> 4408 bytes 14 files changed, 158 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/libraries/llibreries.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 out/production/practicaIA1/com/lluc/practicaIA1/AzamonGoalTest.class create mode 100644 out/production/practicaIA1/com/lluc/practicaIA1/AzamonHeuristicFunction1.class create mode 100644 out/production/practicaIA1/com/lluc/practicaIA1/AzamonHeuristicFunction2.class create mode 100644 out/production/practicaIA1/com/lluc/practicaIA1/AzamonSuccessorFunction.class create mode 100644 out/production/practicaIA1/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.class create mode 100644 out/production/practicaIA1/com/lluc/practicaIA1/Estado.class create mode 100644 out/production/practicaIA1/com/lluc/practicaIA1/Main$1.class create mode 100644 out/production/practicaIA1/com/lluc/practicaIA1/Main.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/libraries/llibreries.xml b/.idea/libraries/llibreries.xml new file mode 100644 index 0000000..f47f9e9 --- /dev/null +++ b/.idea/libraries/llibreries.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e0844bc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..2fb5ee2 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/out/production/practicaIA1/com/lluc/practicaIA1/AzamonGoalTest.class b/out/production/practicaIA1/com/lluc/practicaIA1/AzamonGoalTest.class new file mode 100644 index 0000000000000000000000000000000000000000..afcb99b2eac698d39df82b0a67853d4271a91b71 GIT binary patch literal 482 zcma)2Jxc>Y6r8<$ocYjbVp0ksLSo@!qeVmrf+8GRB&4u=Sy!|1?pE$D3jQV=E5X7a z;ExjDCJ|8^o0*+AJ8$2<_m9^%00(H5kwe`_!^gUhra z#QJ<1jdU`gQOK2gU=@W!N{rKsVm=$2RA4($Hj-gDRq`$&l^I26y*=4`q{zmnmcoHf zv#vnJq)zoS%D7{*9Zcw+WJvLiyckWi%DSCPfkHa>>wj&5a^Fr9rB95TsqyoLUDvLP z0*V4#|CmT%_4fb*8)PDqsis7Y<#j@lez3`{{Q3np;qeA}QM^u%nO|e{SxIKWT-bSm zc%IoyjLzmFN{rRTxr_=c!Frj|h4+~~W-s^T5Z}qtEZLg7m?zzh71TJxf0*50`vk8_ BXMF$w literal 0 HcmV?d00001 diff --git a/out/production/practicaIA1/com/lluc/practicaIA1/AzamonHeuristicFunction1.class b/out/production/practicaIA1/com/lluc/practicaIA1/AzamonHeuristicFunction1.class new file mode 100644 index 0000000000000000000000000000000000000000..0867d26fdf8c9fd117aec05132e426bd896f7c1b GIT binary patch literal 653 zcmZ`%TQ37a6#iy=Syo+I>R#c=-K0+*h(uaKvUnhUpKgZ^yF0QM5`Rj(ka!T!ev~-V z;(<1soHOTqv)^|v^YQum24EWt4sw{ZG3CI*w2c`Xvo_`!^1CWj$sR*yWwpVOt?8Cz z7eU!WoUloZM#Ac3Sz0Sif_7|?r`pL5QpCwK^0~Da zu%`~}kj;0K7@~9G`&_^@)pWp9qO5= literal 0 HcmV?d00001 diff --git a/out/production/practicaIA1/com/lluc/practicaIA1/AzamonHeuristicFunction2.class b/out/production/practicaIA1/com/lluc/practicaIA1/AzamonHeuristicFunction2.class new file mode 100644 index 0000000000000000000000000000000000000000..317f169f1ce51aaae71002d128efa2d5c5869aff GIT binary patch literal 662 zcmZ`%OD_aL5dM00*D%&&*ZZ-;$yN<1Qv#OuCq2=-SqiPInk`3yU>|{GMqj zh5=tk>Ld&6Dn1wWfHGy@ND(OzAD||Jj1)!|{3~%Qcp#!nepzqAs%Y==AzLAHk? zPM(o3EIorgwqTEJS38MbIv2mrMf6d`(2oJK_Gh2Sa^$_`H#o;DPslw`xhF!Bk}*PSW= literal 0 HcmV?d00001 diff --git a/out/production/practicaIA1/com/lluc/practicaIA1/AzamonSuccessorFunction.class b/out/production/practicaIA1/com/lluc/practicaIA1/AzamonSuccessorFunction.class new file mode 100644 index 0000000000000000000000000000000000000000..3392fb54222994f3bf396157ded61627939a7ebb GIT binary patch literal 2255 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 Ef1xy~LI3~& literal 0 HcmV?d00001 From 655b1c5ebeb16a1ba95693ffdaa5e828550888bb Mon Sep 17 00:00:00 2001 From: Adria Cebrian Ruiz Date: Wed, 16 Oct 2024 23:30:31 +0200 Subject: [PATCH 16/16] Hill climbing pinta perfecto --- .idea/misc.xml | 2 +- .../com/lluc/practicaIA1/AzamonGoalTest.class | Bin 482 -> 482 bytes .../AzamonHeuristicFunction1.class | Bin 653 -> 653 bytes .../AzamonSuccessorFunctionSA.class | Bin 1753 -> 1753 bytes .../com/lluc/practicaIA1/Estado.class | Bin 7866 -> 8216 bytes .../com/lluc/practicaIA1/Main$1.class | Bin 888 -> 922 bytes .../com/lluc/practicaIA1/Main.class | Bin 4408 -> 4408 bytes .../practicaIA1/AzamonSuccessorFunction.java | 8 +++++-- src/com/lluc/practicaIA1/Estado.java | 22 +++++++++++++----- 9 files changed, 23 insertions(+), 9 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index e0844bc..31e1ebc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/out/production/practicaIA1/com/lluc/practicaIA1/AzamonGoalTest.class b/out/production/practicaIA1/com/lluc/practicaIA1/AzamonGoalTest.class index afcb99b2eac698d39df82b0a67853d4271a91b71..c01779d86edcee2eee9bc4b084c6f4b8022e3713 100644 GIT binary patch delta 216 zcmaFF{D|4+)W2Q(7#J9w8N|34m>8JZ8CZB2SQ*$D83eKt%M$f-67$ma{gbj%lS>#G z*laTMGE3|j8JIOR!`K-(Ccak#YT%lz!KgS<{jdasA_F_n3`Pb{pn)J7XbzC%o}9=i zmdyhc1MwJuqP#$o2g>GS;0N-6)-ecz)B@RNK$;0iGcm6LkwBF&ot$8uVh~vdh)$3S PAqHWf9!3TcuzFDdWO5eT delta 216 zcmaFF{D@io)W2Q(7#JAL8N|34m>GoF8HCvxMA#Wb85!7YGV?M^>=+rCH8jH}wjE~W zVPIuon`omZ%*Y^+l~|UjpOcuEuJ50em6}{KF;!85L6Lz8Xa*w#3(!C&APrOwB-tk? zGKyt$0L4H&2B0V>kmP}~xfr;CJVqd&7o--*HUrX3K$?kp4Txkw=;Q?J6obezKy-ps P@G5cc1_lOa201PUCI)791{NL$Rt7dk27#=^vPAuy#JqHU|D>$c((D8B0FdU=KES~4tFw)Pb3Ks9!~ik@8){79HZwXc66huswh))z|& igD_tLofN$crny@s&S1>Eh+~2jPYLDpT_@~Ioc;s$fFhRw diff --git a/out/production/practicaIA1/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.class b/out/production/practicaIA1/com/lluc/practicaIA1/AzamonSuccessorFunctionSA.class index c332a8ed35a2b281a8d4109306babe17c2b5ceca..8ea61dae38b3ad13c00846daddf869a94979ed44 100644 GIT binary patch delta 756 zcmXw1U31bv6g^8qHpI{tC~8`*lvWGaO0|lLZM7e0qfjVzbnwLq7L{5 zeDD`IV_#sV%=8EN>0))e_RM8a=IeIdU1X3F$wwS2L!?jIbL%_lrDoIG&(|GS0~b0c z{!8?;Wy{`byw;#W5@A5cAch$Duw8rSnl_2c2{UPOgc(M?9ve+)2nlWoQ5`37iU`hI zYnQ>FFwNu>kuY?O5P3n0Yhh~Ptd239^Y*12RUh|0`Qn;}7$!tNlirb(qAAA(9aBhn z-=r8zc|G6U!PBp7o~$l68m{9ut=&S+ec9M@RNP|-o9mmo^2$wRE;V60E<%GgfW*GB+$YU)!!F;3fYHt_gNYZJG z#|LT&3dM^wOVh|`^rt#t2mSOkMUe&uFhf!QOTZ-}gYYaaQ>4vof`l|$t9HRF9R#v+ z7a9RQ>o@$PZEOTHN*@F>JgP+b$KOA@2oWKYRSi|Fv@!f1lL8rP8>bI(2FL~s(uq}! zfT4B}Z{z%9L;g%6cu=90J0^KYIdQ#kIcWDl)j<@4AW`xJmm1 zs3415kP$`+^H`t;MzDrO+MythJGf1VljV!Z delta 780 zcmYLH-A~g{6#w0>?d@s@b1=0-=J;|OItNZs2OjV4B`LUCEHoAzA|tV<9qMoX#=+~VW5CX@|vtxJ=d$*TXSXa zMRnb6S23kw+CUMv{aMzliz0Un%)s)0u-tGf?WXNK&n~QOl%G;1?v!^t%OOclS!s)y z`^Mg4P*RqaezbSk8`Ck1y9^O)ez~|bRhXN!77__2jxVvI%#cj^Pvq`kE8}Q-#s9<- zYDqM)=(owq1jiC>pj55C+@{2aDfgO+UXX=CxMBz5$zz9CC-Q|gZp4#n&wWTYE#*UD9J|40jF@95W^XmL@Ai{L4i)X zwFacseFXAy12PFpUNM!fI@A%h#b-u%RE_eFe||Q=$wA9&rY1CX1V5l(NTybYet;7| zK4?-NW7Q0r+CD;cv^_B8&r~LWPXAcR?uw?KQQ>)-BZe*nMGODh6Vh39H(Opq9Or0W zp-a#P0_3@hUi8t^i(nD`7@z@SbhYOxLM6)tk|fbv#1K+QL&G3NcR)Huj6>p(*>7Z~ f87H3rE|5*aMJy24sp1^&QBNkW5Y`A^rGMlvkg$Ex diff --git a/out/production/practicaIA1/com/lluc/practicaIA1/Estado.class b/out/production/practicaIA1/com/lluc/practicaIA1/Estado.class index 976f788b6b539e05d59009b4874d337f07ad7a9b..6936e39afca3a5ab39e0ebf76c52815ffbad835a 100644 GIT binary patch literal 8216 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 O)X*Sr5tA+Q^!){I!NUyz delta 498 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 q{Y|Z7K!l7sx