[jboss-svn-commits] JBL Code SVN: r17767 - in labs/jbossrules/trunk/drools-solver: drools-solver-core/src/main/java/org/drools/solver/core and 7 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Jan 12 15:54:47 EST 2008
Author: ge0ffrey
Date: 2008-01-12 15:54:47 -0500 (Sat, 12 Jan 2008)
New Revision: 17767
Added:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/SolverAware.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/AbstractStartingSolutionInitializer.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/StartingSolutionInitializer.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java
Modified:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/evaluation/EvaluationHandler.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java
labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
Log:
StartingSolutionInitializer
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java 2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java 2008-01-12 20:54:47 UTC (rev 17767)
@@ -23,6 +23,7 @@
import org.drools.solver.core.localsearch.bestsolution.BestSolutionRecaller;
import org.drools.solver.core.localsearch.decider.Decider;
import org.drools.solver.core.localsearch.decider.DefaultDecider;
+import org.drools.solver.core.solution.initializer.StartingSolutionInitializer;
/**
* @author Geoffrey De Smet
@@ -37,6 +38,9 @@
@XStreamAlias("scoreCalculator")
private ScoreCalculatorConfig scoreCalculatorConfig = new ScoreCalculatorConfig();
+ private StartingSolutionInitializer startingSolutionInitializer = null;
+ private Class<StartingSolutionInitializer> startingSolutionInitializerClass = null;
+
@XStreamAlias("finish")
private FinishConfig finishConfig = new FinishConfig(); // TODO this new is pointless due to xstream
@@ -115,6 +119,7 @@
localSearchSolver.setRandomSeed(0L);
}
localSearchSolver.setEvaluationHandler(buildEvaluationHandler());
+ localSearchSolver.setStartingSolutionInitializer(buildStartingSolutionInitializer());
localSearchSolver.setBestSolutionRecaller(new BestSolutionRecaller());
localSearchSolver.setFinish(finishConfig.buildFinish());
localSearchSolver.setDecider(buildDecider());
@@ -155,6 +160,26 @@
return ruleBase;
}
+ public StartingSolutionInitializer buildStartingSolutionInitializer() {
+ if (startingSolutionInitializer != null) {
+ return startingSolutionInitializer;
+ } else if (startingSolutionInitializerClass != null) {
+ try {
+ return startingSolutionInitializerClass.newInstance();
+ } catch (InstantiationException e) {
+ throw new IllegalArgumentException("startingSolutionInitializerClass ("
+ + startingSolutionInitializerClass.getName()
+ + ") does not have a public no-arg constructor", e);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException("startingSolutionInitializerClass ("
+ + startingSolutionInitializerClass.getName()
+ + ") does not have a public no-arg constructor", e);
+ }
+ } else {
+ return null;
+ }
+ }
+
private Decider buildDecider() {
DefaultDecider decider = new DefaultDecider();
decider.setMoveFactory(selectorConfig.buildMoveFactory());
Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/SolverAware.java (from rev 17581, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/SolverAware.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/SolverAware.java 2008-01-12 20:54:47 UTC (rev 17767)
@@ -0,0 +1,10 @@
+package org.drools.solver.core;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public interface SolverAware {
+
+ void setSolver(Solver solver);
+
+}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/evaluation/EvaluationHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/evaluation/EvaluationHandler.java 2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/evaluation/EvaluationHandler.java 2008-01-12 20:54:47 UTC (rev 17767)
@@ -57,7 +57,7 @@
/**
* Resets the WorkingMemory by creating a new one and asserting the solution into it.
*/
- public void resetStatefullSession() {
+ private void resetStatefullSession() {
if (statefulSession != null) {
statefulSession.dispose();
}
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java 2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java 2008-01-12 20:54:47 UTC (rev 17767)
@@ -8,6 +8,7 @@
import org.drools.solver.core.localsearch.finish.Finish;
import org.drools.solver.core.move.Move;
import org.drools.solver.core.solution.Solution;
+import org.drools.solver.core.solution.initializer.StartingSolutionInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -21,6 +22,7 @@
protected long randomSeed; // TODO refactor to AbstractSolver
protected EvaluationHandler evaluationHandler; // TODO refactor to AbstractSolver
+ protected StartingSolutionInitializer startingSolutionInitializer = null; // TODO refactor to AbstractSolver
protected BestSolutionRecaller bestSolutionRecaller;
protected Finish finish;
protected Decider decider;
@@ -42,19 +44,30 @@
this.evaluationHandler = evaluationHandler;
}
+ public StartingSolutionInitializer getStartingSolutionInitializer() {
+ return startingSolutionInitializer;
+ }
+
+ public void setStartingSolutionInitializer(StartingSolutionInitializer startingSolutionInitializer) {
+ this.startingSolutionInitializer = startingSolutionInitializer;
+ if (startingSolutionInitializer != null) {
+ this.startingSolutionInitializer.setSolver(this);
+ }
+ }
+
public void setBestSolutionRecaller(BestSolutionRecaller bestSolutionRecaller) {
this.bestSolutionRecaller = bestSolutionRecaller;
- bestSolutionRecaller.setLocalSearchSolver(this);
+ this.bestSolutionRecaller.setLocalSearchSolver(this);
}
public void setDecider(Decider decider) {
this.decider = decider;
- decider.setLocalSearchSolver(this);
+ this.decider.setLocalSearchSolver(this);
}
public void setFinish(Finish finish) {
this.finish = finish;
- finish.setLocalSearchSolver(this);
+ this.finish.setLocalSearchSolver(this);
}
@@ -127,6 +140,9 @@
startingSystemTimeMillis = System.currentTimeMillis();
logger.info("Solving with random seed ({}).", randomSeed);
random = new Random(randomSeed);
+ if (startingSolutionInitializer != null) {
+ startingSolutionInitializer.intializeSolution();
+ }
stepIndex = 0;
stepScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
bestSolutionRecaller.solvingStarted();
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java 2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverAware.java 2008-01-12 20:54:47 UTC (rev 17767)
@@ -5,9 +5,6 @@
*/
public interface LocalSearchSolverAware {
- /**
- * Called during configuration to set
- */
void setLocalSearchSolver(LocalSearchSolver localSearchSolver);
}
Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/AbstractStartingSolutionInitializer.java (from rev 17581, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AbstractForager.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/AbstractStartingSolutionInitializer.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/AbstractStartingSolutionInitializer.java 2008-01-12 20:54:47 UTC (rev 17767)
@@ -0,0 +1,24 @@
+package org.drools.solver.core.solution.initializer;
+
+import org.drools.solver.core.Solver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public abstract class AbstractStartingSolutionInitializer implements StartingSolutionInitializer {
+
+ protected final transient Logger logger = LoggerFactory.getLogger(getClass());
+
+ protected Solver solver;
+
+ public void setSolver(Solver solver) {
+ this.solver = solver;
+ }
+
+ // ************************************************************************
+ // Worker methods
+ // ************************************************************************
+
+}
\ No newline at end of file
Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/StartingSolutionInitializer.java (from rev 17581, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/Forager.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/StartingSolutionInitializer.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/solution/initializer/StartingSolutionInitializer.java 2008-01-12 20:54:47 UTC (rev 17767)
@@ -0,0 +1,12 @@
+package org.drools.solver.core.solution.initializer;
+
+import org.drools.solver.core.SolverAware;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public interface StartingSolutionInitializer extends SolverAware {
+
+ void intializeSolution();
+
+}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java 2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/persistence/ExaminationInputConvertor.java 2008-01-12 20:54:47 UTC (rev 17767)
@@ -295,6 +295,7 @@
public int compare(Topic a, Topic b) {
return new CompareToBuilder()
.append(a.getStudentListSize(), b.getStudentListSize())
+ .append(a.getId(), b.getId())
.toComparison();
}
});
@@ -317,39 +318,17 @@
if (frontLoadLastPeriodSize == 0) {
return;
}
- int minimumPeriodIndex = periodList.get(periodList.size() - frontLoadLastPeriodSize).getPeriodIndex();
- for (Period period : periodList) {
- if (period.getPeriodIndex() >= minimumPeriodIndex) {
- period.setFrontLoadLast(true);
- }
+ int minimumPeriodId = periodList.size() - frontLoadLastPeriodSize;
+ if (minimumPeriodId < 0) {
+ logger.warn("The frontLoadLastPeriodSize (" + frontLoadLastPeriodSize + ") is bigger than periodListSize ("
+ + periodList.size() + "). Tagging all periods as large...");
+ minimumPeriodId = 0;
}
+ for (Period period : periodList.subList(minimumPeriodId, periodList.size())) {
+ period.setFrontLoadLast(true);
+ }
}
-// private void createExamList(Examination examination) {
-// List<Topic> topicList = examination.getTopicList();
-// List<Period> periodList = examination.getPeriodList();
-// List<Room> roomList = examination.getRoomList();
-// List<Exam> examList = new ArrayList<Exam>(topicList.size());
-// int periodIndex = 0;
-// int roomIndex = 0;
-// int roomAddition = 0;
-// for (Topic topic : topicList) {
-// Exam exam = new Exam();
-// exam.setId(topic.getId());
-// exam.setTopic(topic);
-// exam.setPeriod(periodList.get(periodIndex));
-// exam.setRoom(roomList.get(roomIndex));
-// periodIndex = (periodIndex + 1) % periodList.size();
-// roomIndex = (roomIndex + 1) % roomList.size();
-// if (roomIndex == 0) {
-// roomAddition = (roomAddition + 1) % roomList.size();
-// roomIndex = roomAddition;
-// }
-// examList.add(exam);
-// }
-// examination.setExamList(examList);
-// }
-
private void createExamList(Examination examination) {
XmlSolverConfigurer configurer = new XmlSolverConfigurer();
configurer.configure(ExaminationApp.SOLVER_CONFIG);
@@ -361,7 +340,6 @@
List<Exam> examList = new ArrayList<Exam>(topicList.size());
examination.setExamList(examList);
evaluationHandler.setSolution(examination);
- evaluationHandler.resetStatefullSession();
StatefulSession workingMemory = evaluationHandler.getStatefulSession();
// Sort the order in which we 'll assign the topics into periods and rooms
@@ -375,7 +353,6 @@
});
for (Topic topic : sortedTopicList) {
- logger.info("Scheduling topic ({}).", topic);
double unscheduledScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
Exam exam = new Exam();
@@ -439,6 +416,7 @@
exam.setRoom(bestRoom);
workingMemory.update(examHandle, exam);
}
+ logger.debug(" Exam ({}) initialized for starting solution.", exam);
}
Collections.sort(examList, new PersistableIdComparator());
}
@@ -467,82 +445,4 @@
}
- private void createExamListSlow(Examination examination) {
- XmlSolverConfigurer configurer = new XmlSolverConfigurer();
- configurer.configure(ExaminationApp.SOLVER_CONFIG);
- EvaluationHandler evaluationHandler = configurer.buildSolver().getEvaluationHandler();
-
- List<Topic> topicList = examination.getTopicList();
- List<Period> periodList = examination.getPeriodList();
- List<Room> roomList = examination.getRoomList();
- List<Exam> examList = new ArrayList<Exam>(topicList.size());
- examination.setExamList(examList);
- evaluationHandler.setSolution(examination);
- evaluationHandler.resetStatefullSession();
- StatefulSession workingMemory = evaluationHandler.getStatefulSession();
-
- // Sort the order in which we 'll assign the topics into periods and rooms
- List<Topic> sortedTopicList = new ArrayList<Topic>(topicList);
- Collections.sort(sortedTopicList, new Comparator<Topic>() {
- public int compare(Topic a, Topic b) {
- return new CompareToBuilder()
- .append(a.getStudentListSize(), b.getStudentListSize())
- .toComparison();
- }
- });
-
- for (Topic topic : sortedTopicList) {
- logger.info("Scheduling topic ({}).", topic);
- double unscheduledScore = evaluationHandler.fireAllRulesAndCalculateStepScore();
-
- Exam exam = new Exam();
- exam.setId(topic.getId());
- exam.setTopic(topic);
- examList.add(exam);
-
- FactHandle examHandle = null;
- boolean perfectMatch = false;
- double bestScore = Double.NEGATIVE_INFINITY;
- Period bestPeriod = null;
- Room bestRoom = null;
- for (Period period : periodList) {
- exam.setPeriod(period);
- for (Room room : roomList) {
- exam.setRoom(room);
- if (examHandle == null) {
- examHandle = workingMemory.insert(exam);
- }
- workingMemory.update(examHandle, exam);
- double score = evaluationHandler.fireAllRulesAndCalculateStepScore();
- if (score < unscheduledScore) {
- if (score > bestScore) {
- bestScore = score;
- bestPeriod = period;
- bestRoom = room;
- }
- } else if (score == unscheduledScore) {
- perfectMatch = true;
- break;
- } else {
- throw new IllegalStateException("The score (" + score
- + ") cannot be higher than unscheduledScore (" + unscheduledScore + ").");
- }
- }
- if (perfectMatch) {
- break;
- }
- }
- if (!perfectMatch) {
- if (bestPeriod == null || bestRoom == null) {
- throw new IllegalStateException("The bestPeriod (" + bestPeriod + ") or the bestRoom ("
- + bestRoom + ") cannot be null.");
- }
- exam.setPeriod(bestPeriod);
- exam.setRoom(bestRoom);
- workingMemory.update(examHandle, exam);
- }
- }
- Collections.sort(examList, new PersistableIdComparator());
- }
-
}
Added: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/ExaminationStartingSolutionInitializer.java 2008-01-12 20:54:47 UTC (rev 17767)
@@ -0,0 +1,18 @@
+package org.drools.solver.examples.itc2007.examination.solver;
+
+import org.drools.solver.core.solution.initializer.AbstractStartingSolutionInitializer;
+import org.drools.solver.examples.itc2007.examination.domain.Examination;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class ExaminationStartingSolutionInitializer extends AbstractStartingSolutionInitializer {
+
+ public void intializeSolution() {
+ Examination examination = (Examination) solver.getEvaluationHandler().getSolution();
+ if (examination.getExamList() == null) {
+ // TODO do stuff
+ }
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml 2008-01-12 16:26:11 UTC (rev 17766)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml 2008-01-12 20:54:47 UTC (rev 17767)
@@ -4,6 +4,7 @@
<scoreCalculator>
<scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
</scoreCalculator>
+ <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
<finish>
<feasableScore>-999999.0</feasableScore>
<!--<maximumSecondsSpend>429</maximumSecondsSpend>-->
More information about the jboss-svn-commits
mailing list