Optaplanner不使用其他BinAvailabilty来分配给事件

问题描述 投票:0回答:1
        @PlanningEntity
        public class BinAvailablity {
            private int id;
            private Interval interval;
            private Bin bin;
            private int roomMax;
            @InverseRelationShadowVariable(sourceVariableName = "binAvailablity")
            private List<Event> events = new ArrayList<>();
            private List<Interval> nonAvailablity;
        }


    public class Event {

        private int id;
        @CustomShadowVariable(variableListenerClass = IntervalAssigningListener.class,
                sources = {@PlanningVariableReference(variableName = "binAvailablity")})
        private Interval interval;//assignning listener variable
        private boolean isPinned;
        private TotalTime totalTime;
        @PlanningVariable(valueRangeProviderRefs = "binAvailablities")
        private BinAvailablity binAvailablity;//plannig variable
        private List<Staff> staffList;
        private List<Equipment> equipmentList;
        private List<Interval> nonAvailability;}

我的配置是:-

<?xml version="1.0" encoding="UTF-8"?>
<solver>
    <solutionClass>com.strategy.eagle.domains.optaplanner.EventBinAssignation</solutionClass>
    <entityClass>com.strategy.eagle.domains.optaplanner.Event</entityClass>
    <entityClass>com.strategy.eagle.domains.optaplanner.BinAvailablity</entityClass>
    <scoreDirectorFactory>
        <scoreDrl>Optaplanner/EventScheduling.drl</scoreDrl>
    </scoreDirectorFactory>
    <termination>
        <secondsSpentLimit>200</secondsSpentLimit>

        <bestScoreLimit>0hard/0soft</bestScoreLimit>


    </termination>


    <constructionHeuristic>
        <constructionHeuristicType>FIRST_FIT</constructionHeuristicType>
    </constructionHeuristic>
    <localSearch>

<!--       -->
        <localSearchType>HILL_CLIMBING</localSearchType>
    </localSearch>
</solver>

@ PlanningSolution公共类EventBinAssignation {

private String id;

@PlanningScore
private HardSoftScore score;

@ProblemFactCollectionProperty
@ValueRangeProvider(id = "binAvailablities")
List<BinAvailablity> binAvailablities;

@PlanningEntityCollectionProperty
List<Event> events;

}

我已经创建了两个具有Event和BinAvailability的实体。我需要将事件分配给binAvailablity。但Optaplanner仅将事件分配给第一个binAvailability。 Optaplanner没有使用任何其他binAvailbility来分配得分被卡住的事件,但是它没有使用任何其他binavalilbity来分配具有某些特定条件的事件。因此请帮助。

java optaplanner
1个回答
0
投票

如果OptaPlanner仅将事件分配给第一个binAvailability,则可能是因为您的硬约束不匹配(在scoreDrl中)。打开TRACE记录,并在每次CH移动期间寻找score编号。

或在DRL中将该约束的then中放入System.out.println。或迁移到ConstraintStreams并将调试器断点放在penalize() matchWeighter lamdba中。

© www.soinside.com 2019 - 2024. All rights reserved.