I did not really start on one example. I have scrolled through several to try to figure
out how to do it, then started from scratch for the POJO's and Rules.
The config file was copies from one of the examples because it contained too many things
that were hard to get right in the beginning.
I know that is a risk but I needed to start somewhere.
3) What does "The workingMemory has 2 ConstraintOccurrence(s) in excess:" really
mean?
- Are the constraints there more than once?
- has this something to do with the equals and hashcode (which I did implement (see
below))?
About the compensation action: is it already available on 5.4.0 final? Should I try
that?
4) I have been looking to the equals and hashcode, though found many examples that
implement solutionEquals and solutionHashcode instead.
Currently I implemented them like this:
@Override
public int hashCode() {
return id.hashCode(); //(*)
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (id == null || !(o instanceof MaintenanceTask)) {
return false;
} else {
MaintenanceTask other = (MaintenanceTask) o;
return id.equals(other.id);
}
}
(*) id is a String property which is passed into the entity object through the
constructor and upon cloning it is passed from the clone source to the
clone target:
public MaintenanceTask clone() {
System.out.println("Cloning task " + id);
MaintenanceTask clone = new MaintenanceTask(job, id);
clone.period = this.period;
clone.technician = this.technician;
return clone;
}
I am still confused about:
- Which ones do I need to implement (equals or solutionEquals, ...)?
- Should an entity and a cloned entity have the same result for both equals and
hashcode? (I guess so)
- Should only the entity objects have such implementations? (Planning variables are
never cloned, right?)
-----------------
http://www.codessentials.com - Your essential software, for free!
Follow us at
http://twitter.com/#!/Codessentials
________________________________
From: Geoffrey De Smet <ge0ffrey.spam(a)gmail.com>
To: Rules Users List <rules-users(a)lists.jboss.org>
Sent: Monday, September 3, 2012 10:44 AM
Subject: Re: [rules-users] Best model for planning? technicians, airplanes and shifts
=> insertLogical problems
Op 03-09-12 10:21, Michiel Vermandel schreef:
Hi Geoffrey,
Thanks for the support so far.
I understand that you do not provide full support on this level.
Though I have the feeling that this is really
- a very basic solution setup
- a beginners-mistake and since I'm looking into it now for about 3 days
(since I started with planner) it seems to be not obvious to find for a
beginner.
So I was trying my luck in offering the code.
It could be an opportunity to enrich the documentation ;-) ;-)
Good point, the score corruption problem is often a beginner problem and
it's a PITA. I 'll write some more docs about.
Do note that your 3 day implementation should be able to scale out to
10000 planes pretty easily, so hang in there :)
I fear you might have started copying from the wrong example nqueens (if
you did that) :/ Nurse rostering is a far more similar to this kind of
problem. I am not sure which example to promote in the docs: the nqueens
is simple enough to explain things on, but it's too simple to copy from
for real world stuff :/ Feedback welcome.
Ok,
1) adding the $t2 results in the same sort of exception, only
planningEntity seems different:
with insertLogical(new
UnweightedConstraintOccurrence("tasksInSameJobMustBeInSamePeriod", $t1,
$t2));
Exception in thread "main" java.lang.IllegalStateException: Score
corruption: the workingScore (-2) is not the uncorruptedScore (0):
The workingMemory has 2 ConstraintOccurrence(s) in excess:
tasksInSameJobMustBeInSamePeriod/NEGATIVE_HARD:[Maintenance of
Boeing 737 - PJ23.I#1 73111693, Maintenance of Boeing 737 - PJ23.I#2
427578167]
tasksInSameJobMustBeInSamePeriod/NEGATIVE_HARD:[Maintenance of
Boeing 737 - PJ23.I#2 427578167, Maintenance of Boeing 737 - PJ23.I#1
73111693]
Check the score rules who created those ConstraintOccurrences. Verify
that each ConstraintOccurrence's causes and weight is correct.
at
org.drools.planner.core.score.director.AbstractScoreDirector.assertWorkingScore(AbstractScoreDirector.java:101)
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:78)
at
org.drools.planner.core.constructionheuristic.greedyFit.DefaultGreedyFitSolverPhase.solve(DefaultGreedyFitSolverPhase.java:63)
at
org.drools.planner.core.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:183)
at
org.drools.planner.core.solver.DefaultSolver.solve(DefaultSolver.java:151)
at
be.axi.planner.domain.MaintenancePlanning.main(MaintenancePlanning.java:27)
with insertLogical(new
UnweightedConstraintOccurrence("tasksInSameJobMustBeInSamePeriod", $t1));
Exception in thread "main" java.lang.IllegalStateException: Score
corruption: the workingScore (-2) is not the uncorruptedScore (0):
The workingMemory has 2 ConstraintOccurrence(s) in excess:
tasksInSameJobMustBeInSamePeriod/NEGATIVE_HARD:[Maintenance of
Airbus A350 - XJ34.I#2 778813475]
tasksInSameJobMustBeInSamePeriod/NEGATIVE_HARD:[Maintenance of
Airbus A350 - XJ34.I#0 225744121]
Check the score rules who created those ConstraintOccurrences. Verify
that each ConstraintOccurrence's causes and weight is correct.
at
org.drools.planner.core.score.director.AbstractScoreDirector.assertWorkingScore(AbstractScoreDirector.java:101)
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:78)
at
org.drools.planner.core.constructionheuristic.greedyFit.DefaultGreedyFitSolverPhase.solve(DefaultGreedyFitSolverPhase.java:63)
at
org.drools.planner.core.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:183)
at
org.drools.planner.core.solver.DefaultSolver.solve(DefaultSolver.java:151)
at
be.axi.planner.domain.MaintenancePlanning.main(MaintenancePlanning.java:27)
2) You suggested to replace UnweightedConstraintOccurrence with
IntConstraintOccurrence. I will.
UnweightedConstraintOccurrence is used in the very basic Queens example
though...
Yep, my mistake.
3) Where is the best place to read about what insertLogical and
IntConstraintOccurrence really do?
What is the purpose of the Cause -objects, which should be passed?
=> where is the best place to find explanation about this?
(
http://docs.jboss.org/drools/release/5.4.0.Final/drools-planner-docs/html...
doesn't really enlighten me on that part)
Look for "insertLogical" in the Drools Expert guide:
http://docs.jboss.org/drools/release/5.4.0.Final/drools-expert-docs/html_...
When rules do an insertLogical of an object A, it's discarded if another
object B in the WorkingMemory equals object A (through equals() and
through hashcode()). Because the ConstraintOccurrences need to be unique
so they aren't discarded, they ruleId, constraintType and causes are
used for equals()/hashcode().
Future work: "compensation action"
Recently, drools introduced something called "compensation action",
which can probably replace the use insertLogical(ConstraintOccurrence)
and make the causes parameter obsolete.
It's also faster.
My first experiments look very promising, but I haven't got time yet to
experiment with it on all examples and make it easy for users to use.
It would allow us to do something like this in the then part of a rule:
hardAndSoftScoreHelper.addHardScore(-5);
or
hardAndSoftScoreHelper.addSoftScore(- $sum);
or
simpleScoreHelper.addScore(-7);
No need for causes, insertLogicals, no equals/hashcode() worries, much
more flexible, ...
4) Does your MaintenanceTask implement equals()/hashcode() other than
Object's original implementation?
Thanks in advance.
yw
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users