[rules-users] Problem with chained planning variables
Juan Ignacio Barisich
juan.barisich at gmail.com
Mon Oct 28 12:27:23 EDT 2013
Thanks Geoffrey. One more question: Is there a planned release date for
optaplanner 6.0.0.Final ?
Thanks again
2013/10/25 Geoffrey De Smet <ge0ffrey.spam at gmail.com>
> Upgrade to 6.0.0.CR5 (follow the upgrade recipe txt)
> and take advantage of the new feature called "shadow variables" (see docs).
> Also see the VRP with timewindows example for an implementation that uses
> shadow variables :)
>
>
> On 25-10-13 00:27, Juan Ignacio Barisich wrote:
>
> Hi again. The problem was a score corruption issue. When I activate
> de mode debug:
>
> <environmentMode>DEBUG</environmentMode>
>
> some exceptions appear, like:
>
> java.lang.IllegalStateException: Score corruption: the workingScore
> (0hard/-35soft) is not the uncorruptedScore (0hard/-31soft)...
>
> I had to fix some rules, but I cant fix one in particular. When I looking
> at the example rules (with chained variables), the most are based only on
> the previous item of the chain, e.g.:
>
> rule "distanceToPreviousAppearance"
> when
> $visit : Visit(previousAppearance != null,
> $distanceToPreviousAppearance : distanceToPreviousAppearance)
> then
> insertLogical(new
> IntConstraintOccurrence("distanceToPreviousAppearance",
> ConstraintType.NEGATIVE_SOFT,
> $distanceToPreviousAppearance,
> $visit));
> end
>
> When optaplanner do the moves while planning, the IntConstraintOccurrence
> works ok, because the drools engine "retracts" the IntConstraintOccurrence
> facts properly. But, in my case the score caculation must be based on the
> entire chain. That is:
>
> I have some Doctors, and Cases (medical cases). I have to write a score
> rule for consider the delay of attention. So, each Case has a request time
> (when the patient calls) and a approximate duration of the case (in
> minutes). So, if I have the next chain:
>
> Doctor1 -> Case1 (requestTime:8am, duration:60minutes) -> Case2(requestTime:8:30am,
> duration:30minutes) -> Case3(requestTime:8:30am, duration:30minutes)
>
> the delay time for this solution must be: 30min(for Case2) + 60min(for
> Case3) = 90 minutes. As yo see, you can't calculate the delay of one Case
> only as from its previous on the chain.
>
> I must to implement a rule to calculate a soft constraint, to achive
> less-delay plannings. My first attempt looks like:
>
> rule "delaySC"
> when
> $case : Case( )
> eval($case.getDelay() > 0)
> then
> insertLogical(new IntConstraintOccurrence("delaySC",
> ConstraintType.NEGATIVE_SOFT,
> $case.getDelay(), $case));
> end
>
> I have to do an eval(), because a delay can not be negative. The
> getDelay() method process the chain and calculates it. The problem of this
> attempt, an other similars, is when the optaplanner engine do the moves
> while solving, the IntConstraintOccurrence is not retracted and the score
> corruption exception appears.
>
> The question is: ¿have you know similar scenarios, in which you have to
> process the entire chain to calculate the score of a solution? ¿is there
> a way to solve this?
>
> Thanks
>
> Regards
>
>
>
>
>
>
>
> 2013/9/2 Juan Ignacio Barisich <juan.barisich at gmail.com>
>
>> Hi everybody.
>> I have a problem with chained planning variables.
>> I'm using optaplanner 5.5.0.Final.
>> I have a planning entity like:
>>
>> @PlanningEntity()
>> public class Case implements Chained {
>> private Chained previous;
>> @PlanningVariable(chained = true)
>> @ValueRanges({
>> @ValueRange(type = ValueRangeType.FROM_SOLUTION_PROPERTY,
>> solutionProperty = "doctors"),
>> @ValueRange(type = ValueRangeType.FROM_SOLUTION_PROPERTY,
>> solutionProperty = "cases", excludeUninitializedPlanningEntity = true) })
>> public Chained getPrevious() {
>> return previous;
>> }
>> }
>>
>> A fact class:
>> public class Doctor implements Chained {
>> ...
>> }
>>
>> An a solution class:
>> public class Plan extends implements Solution<HardAndSoftScore> {
>> private List<Doctor> doctors;
>> private List<Case> cases;
>> private HardAndSoftScore score;
>>
>> @PlanningEntityCollectionProperty
>> public List<Case> getCases() {
>> return cases;
>> }
>>
>> public Collection<? extends Object> getProblemFacts() {
>> return new ArrayList<Doctor>(doctors);
>> }
>> }
>>
>> The equals / hashCode / clone methods are inspired on the
>> TravelingSalesmanTour example.
>>
>> I want that Optaplanner generates chains like:
>> DoctorA <- Case1 <- Case2
>> DoctorB <- Case3
>>
>> This model tries to represent a list of Cases assigned to each Doctor.
>> Suppose I build a solution like:
>>
>> Plan plan = new Plan();
>> plan.setDoctors(DoctorA, DoctorB); //pseudo-code
>> plan.setCases(Case1, Case2); //pseudo-code
>>
>> Then I build a solver:
>> Solver solver = getSolverFactory().buildSolver();
>> solver.setPlanningProblem(plan);
>> solver.solve();
>> Plan bestPlan = (Plan) solver.getBestSolution();
>>
>> The problem is that, Optaplanner is not testing all the posible
>> combinations of chains. I mean, suppose that we know that the better
>> solution (based on the scoring rules) is:
>> DoctorA
>> DoctorB <- Case1 <- Case2
>>
>> But Optaplanner seems to test only chains with DoctorA, so the result
>> of calling getBestSolution() is:
>> DoctorA <- Case1 <- Case2
>>
>> I guess that Optaplanner only test chains whit DoctorA, becouse it logs
>> lines like:
>> ...
>> DEBUG: org.drools.planner.core.localsearch.DefaultLocalSearchSolverPhase
>> - Step index (1), time spend (20002), score (1hard/2soft), best
>> score (1hard/2soft), accepted/selected move count (0/58187) for picked step
>> (Case [id=2, previous=Doctor [id=1]] => Case [id=1, previous=Case [id=2,
>> previous=Doctor [id=1]]]).
>> ...
>> That is, no lines whith "DoctorB" are logged.
>> If the doctor list is inverted, the same problem happen (the DoctorA is
>> no processed). That is:
>>
>> Plan plan = new Plan();
>> plan.setDoctors(DoctorB, DoctorA); //pseudo-code
>> plan.setCases(Case1, Case2); //pseudo-code
>> Solver solver = getSolverFactory().buildSolver();
>> solver.setPlanningProblem(plan);
>> solver.solve(); // DoctorA is not part of chains
>>
>>
>> I guess the problem is on the solver configuration, specifically on the
>> localSearch configuration:
>>
>> <localSearch>
>> <unionMoveSelector>
>> <changeMoveSelector>
>> <valueSelector/>
>> </changeMoveSelector>
>> <swapMoveSelector />
>> <subChainChangeMoveSelector>
>> <selectReversingMoveToo>true</selectReversingMoveToo>
>> </subChainChangeMoveSelector>
>> <subChainSwapMoveSelector>
>> <selectReversingMoveToo>true</selectReversingMoveToo>
>> </subChainSwapMoveSelector>
>> </unionMoveSelector>
>> <acceptor>
>> <planningEntityTabuSize>9</planningEntityTabuSize>
>> </acceptor>
>> <forager>
>> <minimalAcceptedSelection>2000</minimalAcceptedSelection>
>> </forager>
>> </localSearch>
>>
>> I tried some alternatives to this configuration, but with no success.
>>
>> Do you know what I am doing wrong?
>>
>> Thanks a lot.
>>
>> Regards
>>
>
>
>
> _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20131028/793b29ad/attachment.html
More information about the rules-users
mailing list