diff --git a/java/com.sap.sse.test/src/com/sap/see/pairinglist/test/PairingListTemplateTest.java b/java/com.sap.sse.test/src/com/sap/see/pairinglist/test/PairingListTemplateTest.java index 6dc29a020d4..5c6e7c59f1d 100644 --- a/java/com.sap.sse.test/src/com/sap/see/pairinglist/test/PairingListTemplateTest.java +++ b/java/com.sap.sse.test/src/com/sap/see/pairinglist/test/PairingListTemplateTest.java @@ -2,6 +2,9 @@ package com.sap.see.pairinglist.test; import static org.junit.Assert.assertArrayEquals; +import java.lang.reflect.Array; +import java.util.Arrays; + import org.junit.Test; import com.sap.sse.pairinglist.PairingFrameProvider; @@ -12,7 +15,8 @@ import junit.framework.Assert; public class PairingListTemplateTest extends PairingListTemplateImpl{ - public PairingListTemplateTest() { + + public PairingListTemplateTest() { super(new PairingFrameProviderTest(15, 3, 18)); } diff --git a/java/com.sap.sse/src/com/sap/sse/pairinglist/impl/PairingListTemplateImpl.java b/java/com.sap.sse/src/com/sap/sse/pairinglist/impl/PairingListTemplateImpl.java index 80028c0e823..e6023ab81c6 100644 --- a/java/com.sap.sse/src/com/sap/sse/pairinglist/impl/PairingListTemplateImpl.java +++ b/java/com.sap.sse/src/com/sap/sse/pairinglist/impl/PairingListTemplateImpl.java @@ -18,27 +18,39 @@ public class PairingListTemplateImpl implements PairingListTemplate{ private final Random random = new Random(); private final int[][] pairingListTemplate; private final double standardDev; - private final ExecutorService executorService = ThreadPoolUtil.INSTANCE.getDefaultBackgroundTaskThreadPoolExecutor(); - ArrayList> futures = new ArrayList>(); + private final ExecutorService executorService = + ThreadPoolUtil.INSTANCE.getDefaultBackgroundTaskThreadPoolExecutor(); - //TODO: final - private int maxConstantFlights; - private final int ITERATIONS = 100000; + private final int maxConstantFlights; + private final int iterations; - //TODO: redundant constructors public PairingListTemplateImpl(PairingFrameProvider pairingFrameProvider) { - pairingListTemplate = new int[pairingFrameProvider.getGroupsCount()][pairingFrameProvider.getCompetitorsCount()/pairingFrameProvider.getGroupsCount()]; - this.createPairingListTemplate(pairingFrameProvider.getFlightsCount(), pairingFrameProvider.getGroupsCount(), pairingFrameProvider.getCompetitorsCount()); + // setting iterations to default of 100.000 + this(pairingFrameProvider, 100000); } public PairingListTemplateImpl(PairingFrameProvider pairingFrameProvider, int iterations) { - pairingListTemplate = new int[pairingFrameProvider.getGroupsCount()][pairingFrameProvider.getCompetitorsCount()/pairingFrameProvider.getGroupsCount()]; + this.iterations = iterations; + this.maxConstantFlights = (int) (pairingFrameProvider.getFlightsCount() * 0.9); + + if (this.checkValues(pairingFrameProvider.getFlightsCount(), pairingFrameProvider.getGroupsCount(), + pairingFrameProvider.getCompetitorsCount())) { + + this.pairingListTemplate = this.createPairingListTemplate(pairingFrameProvider.getFlightsCount(), pairingFrameProvider.getGroupsCount(), + pairingFrameProvider.getCompetitorsCount()); + this.standardDev = this.calcStandardDev(getAssociationsFromPairingList(this.pairingListTemplate, + new int[pairingFrameProvider.getCompetitorsCount()][pairingFrameProvider.getCompetitorsCount()])); + } else { + throw new IllegalArgumentException("Wrong arguments for creating a pairing list template: count of flights " + + "has to be greater than 0; count of groups has to be greater than 1; count of competitors has to " + + "be greater than 1; count of competitors has to be greater than count of groups; count of " + + "competitors has to be divisible by count of groups"); + } } - @Override public double getQuality() { - return standardDev; + return this.standardDev; } @Override @@ -79,42 +91,41 @@ public class PairingListTemplateImpl implements PairingListTemplate{ * @param groupCount count of groups per flight * @param competitors count of total competitors */ - protected void createPairingListTemplate(int flightCount, int groupCount, int competitors) { - //TODO: futures local - maxConstantFlights = (int) (flightCount * 0.9); + protected int[][] createPairingListTemplate(int flightCount, int groupCount, int competitors) { int[] seeds = this.generateSeeds(flightCount, competitors); int[][] bestPLT = new int[flightCount * groupCount][competitors / groupCount]; double bestDev = Double.POSITIVE_INFINITY; - //TODO: check in constructor, IllegalArgumentException - if (this.checkValues(flightCount, groupCount, competitors)) { - this.createConstantFlights(flightCount, groupCount, competitors, new int[competitors][competitors], - new int[flightCount * groupCount][competitors / groupCount], seeds); - for (Future f : futures) { - try { - int[][] currentPLT = f.get(); - double currentStandardDev = calcStandardDev( - getAssociationsFromPairingList(currentPLT, new int[competitors][competitors])); + ArrayList> futures = this.createConstantFlights(flightCount, groupCount, competitors, new int[competitors][competitors], + new int[flightCount * groupCount][competitors / groupCount], seeds, new ArrayList<>()); - if (currentStandardDev < bestDev) { - bestPLT = currentPLT; - bestDev = currentStandardDev; - } - } catch (Exception e) { - e.printStackTrace(); + for (Future f : futures) { + try { + int[][] currentPLT = f.get(); + double currentStandardDev = calcStandardDev( + getAssociationsFromPairingList(currentPLT, new int[competitors][competitors])); + + if (currentStandardDev < bestDev) { + bestPLT = currentPLT; + bestDev = currentStandardDev; } + } catch (Exception e) { + e.printStackTrace(); } - - bestPLT = this.improveAssignment(bestPLT, flightCount, groupCount, competitors); - bestPLT = this.improveAssignmentChanges(bestPLT, flightCount, competitors); - this.standardDev = bestDev; - this.pairingListTemplate = bestPLT; - futures.clear(); } + + bestPLT = this.improveAssignment(bestPLT, flightCount, groupCount, competitors); + bestPLT = this.improveAssignmentChanges(bestPLT, flightCount, competitors); + + futures.clear(); + + return bestPLT; } private boolean checkValues(int flights, int groups, int competitors) { - if(flights>0&&(groups>1)&&(competitors>1)&&(competitors>=groups)&&(competitors%groups==0))return true; + if((flights > 0) && (groups>1) && (competitors>1) && (competitors>=groups) && (competitors%groups==0)) { + return true; + } return false; } @@ -127,8 +138,8 @@ public class PairingListTemplateImpl implements PairingListTemplate{ * @param competitors count of competitors * @return int array of random competitors */ - private int[] generateSeeds(int flights, int competitors) { - int[] seeds=new int[(int)(Math.log(ITERATIONS)/Math.log(flights)*0.5)]; + private int[] generateSeeds(int flights, int competitors) { + int[] seeds=new int[(int)(Math.log(iterations)/Math.log(flights)*0.5)]; for(int x=0;x { + int flights,groups,competitors, seedLength; + int[][] plt,associations; + //TODO document array copies + /** + * This task is created every time a constant is generated. It generates a specific number of PairingListTemplates,which is based on the constant flights + * which are given to the task and returns its best. The number of generated PairingListTamplates depends on the number of constant flights and the number of seeds. + * @param flights count of flights + * @param groups count of groups + * @param competitors count of competitors + * @param constantPLT constant generated flights on which the tasks is based on + * @param associations associations created from constantPLT + */ + Task(int flights, int groups, int competitors, int[][] constantPLT, int[][] associations, int seedLength){ + this.flights = flights; + this.groups = groups; + this.competitors = competitors; + this.seedLength = seedLength; + this.plt = new int[flights*groups][competitors/groups]; + this.associations = new int[competitors][competitors]; + for(int i=0;i> createConstantFlights(int flights, int groups, int competitors, int[][] associations, + int[][]currentPLT, int[] seeds, ArrayList> futures) { //TODO: change depth of groups int fleet=Integer.MAX_VALUE; for(int z=0;z { - int flights,groups,competitors; - int[][] plt,associations; - //TODO document array copies - /** - * This task is created every time a constant is generated. It generates a specific number of PairingListTemplates,which is based on the constant flights - * which are given to the task and returns its best. The number of generated PairingListTamplates depends on the number of constant flights and the number of seeds. - * @param flights count of flights - * @param groups count of groups - * @param competitors count of competitors - * @param constantPLT constant generated flights on which the tasks is based on - * @param associations associations created from constantPLT - */ - Task(int flights, int groups, int competitors, int[][] constantPLT, int[][] associations){ - this.flights=flights; - this.groups=groups; - this.competitors=competitors; - plt=new int[flights*groups][competitors/groups]; - this.associations=new int[competitors][competitors]; - for(int i=0;i future= executorService.submit((new Task(flights,groups,competitors,currentPLT,associations))); + //Task start + Future future= executorService.submit((new Task(flights,groups,competitors,currentPLT,associations, seeds.length))); futures.add(future); //reset last recurrence step for(int i=maxConstantFlights*groups-1;i>=maxConstantFlights*groups-groups;i--){ @@ -207,26 +236,10 @@ public class PairingListTemplateImpl implements PairingListTemplate{ } //TODO reverse method associations=getAssociationsFromPairingList(currentPLT, associations); - //TODO remove return - return; + break; } } - //calculate Flights for current recurrence level - for(int x=0;x