Java 如何解决“;退出无延迟选择器以避免无限循环”;I'时出错;我在Optaplanner中使用了@PlanningPin?
我想使用optaplanner的“pin”功能进行固定操作。然而,我得到了“退出无延迟选择器(过滤(从SolutionEntitySelector(PersonalAssignment))以避免无限循环”的错误。我用@PlanningPin和movableEntitySelectionFilter都试过了。Optaplanner版本是7.32.0最终版,我也尝试了7.44.0.最终版。我已经搜索了很多,我可以看到您已经在7.31.0.Final版本中解决了这个问题 我已经生成了我的域,它运行良好。我的问题是这里不止一家酒店。人们在不同的时间来旅馆。每个酒店都有不同的容量,如果有足够的空间,我想让人们去酒店。关于作业,我也有很多规定。我的域模型由两个@PlanningEntity、customShadowVariable和TimeGrain组成。结构如下:Java 如何解决“;退出无延迟选择器以避免无限循环”;I'时出错;我在Optaplanner中使用了@PlanningPin?,java,optaplanner,Java,Optaplanner,我想使用optaplanner的“pin”功能进行固定操作。然而,我得到了“退出无延迟选择器(过滤(从SolutionEntitySelector(PersonalAssignment))以避免无限循环”的错误。我用@PlanningPin和movableEntitySelectionFilter都试过了。Optaplanner版本是7.32.0最终版,我也尝试了7.44.0.最终版。我已经搜索了很多,我可以看到您已经在7.31.0.Final版本中解决了这个问题 我已经生成了我的域,它运行良好
@PlanningEntity(movableEntitySelectionFilter = PersonAssignmentSelectionFilter.class)
public class PersonAssignment extends AbstractPersistable {
private Person person;
private TimeGrain startingTimeGrain;
private TimeGrain endTime; // This added
private HotelDomain hotelDomain;
public TimeGrain getStartingTimeGrain() {
return startingTimeGrain;
}
public void setStartingTimeGrain(TimeGrain startingTimeGrain) {
this.startingTimeGrain = startingTimeGrain;
}
public TimeGrain getEndTime() {
return endTime;
}
public void setEndTime(TimeGrain endTime) {
this.endTime = endTime;
}
@PlanningVariable(valueRangeProviderRefs = { "hotelDomainRange" }, nullable = true)
public HotelDomain getHotelDomain() {
return hotelDomain;
}
public void setHotelDomain(HotelDomain hotelDomain) {
this.hotelDomain = hotelDomain;
}
......
}
@DeepPlanningClone
公共类HotelDomain扩展了AbstractPersistable{
私人字符串酒店名称;
@CustomShadowVariable(variableListenerRef=@PlanningVariableReference(variableName=“紧占用,角色分配))
私人地图hotelOccupancyMap;
......
}
@PlanningEntity
公共类HotelOccupPancyperSlot扩展了AbstractPersistable{
@CustomShadowVariable(variableListenerClass=HotelDomainConservalListener.class,源={
@PlanningVariableReference(entityClass=PersonalAssignment.class,variableName=“hotelDomain”)})
私人整数占用;//天
@CustomShadowVariable(variableListenerRef=@PlanningVariableReference(variableName=“紧占用”))
私人名单人物;
.......
}
公共类HotelDomainConservateListener实现VariableListener{
......
}
config.xml是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<solver>
<moveThreadCount>3</moveThreadCount> <!-- To solve faster by saturating multiple CPU cores -->
<solutionClass>com.domain.HotelAccomodation</solutionClass>
<entityClass>com.domain.PersonAssignment</entityClass>
<entityClass>com.domain.HotelOccupancyPerSlot</entityClass>
<scoreDirectorFactory>
<scoreDrl>solver/solverScoreRules.drl</scoreDrl>
</scoreDirectorFactory>
<termination>
<minutesSpentLimit>15</minutesSpentLimit>
</termination>
</solver>
3.
com.domain.hotelacomodation
com.domain.PersonAssignment
com.domain.HotelOccupancyPerSlot
解算器/解算器核心规则.drl
15
如果我在HotelOccupanTyperSlot中使用@PlannigPin,没有问题,但我只想在PersonalAssignment类中使用它(或过滤器),因为它是我的基本类。有什么建议吗?我应该在配置中添加一些东西吗
谢谢:)当移动选择过滤器过滤掉每一个移动时,就会出现“退出”警告(它永远不会返回true)。这不是一个错误,而是一个警告,因为如果你只看到一次,理论上在某些情况下可能是无害的侥幸
无论如何,对于所有选定的移动,筛选器何时返回false
- A) 您在solverConfig.xml中配置了一个从未返回
true
- B) 解决方案值范围没有值-OptaPlanner检查ins 7.44+是否正确,并自动执行正确的操作。如果有2个计划变量且只有1个没有值,则不确定是否执行正确的操作
- C) 解决方案值范围只有一个值-这意味着move isDoable()为false。但我不记得这是一个问题
- D) 解决方案值范围没有非固定值。请参见B)
- E) 解决方案值范围只有1个非固定值。请参见C)
看看你的输入数据。你是在处理案例B、C、D还是E吗?案例D。当所有的PersonalAssignment实体都被锁定时,它会给出这个警告。它只记录这个警告,然后什么都不会发生。啊,我明白了。因为不是所有的酒店分配都被锁定,你不能只说“那么,解决这个问题没有意义。”“。这是一个问题,请创建一个jira。
@PlanningEntity
public class HotelOccupancyPerSlot extends AbstractPersistable {
@CustomShadowVariable(variableListenerClass = HotelDomainVariableListener.class, sources = {
@PlanningVariableReference(entityClass = PersonAssignment.class, variableName = "hotelDomain") })
private Integer tightOccupancy; // days
@CustomShadowVariable(variableListenerRef = @PlanningVariableReference(variableName = "tightOccupancy"))
private List<PersonAssignment> personAssignments;
.......
}
public class HotelDomainVariableListener implements VariableListener<PersonAssignment> {
......
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<solver>
<moveThreadCount>3</moveThreadCount> <!-- To solve faster by saturating multiple CPU cores -->
<solutionClass>com.domain.HotelAccomodation</solutionClass>
<entityClass>com.domain.PersonAssignment</entityClass>
<entityClass>com.domain.HotelOccupancyPerSlot</entityClass>
<scoreDirectorFactory>
<scoreDrl>solver/solverScoreRules.drl</scoreDrl>
</scoreDirectorFactory>
<termination>
<minutesSpentLimit>15</minutesSpentLimit>
</termination>
</solver>