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

Optaplanner约束流连接问题事实和计划实体

蒲魁
2023-03-14

我试图将规划实体和一个问题事实加入到约束流中,但我的IDE抛出了一个错误:无法解析方法'join(java.lang.class ,org.optaplanner.core.api.score.stream.bi.bijoiner )'

我的问题结构和运输问题很相似。我有节点和边,想要计算边的数量。

我的主要问题是:

class Node{
   UUID id;
   int itemsInInventory;
   ...
}

和规划实体:

@PlanningEntity
class Edge{
   Node from;
   Node to; 
   @PlanningVariable
   int itemsTransported;

   getFromId(){return from.getId()}
   getToId(){return to.getId()}

}

约束的代码为:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
            .join(Edge.class, equal(Edge::getFromId, Edge::getId))
            ...
}

如果我尝试连接边与边,例如:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
            .join(Node, equal(Node:: getId, Node::getId)) //EDITED
            ...
}

这不会出错。原因是,我尝试将节点连接到节点的Edge属性中的Edge中吗?有没有别的办法可以做我想做的事?

共有1个答案

欧浩淼
2023-03-14

我不得不说我不明白你的后一个例子是如何运作的:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Node, equal(Node:: getId, Edge::getId))
        ...
}

在本例中,您正在连接节点和另一个节点。因此,equal(...)联接器需要在两侧使用node,如下所示:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Node.class, equal(Node::getId, Node::getId))
        ...
}

或者更简短地说:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Node.class, equal(Node::getId))
        ...
}

这也是您的第一个示例没有编译的原因:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Edge.class, equal(Edge::getFromId, Edge::getId))
        ...
}

在本例中,您将nodeedge连接起来,因此equal(...)连接器需要在左侧使用node并在右侧使用edge,如下所示:

public Constraint minimizeShortage(ConstraintFactory constraintFactory) {
    return constraintFactory.from(Node.class)
        .join(Edge.class, equal(Node::getId, Edge::getFromId))
        ...
}
 类似资料:
  • 我发现约束流无论如何都不适合我的目的,因为我无法在使用奖励或惩罚函数时控制基于匹配实体的分数级别。我将继续使用drools语法。

  • 我试图解决一个调度问题,它围绕着以下安排: 是否可以使用和实现约束?我尝试过以下路线: 我认为应该没有问题,但不确定如何获得这个来实现我想要的。这里是否需要?还是有一个不同的、更好的整体方法? 作为参考,ShiftAssignment类可以很容易地拥有如下所示的方法:

  • 我正试图用java的Optaplanner实现一个简单的云平衡系统,该系统具有过度约束的规划。 最喜欢的是,我正在尝试使用Optaplanner Java库实现一个简单的云平衡系统,该系统具有过度约束的规划。我将模型映射到我的问题(车辆和资产),进行变量替换cpuPower- 如果我使用这个简单的例子,我会收到一个所有进程都已签名的响应,尽管其中一些不能分配给计算机。对于这个问题,optaplan

  • 是否可以在OptaPlanner约束流中使用除inner join以外的其他join类型?在我的情况下,我需要做一个左联接。

  • 我想为VRP创建一个过度约束规划的增量分数。我创建了一个传统的虚拟车辆,其中包括所有计划外的客户。 示例: Optaplanner将Customer1从Vehicle1移动到Vehicle2: 当我得到AfterVariableChanged:previousStandstill(Customer1)时,在Customer.getVehicle()中,我有旧车辆的价值,我不知道是否需要添加软成本(

  • 我想用optaplanner设计一个预订系统,按照我的商业模式: 要预订预约,客户将选择: null 由于我对optaplanner是个新手,你能告诉我这是不是该走的路吗? 更新1:出于设计目的,我已经将问题简化到最小。