gpt4 book ai didi

java - ProblemFact 中具有 InverseRelationShadowVariable 的 PlanningEntity 字段未更新 - Optaplanner

转载 作者:行者123 更新时间:2023-12-02 01:53:57 25 4
gpt4 key购买 nike

我有一个ProblemFact AgentAvailability,它引用影子计划实体Agent(Agent没有 PlanningVariable,仅引用 PlanningEntity InverseRelationShadowVariable Shift)

这是我的类定义:

Shift.class

@PlanningEntity
public class Shift extends AbstractPersistable implements Comparable<Shift> {

@PlanningVariable(valueRangeProviderRefs = { "agentRange" }, nullable = true)
private Agent agent;
private Spot spot;

private LocalDateTime startDateTime;
private LocalDateTime endDateTime;

//Constructor, getters, setters and JPA annotations removed for clarity

Agent.class

@PlanningEntity
public class Agent implements Comparable<Agent> {

@PlanningId
private long registrationNumber;
private String username;
private boolean pro;

private SortedSet<Skill> skillSet = new TreeSet<>();

@InverseRelationShadowVariable(sourceVariableName = "agent")
private SortedSet<Shift> shiftSet = new TreeSet<>();

//Constructor, getters, setters and JPA annotations removed for clarity

AgentAvailability.class

public class AgentAvailability extends AbstractPersistable implements Comparable<AgentAvailability> {

private Agent agent;
private LocalDateTime startDateTime;
private LocalDateTime endDateTime;

//Constructor, getters, setters and JPA annotations removed for clarity

这是我的解决方案定义:

Schedule.class

@PlanningSolution
public class Schedule extends AbstractPersistable {

// ...
@ProblemFactCollectionProperty
@ValueRangeProvider(id = "agentRange")
private List<Agent> agentList = new ArrayList<>();

@ProblemFactCollectionProperty
private List<AgentAvailability> agentAvailabilities = new ArrayList<>();

@PlanningEntityCollectionProperty
private List<Shift> shifts = new ArrayList<>();

// ...
//Constructor, getters, setters and JPA annotations removed for clarity

inverseShadowVariable 按预期工作:当将 Agent 分配给 Shift 时,shiftSet 来自分配的代理会随着此轮类而更新。

问题出在 AgentAvailability 中的 agent 字段。

据我了解,当Optaplanner克隆解决方案时,根据documentation ,它重用 ProblemFacts 的实例,并使用克隆来规划实体。

由于 AgentAvailability 是一个事实,我假设它被重用(在调试器 View 中,情况就是如此,初始问题和找到的最佳解决方案之间的实例是相同的)

Schedule 中的

Agent 也已通过其 shiftSet 正确克隆到解决方案。

但问题是 AgentAvailability 中的 agent 字段仍然是原始问题中的 Agent 实例。

因此,AgentAvailability实例中agent的字段shiftSet仍然为空。

这是找到的最佳解决方案最后的情况,也是在计算过程中的情况。

因此,我不能使用这样的约束:

 return constraintFactory.from(AgentAvailability.class)
.groupBy(AgentAvailability::getAgent, count())
.filter((agent, availabilities) -> availabilities - agent.getShiftSet().size() > 0)
.penalizeConfigurableLong(ShiftSchedulingConstraintConfiguration.PRO_HAS_SHIFT, (agent, availabilities) -> availabilities - agent.getShiftSet().size());

因为 agent.getShiftSet().size() 始终返回 0,即使客服人员已分配类次。

一种可能的解决方法是使用 from(Agent.class) 子句,并与 AgentAvailities 和 Shift 结合以从 Agent 实体“重建”shiftSet。但是有没有办法从 AgentAvailabilityAgent 中的 Agent 实体“克隆”shiftSet,这样我就可以使用 中的代理字段AgentAvailability 已更新 shiftSet

最佳答案

这是您的模型的问题。您不能期望 AgentAvailability 既能被克隆又不能被克隆。如果AgentAvailability是一个问题事实,它不会被克隆,因此agent的值不会改变。

(旁注:也许我们应该检测一个实体是否是从规划事实中引用的,然后快速失败?我不知道这种情况除了麻烦之外会带来什么。)

此问题有多种解决方案。我建议您将 Agent 设为问题事实,并创建一个新实体 AgentAssignment,将 1 对 1 映射到 Agent。在此模型中,您可以在其他事实中自由引用 Agent 事实实例。

这样约束就变得相对容易编写。

from(AgentAssignment.class)
.join(AgentAvailability.class,
Joiners.equal(
AgentAssignment::getAgent,
AgentAvailability::getAgent))
.groupBy(
(agentAssignment, agentAvailability) -> agentAssignment,
countBi())
.filter((agentAssignment, availabilities) -> availabilities - agentAssignment.getShiftSet().size() > 0)
...

关于java - ProblemFact 中具有 InverseRelationShadowVariable 的 PlanningEntity 字段未更新 - Optaplanner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69854500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com