@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来分配具有某些特定条件的事件。因此请帮助。
如果OptaPlanner仅将事件分配给第一个binAvailability,则可能是因为您的硬约束不匹配(在scoreDrl中)。打开TRACE
记录,并在每次CH移动期间寻找score
编号。
或在DRL中将该约束的then
中放入System.out.println。或迁移到ConstraintStreams并将调试器断点放在penalize()
matchWeighter lamdba中。