当前位置: 首页 > 知识库问答 >
问题:

使用计算值计算分数时分数损坏

归泽宇
2023-03-14

我有一个用例,其中:

  1. A、B和C表示,一份工作可以有多种类型。

我的@PlanningEntity是分配,startTime和tool是@PlanningVariable。我尝试在分配中添加currentConfiguredToolType作为@CustomShadowVariable,并在shadowListener的afterVariableChanged()方法中更新toolType,以便为分配给该工具的下一个作业提供正确的toolType。然而,它给了我不一致的结果。

[编辑]:我进行了一些调试,以查看工具类型是否设置正确。我发现afterVariableChanged()方法中的工具类型设置正确。但是,当我查看分配给该工具的下一个作业时,我发现工具类型没有更改。是因为多个线程执行此流吗?一个线程第一次更改工具类型,然后第二个线程第二次同时指定时间,而不考虑第一个线程所做的更改。

[编辑]:我之前使用6.3.0最终版(直到昨天)。我今天切换到6.5.0决赛。在那里,我也看到了类似的结果,其中的工具类型似乎是正确设置的,在变量改变()方法,但不考虑该工具的下一个分配。

[编辑]:域代码如下所示:

@PlanningEntity
public class Allocation {

private Job job;

// planning variables
private LocalDateTime startTime;
private Tool tool;

 //shadow variable
 private ToolType toolType;

 private LocalDateTime endTime;

 @PlanningVariable(valueRangeProviderRefs = TOOL_RANGE)
 public Tool getTool() {
    return  this.tool;
 }

 @PlanningVariable(valueRangeProviderRefs = START_TIME_RANGE)
 public LocalDateTime getStartTime() {
    return this.startTime;
 }

 @CustomShadowVariable(variableListenerClass = ToolTypeVariableListener.class,
        sources = {@CustomShadowVariable.Source(variableName = "tool")})
 public ToolType getCurrentToolType() {
   return this.toolType;
 }

 private void setToolType(ToolType type) {
    this.toolType = type;
    this.tool.setToolType(type);
 } 

 private setStartTime(LocalDateTime startTime) {
    this.startTime = startTime;
    this.endTime = getTimeTakenForJob() + getTypeChangeTime();
    ...
 }

 private LocalDateTime getTypeChangeTime() {
 //typeChangeTimeMap is available and is populated with data
    return typeChangeTimeMap.get(tool.getType);
 }

}

public class Tool {
 ...
private ToolType toolType;
getter and setter for this.

public void setToolType() { ...}

public ToolType getToolType() { ...}

}


public class ToolTypeVariableListener implements VariableListener<Allocation> {
...
@Override
public void afterVariableChanged(ScoreDirector scoreDirector, Allocation entity) {
  scoreDirector.afterVariableChanged(entity, "currentToolType");
  if (entity.getTool() != null && entity.getStartTime() != null) {
     entity.setCurrentToolType(entity.getJob().getType());
  }
  scoreDirector.afterVariableChanged(entity, "currentToolType");
}

[编辑]:当我进行一些调试时,似乎机器中的一个分配的工具类型集用于计算属于不同计算集的分配的类型更改时间。不知道如何避免这种情况。

如果情况确实如此,在项目状态影响时间的情况下,有什么好的方法来模拟这样的问题?还是我完全疯了。我想我完全迷路了。

[编辑]:这不是如何调用Optaplanner的问题,而是当添加基于endTime惩罚它的规则时,得分损坏。更多详情请见评论。

[编辑]:我逐一注释了规则中指定的规则,发现只有当计算的分数取决于计算值时才会发生分数损坏:endTimetoolTypeChange。如果分数取决于startTime,这是一个planningVariable,则可以。然而,这并没有给我最好的结果。它为我提供了一个硬分数为负的解决方案,这意味着它违反了规则,即在同一时间不将同一工具分配给不同的作业。计算值不能用于分数计算吗?

非常感谢您的帮助或指点。

最好的

爱丽丝

共有1个答案

邹书
2023-03-14

ToolTypeVariableListener似乎缺少before/after方法的类,这可能导致分数损坏。启用FULL\u ASSERT进行验证。

 类似资料:
  • 机器学习通常需要大量的数值计算。通过迭代更新估计的过程来解决数学问题,而不去求得一个公式化的结果。通常的操作包括优化和求解线性方程系统。对于采用有限的记忆储存的不能精确表述的问题,即使是估计在数值计算机上估计一个函数方程的2解都是很困难的。(注,MNIST,Mixed National Institute of Standards and Technology database,国家标准与技术研究

  • 主要内容:1. 如何创建计算字段,2. Tableau计算编辑器,3. 创建一个公式,4. 使用计算字段,5. 应用聚合计算在Tableau中,使用公式编辑器中提供的各种内置函数完成数值计算。 下面我们看看如何将计算应用于字段。计算很简单,只需减去两个字段的值或将聚合函数用于单个字段。 以下是创建计算字段并在其中使用数字函数的步骤。 1. 如何创建计算字段 连接到Sample-Superstore等数据源后。 转到分析(Analysis)菜单。 然后单击Create Calculated Fie

  • 更新时间:2019-05-30 10:48:26 节点简介 数值计算节点可以让你在无需写代码的情况下完成简单的逻辑运算。 使用场景 你可以用数值计算节点完成设备属性的单位转换、属性与属性相加、多个设备属性之间取最大值、最小值、平均值等简单的逻辑运算操作。 配置项 数据源 数据源可以配置你数值计算的处理来源、可以为静态数据、动态数据、或参数方式 静态数据 静态数据为静态数据类型,为固定的数据 静态数

  • 我尝试使用曲线拟合来定义以下形式的函数: 我想计算参数Rth和tau的第一个四个值。目前,它的作品罚款如果我使用整个功能像这样: 但这肯定不是一个好方法,例如,如果我有一个包含4个以上指数项的很长的函数,我想得到所有的参数。如何调整它,使其在曲线拟合后返回特定数量的Rth和tau值? 例如,如果我想从一个8项指数函数中得到16个参数,我不需要写完整的8项,只需要写一个一般形式,它就会给出所需的输出

  • 本文向大家介绍使用 JavaScript 从秒数开始计算小时和分钟,包括了使用 JavaScript 从秒数开始计算小时和分钟的使用技巧和注意事项,需要的朋友参考一下 问题 我们需要编写一个以秒为单位的JavaScript函数,并返回秒数中包含的小时数和分钟数。 输入 输出 示例 以下是代码- 输出结果

  • 这5个国家在所有奥运会上获得的奖牌中,每个国家获得的奖牌比例是多少?

  • 问题内容: 有没有一种方法可以使用C计算文件中的行数? 问题答案: 如果要以编程方式执行此操作,请以文本模式打开文件并执行fgetc()操作,直到到达文件末尾。记下调用fgetc的次数。

  • 问题内容: 我正在尝试从DataFrame计算列中每个值的百分位数。 有没有更好的方法来编写以下代码? 我希望看到更好的性能。 问题答案: 似乎您想要: 性能: