12:57:41.050 [main] INFO o.d.p.core.solver.DefaultSolver
- Solving started: time spend (152), score (null), new best
score (null), random seed (0).
Exception in thread "main" Exception executing
consequence for rule "requiredCpuPowerTotal" in
com.swa.planner.domain.rule: java.lang.NullPointerException
at
org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297)
at
org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221)
at
org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456)
at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710)
at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674)
at
org.drools.planner.core.score.director.drools.DroolsScoreDirector.calculateScore(DroolsScoreDirector.java:177)
at
org.drools.planner.core.solver.scope.DefaultSolverScope.calculateScore(DefaultSolverScope.java:92)
at
org.drools.planner.core.phase.AbstractSolverPhaseScope.calculateScore(AbstractSolverPhaseScope.java:120)
at
org.drools.planner.core.constructionheuristic.greedyFit.decider.DefaultGreedyDecider.processMove(DefaultGreedyDecider.java:136)
at
org.drools.planner.core.constructionheuristic.greedyFit.decider.DefaultGreedyDecider.doMove(DefaultGreedyDecider.java:110)
at
org.drools.planner.core.constructionheuristic.greedyFit.decider.DefaultGreedyDecider.decideNextStep(DefaultGreedyDecider.java:82)
at
org.drools.planner.core.constructionheuristic.greedyFit.DefaultGreedyFitSolverPhase.solve(DefaultGreedyFitSolverPhase.java:65)
at
org.drools.planner.core.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:190)
at
org.drools.planner.core.solver.DefaultSolver.solve(DefaultSolver.java:155)
at
com.swa.planner.domain.CloudTest.main(CloudTest.java:67)
Caused by: java.lang.NullPointerException
at
java.lang.String.<init>(Unknown Source)
at
org.mvel2.util.ErrorUtil.rewriteIfNeeded(ErrorUtil.java:12)
at
org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:302)
at
org.mvel2.compiler.ExpressionCompiler.compile(ExpressionCompiler.java:62)
at
org.mvel2.MVEL.compileExpression(MVEL.java:810)
at
org.drools.base.mvel.MVELCompilationUnit.compile(MVELCompilationUnit.java:435)
at
org.drools.base.mvel.MVELCompilationUnit.getCompiledExpression(MVELCompilationUnit.java:238)
at
org.drools.rule.constraint.MvelConstraint.createMvelConditionEvaluator(MvelConstraint.java:206)
at
org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:190)
at
org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157)
at
org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:137)
at
org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:497)
at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:382)
at
org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:235)
at
org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:240)
at
org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:350)
at
org.drools.common.SimpleBeliefSystem.insert(SimpleBeliefSystem.java:38)
at
org.drools.common.TruthMaintenanceSystem.addLogicalDependency(TruthMaintenanceSystem.java:204)
at
org.drools.common.TruthMaintenanceSystem.addLogicalDependency(TruthMaintenanceSystem.java:176)
at
org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:231)
at
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:903)
at
org.drools.base.DefaultKnowledgeHelper.insertLogical(DefaultKnowledgeHelper.java:245)
at
org.drools.base.DefaultKnowledgeHelper.insertLogical(DefaultKnowledgeHelper.java:210)
at
org.drools.base.DefaultKnowledgeHelper.insertLogical(DefaultKnowledgeHelper.java:205)
at
com.swa.planner.domain.rule.Rule_requiredCpuPowerTotal_0a10acbeca924206a3becab080617987.defaultConsequence(Rule_requiredCpuPowerTotal_0a10acbeca924206a3becab080617987.java:14)
at
com.swa.planner.domain.rule.Rule_requiredCpuPowerTotal_0a10acbeca924206a3becab080617987DefaultConsequenceInvokerGenerated.evaluate(Unknown
Source)
at
com.swa.planner.domain.rule.Rule_requiredCpuPowerTotal_0a10acbeca924206a3becab080617987DefaultConsequenceInvoker.evaluate(Unknown
Source)
at
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1287)
... 14
more
package com.swa.planner.domain;
import
org.drools.planner.api.domain.entity.PlanningEntity;
import
org.drools.planner.api.domain.variable.PlanningVariable;
import org.drools.planner.api.domain.variable.ValueRange;
import
org.drools.planner.api.domain.variable.ValueRangeType;
import
org.drools.planner.examples.common.domain.AbstractPersistable;
@PlanningEntity(difficultyComparatorClass =
CloudProcessDifficultyComparator.class)
public class CloudProcess extends AbstractPersistable{
private
int requiredCpuPower;
private
int requiredMemory;
private
int requiredNetworkBandwidth;
private
CloudComputer computer;
public
CloudProcess(long id, int requiredCpuPower, int
requiredMemory,
int
requiredNetworkBandwidth) {
super();
setId(id);
this.requiredCpuPower
= requiredCpuPower;
this.requiredMemory
= requiredMemory;
this.requiredNetworkBandwidth
= requiredNetworkBandwidth;
}
public
CloudProcess() { }
public
int getRequiredCpuPower() {
return
requiredCpuPower;
}
public
void setRequiredCpuPower(int requiredCpuPower) {
this.requiredCpuPower
= requiredCpuPower;
}
public
int getRequiredMemory() {
return
requiredMemory;
}
public
void setRequiredMemory(int requiredMemory) {
this.requiredMemory
= requiredMemory;
}
public
int getRequiredNetworkBandwidth() {
return
requiredNetworkBandwidth;
}
public
void setRequiredNetworkBandwidth(int
requiredNetworkBandwidth) {
this.requiredNetworkBandwidth
= requiredNetworkBandwidth;
}
public
String getLabel() {
return "Process " + id;
}
@PlanningVariable(strengthComparatorClass
= CloudComputerStrengthComparator.class)
@ValueRange(type
= ValueRangeType.FROM_SOLUTION_PROPERTY, solutionProperty =
"computerList")
public
CloudComputer getComputer() {
if
(computer == null) { return null; }
return
computer;
}
public
void setComputer(CloudComputer computer) {
this.computer
= computer;
}
public
CloudProcess clone(){
CloudProcess
clone = new CloudProcess();
clone.requiredCpuPower
= requiredCpuPower;
clone.requiredMemory
= requiredMemory;
clone.requiredNetworkBandwidth
= requiredNetworkBandwidth;
clone.computer
= computer;
return
clone;
}
public
int getRequiredMultiplicand() {
return requiredCpuPower * requiredMemory *
requiredNetworkBandwidth;
}
}
--------------
this is what i'm doing to run the example:
-------------
package com.swa.planner.domain;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import org.drools.planner.config.SolverFactory;
import org.drools.planner.config.XmlSolverFactory;
import org.drools.planner.core.Solver;
public class CloudTest {
public
static void main(String[] args) {
String
t = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+
"<solver>"
+ "
<solutionClass>com.swa.planner.domain.CloudBalance</solutionClass>"
+ "
<planningEntityClass>com.swa.planner.domain.CloudProcess</planningEntityClass>"
+ "
<scoreDirectorFactory>"
+ "
<scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>"
+ "
<scoreDrl>/com/swa/planner/domain/rule/cloudBalancingScoreRules.drl</scoreDrl>"
+ "
</scoreDirectorFactory>"
+ "
<termination>"
+ "
<maximumSecondsSpend>120</maximumSecondsSpend>"
+ "
</termination>"
+ "
<constructionHeuristic>"
+ "
<constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>"
+ "
<constructionHeuristicPickEarlyType>FIRST_LAST_STEP_SCORE_EQUAL_OR_IMPROVING</constructionHeuristicPickEarlyType>"
+ "
</constructionHeuristic>"
+ "
<localSearch>"
+ "
<acceptor>"
+ "
<planningEntityTabuSize>7</planningEntityTabuSize>"
+ "
</acceptor>"
+ "
<forager>"
+ "
<minimalAcceptedSelection>1000</minimalAcceptedSelection>"
+ "
</forager>"
+ "
</localSearch>"
+
"</solver>";
byte
b[] = t.getBytes();
ByteArrayInputStream
bt = new ByteArrayInputStream(b);
SolverFactory
solverFactory = new XmlSolverFactory().configure(bt);
Solver
solver = solverFactory.buildSolver();
List<CloudComputer>
computerList = new ArrayList<CloudComputer>();
computerList.add(new
CloudComputer(1L, "Computador 1", 3, 2, 2, 110));
computerList.add(new
CloudComputer(2L, "Computador 2", 12, 8, 3, 400));
computerList.add(new
CloudComputer(3L, "Computador 3", 6, 6, 4, 300));
computerList.add(new
CloudComputer(4L, "Computador 4", 18, 12, 8, 1000));
computerList.add(new
CloudComputer(5L, "Computador 5", 8, 4, 6, 800));
computerList.add(new
CloudComputer(6L, "Computador 6", 9, 7, 9, 1000));
List<CloudProcess>
processList = new ArrayList<CloudProcess>();
processList.add(new
CloudProcess(11L, 2, 2, 2));
processList.add(new
CloudProcess(12L, 4, 4, 2));
processList.add(new
CloudProcess(13L, 1, 1, 3));
processList.add(new
CloudProcess(14L, 7, 3, 5));
processList.add(new
CloudProcess(15L, 5, 8, 3));
processList.add(new
CloudProcess(16L, 9, 2, 2));
processList.add(new
CloudProcess(17L, 6, 5, 6));
CloudBalance
cloudBalance = new CloudBalance();
cloudBalance.setId(0L);
cloudBalance.setComputerList(computerList);
cloudBalance.setProcessList(processList);
//
Solve the problem
solver.setPlanningProblem(cloudBalance);
solver.solve();
CloudBalance
solvedCloudBalance = (CloudBalance)
solver.getBestSolution();
//
Display the result
System.out.println("\nSolved
cloudBalance with 5 computers and 6 processes:\n"
+
toDisplayString(solvedCloudBalance));
}
public
static String toDisplayString(CloudBalance cloudBalance) {
StringBuilder
displayString = new StringBuilder();
for
(CloudProcess process : cloudBalance.getProcessList()) {
CloudComputer
computer = process.getComputer();
displayString.append("
").append(process.getLabel())
.append("
-> ")
.append(computer
== null ? null : computer.getLabel())
.append("\n");
}
return
displayString.toString();
}
}
-------------