0

我想在我的 OptaPlanner 示例中设置两个约束:

  1. 匹配每个订单产品 SKU 并将其分配给持有该产品 SKU 的库存位置。
  2. 一个 Stock Location 一次最多有 30 个订单,如果有超过 30 个具有相同产品 SKU 的订单,则将其余的分配到具有相同产品 SKU 的另一个 Stock Location。

我怎样才能做到这一点?这是我尝试过但对我不起作用的一个约束(Shopify 是我的 Orders 表):

   Constraint productSKU(ConstraintFactory constraintFactory) {
        
        return constraintFactory
                .from(Shopify.class).join(Shopify.class, Joiners.equal(Shopify::getProductSKU),
                        Joiners.equal(Shopify::getStockLocation))
                .filter((shopify, stockLocation) ->
                        stockLocation.getStockLocation().getProductSKU() == shopify.getProductSKU())
                .reward("Correct Allocated SKU", HardSoftScore.ONE_SOFT);

    }

也需要10多分钟才能解决,我怎样才能加快解决时间?

任何帮助表示赞赏!

4

1 回答 1

1

假设您总是希望Product SKU匹配,如果不匹配,我宁愿用硬分来惩罚,因为这样的解决方案很可能是不可行的。

现在,进一步假设Shopify是你的@PlanningEntity,约束可以通过以下方式简化:

return constraintFactory
            .from(Shopify.class)
            .filter((shopify) ->
                    !Objects.equals(shopify.getStockLocation().getProductSKU()), shopify.getProductSKU()))
            .penalize("Correct Allocated SKU", HardSoftScore.ONE_HARD);

请注意,上面的代码摘录仅用于说明,可能与您的域类不兼容。

您描述的第二个约束可以实现为惩罚StockLocation超过 30 个订单的限制。从描述中,我不清楚这个约束应该是硬的还是软的(它是必须具备的,还是试图平衡库存地点的订单?)。

至于加快求解速度,请提交一个单独的问题,提供有关该问题的更多信息,例如 INFO 日志记录输出、求解器配置或(估计的)@PlanninEntity实例数和相应的值实例。

于 2021-07-12T09:24:23.903 回答