精打细算:OptaPlanner 如何帮助您找到最佳优惠券组合
优惠券组合问题,它是一个组合优化问题,具体来说,给定一个订单金额和若干个优惠券,需要从这些优惠券中选择一些使用,使得总优惠金额最大,从而使得订单金额最小。
例如,假设订单金额为 100 元,有三张优惠券,分别为 20 元、30 元和 50 元,我们需要从这三张优惠券中选择一些使用,使得总优惠金额最大。在这个例子中,最优的方案是选择 30 元和 50 元的优惠券,使得总优惠金额为 80 元。
动态规划算法
复制代码
OptaPlanner 算法
模型设计
EntityClass::CouponItem
FactClass:OrderItem
PlanningVariable:OrderItem(nullAble=true) 不是每个优惠券都可以使用
约束设计
优惠券组合金额不能大于订单金额。Hard
复制代码
优惠券优惠金额最大。
复制代码
注意:这个约束使用 Medium 或者 Soft 级别,因为只有一个约束,这个约束使用 forEachIncludingNullVars 可以选择 planningVariable 变量,目的是为了未分配订单的优惠券惩罚其满减金额,这样算法会提高分数而分配订单。
或者奖励
复制代码
知识点
forEach 和 forEachIncludingNullVars 的区别,因为 planningVariable 变量是允许为 null 的,所以为了尽可能的不为 null,所以需要惩罚,要使用 forEachIncludingNullVars
版权声明: 本文为 InfoQ 作者【PeterOne】的原创文章。
原文链接:【http://xie.infoq.cn/article/95cf5ff0bc8fad7d62f4f97bd】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论