From 1a7049687e9e92c057678cae4864ab9009d1069a Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 4 Jun 2013 22:53:09 +0300 Subject: [PATCH 1/3] Implementation of QAP Problem using Simulated Annealing Algorithm --- .../de/mh4j/examples/qap/model/Facility.java | 46 +++++ .../de/mh4j/examples/qap/model/Location.java | 31 +++ .../java/de/mh4j/examples/qap/model/Qap.java | 101 ++++++++++ .../examples/qap/solver/QapCoolingScheme.java | 23 +++ .../solver/SimulatedAnnealingQapSolver.java | 94 +++++++++ .../mh4j/examples/qap/model/FacilityTest.java | 71 +++++++ .../mh4j/examples/qap/model/LocationTest.java | 71 +++++++ .../de/mh4j/examples/qap/model/QapTest.java | 155 +++++++++++++++ .../SimulatedAnnealingQapSolverTest.java | 183 ++++++++++++++++++ 9 files changed, 775 insertions(+) create mode 100755 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Facility.java create mode 100755 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Location.java create mode 100755 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java create mode 100755 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/QapCoolingScheme.java create mode 100755 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolver.java create mode 100755 MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/FacilityTest.java create mode 100755 MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/LocationTest.java create mode 100755 MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/QapTest.java create mode 100755 MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolverTest.java diff --git a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Facility.java b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Facility.java new file mode 100755 index 0000000..36914dc --- /dev/null +++ b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Facility.java @@ -0,0 +1,46 @@ +package de.mh4j.examples.qap.model; + +import java.util.List; +import java.util.ArrayList; + + + + + +public class Facility { + + + public final String name; + + List facilitiesCosts=new ArrayList(); + + List facilitiesNames=new ArrayList(); + + static List facilities=new ArrayList(); + + + + + + public Facility (String name, List costs, List facilities_names){ + + this.name=name; + for (int i=0; i distances=new ArrayList(); + List distancesNames=new ArrayList(); + + static List locations=new ArrayList(); + + public Location (String locationName, List distances, List distancesNames){ + + this.locationName=locationName; + + for (int i=0; i{ + + + public List solution= new ArrayList<>();; + public int costs=0; + + public Qap (List solution) { + + for (int i=0; i(original.solution); + this.costs = original.costs; + } + + + + public void calculateCosts (List solution){ + + costs=0; + + int k=0; + int m; + + for(int i=0; i { + + @Override + protected double getInitialTemperature() { + return 90; + } + + @Override + protected int getInitialEpochLength() { + return 50; + } + + @Override + protected double decreaseTemperature(double currentTemperature) { + return currentTemperature * 0.5; + } + +} diff --git a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolver.java b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolver.java new file mode 100755 index 0000000..f7ac223 --- /dev/null +++ b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolver.java @@ -0,0 +1,94 @@ +package de.mh4j.examples.qap.solver; + + + + + + +import java.util.ArrayList; +import java.util.List; + +import de.mh4j.examples.qap.model.Qap; +import de.mh4j.solver.simulatedAnnealing.AbstractSimulatedAnnealingSolver; +import de.mh4j.solver.termination.StagnationTermination; +import de.mh4j.solver.termination.StepCountTermination; + + +public class SimulatedAnnealingQapSolver extends AbstractSimulatedAnnealingSolver { + + static List locs=new ArrayList(); + + public SimulatedAnnealingQapSolver() { + super(new QapCoolingScheme()); + + + + addTerminationCondition(new StepCountTermination(this, 50)); + addTerminationCondition(new StagnationTermination(this, 5)); + } + + + + + + + @Override + protected Qap createRandomNeighbor() { + + Qap neighbor=new Qap(currentSolution); + + return createNeighborFromSwap(neighbor); + + + + } + + + private Qap createNeighborFromSwap(Qap neighbor) { + + int randomIndex1 = randomizer.nextInt(neighbor.solution.size()-1); + int randomIndex2 = randomizer.nextInt(neighbor.solution.size()-1); + + while (randomIndex1==randomIndex2){ + + randomIndex2 = randomizer.nextInt(neighbor.solution.size()-1); + + } + + String element1=neighbor.solution.get(randomIndex1); + String element2=neighbor.solution.get(randomIndex2); + + neighbor.solution.remove(randomIndex1); + neighbor.solution.add(randomIndex1,element2); + + neighbor.solution.remove(randomIndex2); + + + neighbor.solution.add(randomIndex2,element1); + + log.trace("Created neighbor from SWAP :"); + + for (int i=0; i cost_list1=new ArrayList(); + List cost_list2=new ArrayList(); + List cost_list3=new ArrayList(); + List cost_list4=new ArrayList(); + + cost_list1.add(8); + cost_list1.add(1); + cost_list1.add(5); + + cost_list2.add(8); + cost_list2.add(1); + cost_list2.add(1); + + cost_list3.add(1); + cost_list3.add(1); + cost_list3.add(2); + + cost_list4.add(5); + cost_list4.add(1); + cost_list4.add(2); + + List names1=new ArrayList(); + List names2=new ArrayList(); + List names3=new ArrayList(); + List names4=new ArrayList(); + + names1.add("2"); + names1.add("3"); + names1.add("4"); + + names2.add("1"); + names2.add("3"); + names2.add("4"); + + names3.add("1"); + names3.add("2"); + names3.add("4"); + + names4.add("1"); + names4.add("2"); + names4.add("3"); + + + + + new Facility(facilityName1, cost_list1, names1); + new Facility(facilityName2, cost_list2, names2); + new Facility(facilityName3, cost_list3, names3); + new Facility(facilityName4, cost_list4, names4); + } + +} \ No newline at end of file diff --git a/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/LocationTest.java b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/LocationTest.java new file mode 100755 index 0000000..7846948 --- /dev/null +++ b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/LocationTest.java @@ -0,0 +1,71 @@ +package de.mh4j.examples.qap.model; + +import org.testng.annotations.Test; + + +import java.util.List; + +import java.util.ArrayList; + +public class LocationTest { + + @Test + public void testCreate() { + + String locationName1="A"; + String locationName2="B"; + String locationName3="C"; + String locationName4="D"; + + List distances1=new ArrayList(); + List distances2=new ArrayList(); + List distances3=new ArrayList(); + List distances4=new ArrayList(); + + distances1.add(20); + distances1.add(56); + distances1.add(11); + + distances2.add(20); + distances2.add(40); + distances2.add(25); + + distances3.add(56); + distances3.add(40); + distances3.add(54); + + distances4.add(11); + distances4.add(25); + distances4.add(54); + + List distancesNames1=new ArrayList(); + List distancesNames2=new ArrayList(); + List distancesNames3=new ArrayList(); + List distancesNames4=new ArrayList(); + + distancesNames1.add("B"); + distancesNames1.add("C"); + distancesNames1.add("D"); + + distancesNames2.add("A"); + distancesNames2.add("C"); + distancesNames2.add("D"); + + distancesNames3.add("A"); + distancesNames3.add("B"); + distancesNames3.add("D"); + + distancesNames4.add("A"); + distancesNames4.add("B"); + distancesNames4.add("C"); + + + + + new Location(locationName1, distances1, distancesNames1); + new Location(locationName2, distances2, distancesNames2); + new Location(locationName3, distances3, distancesNames3); + new Location(locationName4, distances4, distancesNames4); + } + +} \ No newline at end of file diff --git a/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/QapTest.java b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/QapTest.java new file mode 100755 index 0000000..ebb8e91 --- /dev/null +++ b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/QapTest.java @@ -0,0 +1,155 @@ +package de.mh4j.examples.qap.model; + +import static org.testng.Assert.assertTrue; + +import org.testng.annotations.Test; + + +import java.util.List; + +import java.util.ArrayList; + +public class QapTest { + + @Test + public void testCreate() { + + String facilityName1="1"; + String facilityName2="2"; + String facilityName3="3"; + String facilityName4="4"; + + List cost_list1=new ArrayList(); + List cost_list2=new ArrayList(); + List cost_list3=new ArrayList(); + List cost_list4=new ArrayList(); + + cost_list1.add(8); + cost_list1.add(1); + cost_list1.add(5); + + cost_list2.add(8); + cost_list2.add(1); + cost_list2.add(1); + + cost_list3.add(1); + cost_list3.add(1); + cost_list3.add(2); + + cost_list4.add(5); + cost_list4.add(1); + cost_list4.add(2); + + List names1=new ArrayList(); + List names2=new ArrayList(); + List names3=new ArrayList(); + List names4=new ArrayList(); + + names1.add("2"); + names1.add("3"); + names1.add("4"); + + names2.add("1"); + names2.add("3"); + names2.add("4"); + + names3.add("1"); + names3.add("2"); + names3.add("4"); + + names4.add("1"); + names4.add("2"); + names4.add("3"); + + + + + new Facility(facilityName1, cost_list1, names1); + new Facility(facilityName2, cost_list2, names2); + new Facility(facilityName3, cost_list3, names3); + new Facility(facilityName4, cost_list4, names4); + + + String locationName1="A"; + String locationName2="B"; + String locationName3="C"; + String locationName4="D"; + + List distances1=new ArrayList(); + List distances2=new ArrayList(); + List distances3=new ArrayList(); + List distances4=new ArrayList(); + + distances1.add(20); + distances1.add(56); + distances1.add(11); + + distances2.add(20); + distances2.add(40); + distances2.add(25); + + distances3.add(56); + distances3.add(40); + distances3.add(54); + + distances4.add(11); + distances4.add(25); + distances4.add(54); + + List distancesNames1=new ArrayList(); + List distancesNames2=new ArrayList(); + List distancesNames3=new ArrayList(); + List distancesNames4=new ArrayList(); + + distancesNames1.add("B"); + distancesNames1.add("C"); + distancesNames1.add("D"); + + distancesNames2.add("A"); + distancesNames2.add("C"); + distancesNames2.add("D"); + + distancesNames3.add("A"); + distancesNames3.add("B"); + distancesNames3.add("D"); + + distancesNames4.add("A"); + distancesNames4.add("B"); + distancesNames4.add("C"); + + + + + new Location(locationName1, distances1, distancesNames1); + new Location(locationName2, distances2, distancesNames2); + new Location(locationName3, distances3, distancesNames3); + new Location(locationName4, distances4, distancesNames4); + + + + + + List locs=new ArrayList(); + + locs.add("1"); + locs.add("2"); + locs.add("4"); + locs.add("3"); + + + + List locs2=new ArrayList(); + locs2.add("2"); + locs2.add("1"); + locs2.add("4"); + locs2.add("3"); + + Qap qap1=new Qap(locs); + Qap qap2=new Qap(locs2); + + assertTrue(qap1.isBetterThan(qap2)); + + + } + +} \ No newline at end of file diff --git a/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolverTest.java b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolverTest.java new file mode 100755 index 0000000..e172a7f --- /dev/null +++ b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolverTest.java @@ -0,0 +1,183 @@ +package de.mh4j.examples.qap.solver; + + + + + + +import java.util.ArrayList; +import java.util.List; + +import org.testng.annotations.Test; + +import ch.qos.logback.classic.Level; + +import de.mh4j.examples.qap.model.Facility; +import de.mh4j.examples.qap.model.Location; + +import de.mh4j.examples.qap.solver.SimulatedAnnealingQapSolver; + + + + +public class SimulatedAnnealingQapSolverTest { + + @Test + public void testSolveSimpleInstance() { + + + String facilityName1="1"; + String facilityName2="2"; + String facilityName3="3"; + String facilityName4="4"; + + List cost_list1=new ArrayList(); + List cost_list2=new ArrayList(); + List cost_list3=new ArrayList(); + List cost_list4=new ArrayList(); + + cost_list1.add(8); + cost_list1.add(1); + cost_list1.add(5); + + cost_list2.add(8); + cost_list2.add(1); + cost_list2.add(1); + + cost_list3.add(1); + cost_list3.add(1); + cost_list3.add(2); + + cost_list4.add(5); + cost_list4.add(1); + cost_list4.add(2); + + List names1=new ArrayList(); + List names2=new ArrayList(); + List names3=new ArrayList(); + List names4=new ArrayList(); + + names1.add("2"); + names1.add("3"); + names1.add("4"); + + names2.add("1"); + names2.add("3"); + names2.add("4"); + + names3.add("1"); + names3.add("2"); + names3.add("4"); + + names4.add("1"); + names4.add("2"); + names4.add("3"); + + + + + new Facility(facilityName1, cost_list1, names1); + new Facility(facilityName2, cost_list2, names2); + new Facility(facilityName3, cost_list3, names3); + new Facility(facilityName4, cost_list4, names4); + + + String locationName1="A"; + String locationName2="B"; + String locationName3="C"; + String locationName4="D"; + + List distances1=new ArrayList(); + List distances2=new ArrayList(); + List distances3=new ArrayList(); + List distances4=new ArrayList(); + + distances1.add(20); + distances1.add(56); + distances1.add(11); + + distances2.add(20); + distances2.add(40); + distances2.add(25); + + distances3.add(56); + distances3.add(40); + distances3.add(54); + + distances4.add(11); + distances4.add(25); + distances4.add(54); + + List distancesNames1=new ArrayList(); + List distancesNames2=new ArrayList(); + List distancesNames3=new ArrayList(); + List distancesNames4=new ArrayList(); + + distancesNames1.add("B"); + distancesNames1.add("C"); + distancesNames1.add("D"); + + distancesNames2.add("A"); + distancesNames2.add("C"); + distancesNames2.add("D"); + + distancesNames3.add("A"); + distancesNames3.add("B"); + distancesNames3.add("D"); + + distancesNames4.add("A"); + distancesNames4.add("B"); + distancesNames4.add("C"); + + + + + new Location(locationName1, distances1, distancesNames1); + new Location(locationName2, distances2, distancesNames2); + new Location(locationName3, distances3, distancesNames3); + new Location(locationName4, distances4, distancesNames4); + + + + + + + + + SimulatedAnnealingQapSolver solver=new SimulatedAnnealingQapSolver(); + + + + + SimulatedAnnealingQapSolver.locs.add("1"); + SimulatedAnnealingQapSolver.locs.add("2"); + SimulatedAnnealingQapSolver.locs.add("4"); + SimulatedAnnealingQapSolver.locs.add("3"); + + solver.createInitialSolution(); + + + solver.setLogLevel(Level.TRACE); + solver.run(); + + + } + + +} + + + + + + + + + + + + + + + + From 844e6619756b39bf0e09a5034f9d64786d4ba3e9 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 5 Jun 2013 00:54:19 +0300 Subject: [PATCH 2/3] Implementation of QAP Problem with the use of Simulated Annealing Algorithm --- .../java/de/mh4j/examples/qap/model/Qap.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) mode change 100755 => 100644 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java diff --git a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java old mode 100755 new mode 100644 index ccaab6d..bd47918 --- a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java +++ b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java @@ -11,13 +11,10 @@ /** * - * - * - * - * - * - * - * + * The quadratic assignment problem (QAP) is one of fundamental + * combinatorial optimization problems in the branch of optimization + * or operations research in mathematics, from the category of + * the facilities-location problems. * * * **/ @@ -47,7 +44,21 @@ public Qap(Qap original) { this.costs = original.costs; } - + /** + * This method #calculateCosts calculates this mathematical expression + * __n__ __n__ + * \ \ + * \ \ Fij*Dp(i)p(j) for minimizing or maximizing the costs + * / / where F are the facilities' flows and D the + * /____ /____ the distances + * i=1 j=1 + * + * + * for example in case of 3 facilities(1,2,3) and 3 locations(A,B,C) this method would calculate: + * f12*dAB+f13*dÁÃ+f21*dBA+f23*dBÃ+ f31*dÃÁ+f32*dÃÂ + * + * + * */ public void calculateCosts (List solution){ From 572c67285c38bcfc6c3e3848565082d51d939631 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 8 Nov 2013 11:50:09 +0200 Subject: [PATCH 3/3] Initial Commit --- .../de/mh4j/examples/qap/model/Facility.java | 50 ++-- .../de/mh4j/examples/qap/model/Location.java | 48 ++-- .../java/de/mh4j/examples/qap/model/Qap.java | 157 +++++----- .../examples/qap/solver/QapCoolingScheme.java | 24 +- .../solver/SimulatedAnnealingQapSolver.java | 139 ++++----- .../mh4j/examples/qap/model/FacilityTest.java | 116 ++++---- .../mh4j/examples/qap/model/LocationTest.java | 116 ++++---- .../de/mh4j/examples/qap/model/QapTest.java | 269 +++++++++--------- .../SimulatedAnnealingQapSolverTest.java | 267 ++++++++--------- 9 files changed, 538 insertions(+), 648 deletions(-) mode change 100755 => 100644 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Facility.java mode change 100755 => 100644 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Location.java mode change 100755 => 100644 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/QapCoolingScheme.java mode change 100755 => 100644 MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolver.java mode change 100755 => 100644 MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/FacilityTest.java mode change 100755 => 100644 MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/LocationTest.java mode change 100755 => 100644 MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/QapTest.java mode change 100755 => 100644 MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolverTest.java diff --git a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Facility.java b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Facility.java old mode 100755 new mode 100644 index 36914dc..bd93471 --- a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Facility.java +++ b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Facility.java @@ -3,44 +3,30 @@ import java.util.List; import java.util.ArrayList; +public class Facility { + public final String name; + List facilitiesCosts = new ArrayList(); + List facilitiesNames = new ArrayList(); -public class Facility { - + static List facilities = new ArrayList(); + + public Facility(String name, List costs, + List facilities_names) { + + this.name = name; + for (int i = 0; i < costs.size(); i++) { - public final String name; - - List facilitiesCosts=new ArrayList(); - - List facilitiesNames=new ArrayList(); - - static List facilities=new ArrayList(); - - - - - - public Facility (String name, List costs, List facilities_names){ - - this.name=name; - for (int i=0; i distances=new ArrayList(); - List distancesNames=new ArrayList(); - - static List locations=new ArrayList(); - - public Location (String locationName, List distances, List distancesNames){ - - this.locationName=locationName; - - for (int i=0; i distances = new ArrayList(); + List distancesNames = new ArrayList(); + + static List locations = new ArrayList(); + + public Location(String locationName, List distances, + List distancesNames) { + + this.locationName = locationName; + + for (int i = 0; i < distances.size(); i++) { + + this.distances.add(distances.get(i)); + + this.distancesNames.add(distancesNames.get(i)); + } - + + locations.add(this); + } + } diff --git a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java index bd47918..9128335 100644 --- a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java +++ b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/model/Qap.java @@ -1,112 +1,105 @@ - - package de.mh4j.examples.qap.model; import java.util.ArrayList; import java.util.List; - import de.mh4j.solver.Solution; - -/** +/** + * + * The quadratic assignment problem (QAP) is one of fundamental combinatorial + * optimization problems in the branch of optimization or operations research in + * mathematics, from the category of the facilities-location problems. * - * The quadratic assignment problem (QAP) is one of fundamental - * combinatorial optimization problems in the branch of optimization - * or operations research in mathematics, from the category of - * the facilities-location problems. * - * * **/ +public class Qap implements Solution { + + public List solution = new ArrayList<>();; + public int costs = 0; + + public Qap(List solution) { + + for (int i = 0; i < solution.size(); i++) { -public class Qap implements Solution{ - - - public List solution= new ArrayList<>();; - public int costs=0; - - public Qap (List solution) { - - for (int i=0; i(original.solution); - this.costs = original.costs; - } - - /** - * This method #calculateCosts calculates this mathematical expression - * __n__ __n__ - * \ \ - * \ \ Fij*Dp(i)p(j) for minimizing or maximizing the costs - * / / where F are the facilities' flows and D the - * /____ /____ the distances - * i=1 j=1 + + this.solution = new ArrayList<>(original.solution); + this.costs = original.costs; + } + + /** + * __n__ __n__ + * \ \ + * \ \ Fij*Dp(i)p(j) for minimizing or maximizing the costs + * / / where F are the facilities' flows and D the + * /____ /____ the distances + * i=1 j=1 * * - * for example in case of 3 facilities(1,2,3) and 3 locations(A,B,C) this method would calculate: - * f12*dAB+f13*dÁÃ+f21*dBA+f23*dBÃ+ f31*dÃÁ+f32*dÃÂ + * for example in case of 3 facilities(1,2,3) and 3 locations(A,B,C) this + * method would calculate: f12*dAB+f13*dAC+f21*dBA+f23*dBC+ f31*dCA+f32*dCB * * * */ - - public void calculateCosts (List solution){ - - costs=0; - - int k=0; + + public void calculateCosts(List solution) { + + costs = 0; + + int k = 0; int m; - - for(int i=0; i { - @Override - protected double getInitialTemperature() { - return 90; - } + @Override + protected double getInitialTemperature() { + return 90; + } - @Override - protected int getInitialEpochLength() { - return 50; - } + @Override + protected int getInitialEpochLength() { + return 50; + } - @Override - protected double decreaseTemperature(double currentTemperature) { - return currentTemperature * 0.5; - } + @Override + protected double decreaseTemperature(double currentTemperature) { + return currentTemperature * 0.5; + } } diff --git a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolver.java b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolver.java old mode 100755 new mode 100644 index f7ac223..c978c7c --- a/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolver.java +++ b/MetaHeuristics4Java-Examples/src/main/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolver.java @@ -1,10 +1,5 @@ package de.mh4j.examples.qap.solver; - - - - - import java.util.ArrayList; import java.util.List; @@ -13,82 +8,66 @@ import de.mh4j.solver.termination.StagnationTermination; import de.mh4j.solver.termination.StepCountTermination; +public class SimulatedAnnealingQapSolver extends + AbstractSimulatedAnnealingSolver { + + static List locs = new ArrayList(); + + public SimulatedAnnealingQapSolver() { + super(new QapCoolingScheme()); + + addTerminationCondition(new StepCountTermination(this, 50)); + addTerminationCondition(new StagnationTermination(this, 5)); + } + + @Override + protected Qap createRandomNeighbor() { + + Qap neighbor = new Qap(currentSolution); + + return createNeighborFromSwap(neighbor); + + } + + private Qap createNeighborFromSwap(Qap neighbor) { + + int randomIndex1 = randomizer.nextInt(neighbor.solution.size() - 1); + int randomIndex2 = randomizer.nextInt(neighbor.solution.size() - 1); + + while (randomIndex1 == randomIndex2) { + + randomIndex2 = randomizer.nextInt(neighbor.solution.size() - 1); + + } + + String element1 = neighbor.solution.get(randomIndex1); + String element2 = neighbor.solution.get(randomIndex2); + + neighbor.solution.remove(randomIndex1); + neighbor.solution.add(randomIndex1, element2); + + neighbor.solution.remove(randomIndex2); + + neighbor.solution.add(randomIndex2, element1); + + log.trace("Created neighbor from SWAP :"); + + for (int i = 0; i < neighbor.solution.size(); i++) { + log.trace(neighbor.solution.get(i)); + } + + neighbor.calculateCosts(neighbor.solution); + + return neighbor; + + } + + protected Qap createInitialSolution() { + + Qap qap1 = new Qap(locs); -public class SimulatedAnnealingQapSolver extends AbstractSimulatedAnnealingSolver { - - static List locs=new ArrayList(); - - public SimulatedAnnealingQapSolver() { - super(new QapCoolingScheme()); - - - - addTerminationCondition(new StepCountTermination(this, 50)); - addTerminationCondition(new StagnationTermination(this, 5)); - } - - - - - - - @Override - protected Qap createRandomNeighbor() { - - Qap neighbor=new Qap(currentSolution); - - return createNeighborFromSwap(neighbor); - - - - } - - - private Qap createNeighborFromSwap(Qap neighbor) { - - int randomIndex1 = randomizer.nextInt(neighbor.solution.size()-1); - int randomIndex2 = randomizer.nextInt(neighbor.solution.size()-1); - - while (randomIndex1==randomIndex2){ - - randomIndex2 = randomizer.nextInt(neighbor.solution.size()-1); - - } - - String element1=neighbor.solution.get(randomIndex1); - String element2=neighbor.solution.get(randomIndex2); - - neighbor.solution.remove(randomIndex1); - neighbor.solution.add(randomIndex1,element2); - - neighbor.solution.remove(randomIndex2); - - - neighbor.solution.add(randomIndex2,element1); - - log.trace("Created neighbor from SWAP :"); - - for (int i=0; i cost_list1=new ArrayList(); - List cost_list2=new ArrayList(); - List cost_list3=new ArrayList(); - List cost_list4=new ArrayList(); - - cost_list1.add(8); - cost_list1.add(1); - cost_list1.add(5); - - cost_list2.add(8); - cost_list2.add(1); - cost_list2.add(1); - - cost_list3.add(1); - cost_list3.add(1); - cost_list3.add(2); - - cost_list4.add(5); - cost_list4.add(1); - cost_list4.add(2); - - List names1=new ArrayList(); - List names2=new ArrayList(); - List names3=new ArrayList(); - List names4=new ArrayList(); - - names1.add("2"); - names1.add("3"); - names1.add("4"); - - names2.add("1"); - names2.add("3"); - names2.add("4"); - - names3.add("1"); - names3.add("2"); - names3.add("4"); - - names4.add("1"); - names4.add("2"); - names4.add("3"); - - - - - new Facility(facilityName1, cost_list1, names1); - new Facility(facilityName2, cost_list2, names2); - new Facility(facilityName3, cost_list3, names3); - new Facility(facilityName4, cost_list4, names4); - } - + @Test + public void testCreate() { + + String facilityName1 = "1"; + String facilityName2 = "2"; + String facilityName3 = "3"; + String facilityName4 = "4"; + + List cost_list1 = new ArrayList(); + List cost_list2 = new ArrayList(); + List cost_list3 = new ArrayList(); + List cost_list4 = new ArrayList(); + + cost_list1.add(8); + cost_list1.add(1); + cost_list1.add(5); + + cost_list2.add(8); + cost_list2.add(1); + cost_list2.add(1); + + cost_list3.add(1); + cost_list3.add(1); + cost_list3.add(2); + + cost_list4.add(5); + cost_list4.add(1); + cost_list4.add(2); + + List names1 = new ArrayList(); + List names2 = new ArrayList(); + List names3 = new ArrayList(); + List names4 = new ArrayList(); + + names1.add("2"); + names1.add("3"); + names1.add("4"); + + names2.add("1"); + names2.add("3"); + names2.add("4"); + + names3.add("1"); + names3.add("2"); + names3.add("4"); + + names4.add("1"); + names4.add("2"); + names4.add("3"); + + new Facility(facilityName1, cost_list1, names1); + new Facility(facilityName2, cost_list2, names2); + new Facility(facilityName3, cost_list3, names3); + new Facility(facilityName4, cost_list4, names4); + } + } \ No newline at end of file diff --git a/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/LocationTest.java b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/LocationTest.java old mode 100755 new mode 100644 index 7846948..7ada45f --- a/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/LocationTest.java +++ b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/LocationTest.java @@ -2,70 +2,66 @@ import org.testng.annotations.Test; - import java.util.List; import java.util.ArrayList; public class LocationTest { - @Test - public void testCreate() { - - String locationName1="A"; - String locationName2="B"; - String locationName3="C"; - String locationName4="D"; - - List distances1=new ArrayList(); - List distances2=new ArrayList(); - List distances3=new ArrayList(); - List distances4=new ArrayList(); - - distances1.add(20); - distances1.add(56); - distances1.add(11); - - distances2.add(20); - distances2.add(40); - distances2.add(25); - - distances3.add(56); - distances3.add(40); - distances3.add(54); - - distances4.add(11); - distances4.add(25); - distances4.add(54); - - List distancesNames1=new ArrayList(); - List distancesNames2=new ArrayList(); - List distancesNames3=new ArrayList(); - List distancesNames4=new ArrayList(); - - distancesNames1.add("B"); - distancesNames1.add("C"); - distancesNames1.add("D"); - - distancesNames2.add("A"); - distancesNames2.add("C"); - distancesNames2.add("D"); - - distancesNames3.add("A"); - distancesNames3.add("B"); - distancesNames3.add("D"); - - distancesNames4.add("A"); - distancesNames4.add("B"); - distancesNames4.add("C"); - - - - - new Location(locationName1, distances1, distancesNames1); - new Location(locationName2, distances2, distancesNames2); - new Location(locationName3, distances3, distancesNames3); - new Location(locationName4, distances4, distancesNames4); - } - + @Test + public void testCreate() { + + String locationName1 = "A"; + String locationName2 = "B"; + String locationName3 = "C"; + String locationName4 = "D"; + + List distances1 = new ArrayList(); + List distances2 = new ArrayList(); + List distances3 = new ArrayList(); + List distances4 = new ArrayList(); + + distances1.add(20); + distances1.add(56); + distances1.add(11); + + distances2.add(20); + distances2.add(40); + distances2.add(25); + + distances3.add(56); + distances3.add(40); + distances3.add(54); + + distances4.add(11); + distances4.add(25); + distances4.add(54); + + List distancesNames1 = new ArrayList(); + List distancesNames2 = new ArrayList(); + List distancesNames3 = new ArrayList(); + List distancesNames4 = new ArrayList(); + + distancesNames1.add("B"); + distancesNames1.add("C"); + distancesNames1.add("D"); + + distancesNames2.add("A"); + distancesNames2.add("C"); + distancesNames2.add("D"); + + distancesNames3.add("A"); + distancesNames3.add("B"); + distancesNames3.add("D"); + + distancesNames4.add("A"); + distancesNames4.add("B"); + distancesNames4.add("C"); + + new Location(locationName1, distances1, distancesNames1); + new Location(locationName2, distances2, distancesNames2); + new Location(locationName3, distances3, distancesNames3); + new Location(locationName4, distances4, distancesNames4); + } + } \ No newline at end of file diff --git a/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/QapTest.java b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/QapTest.java old mode 100755 new mode 100644 index ebb8e91..ca3a0de --- a/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/QapTest.java +++ b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/model/QapTest.java @@ -4,152 +4,137 @@ import org.testng.annotations.Test; - import java.util.List; import java.util.ArrayList; public class QapTest { - @Test - public void testCreate() { - - String facilityName1="1"; - String facilityName2="2"; - String facilityName3="3"; - String facilityName4="4"; - - List cost_list1=new ArrayList(); - List cost_list2=new ArrayList(); - List cost_list3=new ArrayList(); - List cost_list4=new ArrayList(); - - cost_list1.add(8); - cost_list1.add(1); - cost_list1.add(5); - - cost_list2.add(8); - cost_list2.add(1); - cost_list2.add(1); - - cost_list3.add(1); - cost_list3.add(1); - cost_list3.add(2); - - cost_list4.add(5); - cost_list4.add(1); - cost_list4.add(2); - - List names1=new ArrayList(); - List names2=new ArrayList(); - List names3=new ArrayList(); - List names4=new ArrayList(); - - names1.add("2"); - names1.add("3"); - names1.add("4"); - - names2.add("1"); - names2.add("3"); - names2.add("4"); - - names3.add("1"); - names3.add("2"); - names3.add("4"); - - names4.add("1"); - names4.add("2"); - names4.add("3"); - - - - - new Facility(facilityName1, cost_list1, names1); - new Facility(facilityName2, cost_list2, names2); - new Facility(facilityName3, cost_list3, names3); - new Facility(facilityName4, cost_list4, names4); - - - String locationName1="A"; - String locationName2="B"; - String locationName3="C"; - String locationName4="D"; - - List distances1=new ArrayList(); - List distances2=new ArrayList(); - List distances3=new ArrayList(); - List distances4=new ArrayList(); - - distances1.add(20); - distances1.add(56); - distances1.add(11); - - distances2.add(20); - distances2.add(40); - distances2.add(25); - - distances3.add(56); - distances3.add(40); - distances3.add(54); - - distances4.add(11); - distances4.add(25); - distances4.add(54); - - List distancesNames1=new ArrayList(); - List distancesNames2=new ArrayList(); - List distancesNames3=new ArrayList(); - List distancesNames4=new ArrayList(); - - distancesNames1.add("B"); - distancesNames1.add("C"); - distancesNames1.add("D"); - - distancesNames2.add("A"); - distancesNames2.add("C"); - distancesNames2.add("D"); - - distancesNames3.add("A"); - distancesNames3.add("B"); - distancesNames3.add("D"); - - distancesNames4.add("A"); - distancesNames4.add("B"); - distancesNames4.add("C"); - - - - - new Location(locationName1, distances1, distancesNames1); - new Location(locationName2, distances2, distancesNames2); - new Location(locationName3, distances3, distancesNames3); - new Location(locationName4, distances4, distancesNames4); - - - - - - List locs=new ArrayList(); - - locs.add("1"); - locs.add("2"); - locs.add("4"); - locs.add("3"); - - - - List locs2=new ArrayList(); - locs2.add("2"); - locs2.add("1"); - locs2.add("4"); - locs2.add("3"); - - Qap qap1=new Qap(locs); - Qap qap2=new Qap(locs2); - - assertTrue(qap1.isBetterThan(qap2)); - - - } - + @Test + public void testCreate() { + + String facilityName1 = "1"; + String facilityName2 = "2"; + String facilityName3 = "3"; + String facilityName4 = "4"; + + List cost_list1 = new ArrayList(); + List cost_list2 = new ArrayList(); + List cost_list3 = new ArrayList(); + List cost_list4 = new ArrayList(); + + cost_list1.add(8); + cost_list1.add(1); + cost_list1.add(5); + + cost_list2.add(8); + cost_list2.add(1); + cost_list2.add(1); + + cost_list3.add(1); + cost_list3.add(1); + cost_list3.add(2); + + cost_list4.add(5); + cost_list4.add(1); + cost_list4.add(2); + + List names1 = new ArrayList(); + List names2 = new ArrayList(); + List names3 = new ArrayList(); + List names4 = new ArrayList(); + + names1.add("2"); + names1.add("3"); + names1.add("4"); + + names2.add("1"); + names2.add("3"); + names2.add("4"); + + names3.add("1"); + names3.add("2"); + names3.add("4"); + + names4.add("1"); + names4.add("2"); + names4.add("3"); + + new Facility(facilityName1, cost_list1, names1); + new Facility(facilityName2, cost_list2, names2); + new Facility(facilityName3, cost_list3, names3); + new Facility(facilityName4, cost_list4, names4); + + String locationName1 = "A"; + String locationName2 = "B"; + String locationName3 = "C"; + String locationName4 = "D"; + + List distances1 = new ArrayList(); + List distances2 = new ArrayList(); + List distances3 = new ArrayList(); + List distances4 = new ArrayList(); + + distances1.add(20); + distances1.add(56); + distances1.add(11); + + distances2.add(20); + distances2.add(40); + distances2.add(25); + + distances3.add(56); + distances3.add(40); + distances3.add(54); + + distances4.add(11); + distances4.add(25); + distances4.add(54); + + List distancesNames1 = new ArrayList(); + List distancesNames2 = new ArrayList(); + List distancesNames3 = new ArrayList(); + List distancesNames4 = new ArrayList(); + + distancesNames1.add("B"); + distancesNames1.add("C"); + distancesNames1.add("D"); + + distancesNames2.add("A"); + distancesNames2.add("C"); + distancesNames2.add("D"); + + distancesNames3.add("A"); + distancesNames3.add("B"); + distancesNames3.add("D"); + + distancesNames4.add("A"); + distancesNames4.add("B"); + distancesNames4.add("C"); + + new Location(locationName1, distances1, distancesNames1); + new Location(locationName2, distances2, distancesNames2); + new Location(locationName3, distances3, distancesNames3); + new Location(locationName4, distances4, distancesNames4); + + List locs = new ArrayList(); + + locs.add("1"); + locs.add("2"); + locs.add("4"); + locs.add("3"); + + List locs2 = new ArrayList(); + locs2.add("2"); + locs2.add("1"); + locs2.add("4"); + locs2.add("3"); + + Qap qap1 = new Qap(locs); + Qap qap2 = new Qap(locs2); + + assertTrue(qap1.isBetterThan(qap2)); + + } + } \ No newline at end of file diff --git a/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolverTest.java b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolverTest.java old mode 100755 new mode 100644 index e172a7f..57c9a0d --- a/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolverTest.java +++ b/MetaHeuristics4Java-Examples/src/test/java/de/mh4j/examples/qap/solver/SimulatedAnnealingQapSolverTest.java @@ -1,10 +1,5 @@ package de.mh4j.examples.qap.solver; - - - - - import java.util.ArrayList; import java.util.List; @@ -17,167 +12,127 @@ import de.mh4j.examples.qap.solver.SimulatedAnnealingQapSolver; - - - public class SimulatedAnnealingQapSolverTest { @Test public void testSolveSimpleInstance() { - - - String facilityName1="1"; - String facilityName2="2"; - String facilityName3="3"; - String facilityName4="4"; - - List cost_list1=new ArrayList(); - List cost_list2=new ArrayList(); - List cost_list3=new ArrayList(); - List cost_list4=new ArrayList(); - - cost_list1.add(8); - cost_list1.add(1); - cost_list1.add(5); - - cost_list2.add(8); - cost_list2.add(1); - cost_list2.add(1); - - cost_list3.add(1); - cost_list3.add(1); - cost_list3.add(2); - - cost_list4.add(5); - cost_list4.add(1); - cost_list4.add(2); - - List names1=new ArrayList(); - List names2=new ArrayList(); - List names3=new ArrayList(); - List names4=new ArrayList(); - - names1.add("2"); - names1.add("3"); - names1.add("4"); - - names2.add("1"); - names2.add("3"); - names2.add("4"); - - names3.add("1"); - names3.add("2"); - names3.add("4"); - - names4.add("1"); - names4.add("2"); - names4.add("3"); - - - - - new Facility(facilityName1, cost_list1, names1); - new Facility(facilityName2, cost_list2, names2); - new Facility(facilityName3, cost_list3, names3); - new Facility(facilityName4, cost_list4, names4); - - - String locationName1="A"; - String locationName2="B"; - String locationName3="C"; - String locationName4="D"; - - List distances1=new ArrayList(); - List distances2=new ArrayList(); - List distances3=new ArrayList(); - List distances4=new ArrayList(); - - distances1.add(20); - distances1.add(56); - distances1.add(11); - - distances2.add(20); - distances2.add(40); - distances2.add(25); - - distances3.add(56); - distances3.add(40); - distances3.add(54); - - distances4.add(11); - distances4.add(25); - distances4.add(54); - - List distancesNames1=new ArrayList(); - List distancesNames2=new ArrayList(); - List distancesNames3=new ArrayList(); - List distancesNames4=new ArrayList(); - - distancesNames1.add("B"); - distancesNames1.add("C"); - distancesNames1.add("D"); - - distancesNames2.add("A"); - distancesNames2.add("C"); - distancesNames2.add("D"); - - distancesNames3.add("A"); - distancesNames3.add("B"); - distancesNames3.add("D"); - - distancesNames4.add("A"); - distancesNames4.add("B"); - distancesNames4.add("C"); - - - - - new Location(locationName1, distances1, distancesNames1); - new Location(locationName2, distances2, distancesNames2); - new Location(locationName3, distances3, distancesNames3); - new Location(locationName4, distances4, distancesNames4); - - - - - - - - - SimulatedAnnealingQapSolver solver=new SimulatedAnnealingQapSolver(); - - - - + + String facilityName1 = "1"; + String facilityName2 = "2"; + String facilityName3 = "3"; + String facilityName4 = "4"; + + List cost_list1 = new ArrayList(); + List cost_list2 = new ArrayList(); + List cost_list3 = new ArrayList(); + List cost_list4 = new ArrayList(); + + cost_list1.add(8); + cost_list1.add(1); + cost_list1.add(5); + + cost_list2.add(8); + cost_list2.add(1); + cost_list2.add(1); + + cost_list3.add(1); + cost_list3.add(1); + cost_list3.add(2); + + cost_list4.add(5); + cost_list4.add(1); + cost_list4.add(2); + + List names1 = new ArrayList(); + List names2 = new ArrayList(); + List names3 = new ArrayList(); + List names4 = new ArrayList(); + + names1.add("2"); + names1.add("3"); + names1.add("4"); + + names2.add("1"); + names2.add("3"); + names2.add("4"); + + names3.add("1"); + names3.add("2"); + names3.add("4"); + + names4.add("1"); + names4.add("2"); + names4.add("3"); + + new Facility(facilityName1, cost_list1, names1); + new Facility(facilityName2, cost_list2, names2); + new Facility(facilityName3, cost_list3, names3); + new Facility(facilityName4, cost_list4, names4); + + String locationName1 = "A"; + String locationName2 = "B"; + String locationName3 = "C"; + String locationName4 = "D"; + + List distances1 = new ArrayList(); + List distances2 = new ArrayList(); + List distances3 = new ArrayList(); + List distances4 = new ArrayList(); + + distances1.add(20); + distances1.add(56); + distances1.add(11); + + distances2.add(20); + distances2.add(40); + distances2.add(25); + + distances3.add(56); + distances3.add(40); + distances3.add(54); + + distances4.add(11); + distances4.add(25); + distances4.add(54); + + List distancesNames1 = new ArrayList(); + List distancesNames2 = new ArrayList(); + List distancesNames3 = new ArrayList(); + List distancesNames4 = new ArrayList(); + + distancesNames1.add("B"); + distancesNames1.add("C"); + distancesNames1.add("D"); + + distancesNames2.add("A"); + distancesNames2.add("C"); + distancesNames2.add("D"); + + distancesNames3.add("A"); + distancesNames3.add("B"); + distancesNames3.add("D"); + + distancesNames4.add("A"); + distancesNames4.add("B"); + distancesNames4.add("C"); + + new Location(locationName1, distances1, distancesNames1); + new Location(locationName2, distances2, distancesNames2); + new Location(locationName3, distances3, distancesNames3); + new Location(locationName4, distances4, distancesNames4); + + SimulatedAnnealingQapSolver solver = new SimulatedAnnealingQapSolver(); + SimulatedAnnealingQapSolver.locs.add("1"); SimulatedAnnealingQapSolver.locs.add("2"); SimulatedAnnealingQapSolver.locs.add("4"); SimulatedAnnealingQapSolver.locs.add("3"); - + solver.createInitialSolution(); - - + solver.setLogLevel(Level.TRACE); solver.run(); - - + } - - -} - - - - - - - - - - - - - - - +}