问题在于:
用户有一个包含物品的购物篮,其中每个物品都有一组可用的交付类型,这是从一些定义的整体集中选择的子集(例如[“英国二级”,“英国一级”,“英国记录”交付“],但不要太依赖确切的名字。)
在完成结帐流程时,应向用户显示单独或合并交付的选项。
单独很容易 - 显示一个表,其中每个项目都在其自己的行上,并且列集与项目中可用交付类型的并集相匹配。每行包含一个单选按钮集,每个列一个按钮,该按钮是该项可用的交付类型。
结合起来,我不确定如何接近。仅当该组中的所有项目共享可用交付类型的子集时,才能将项目组合到一个组中。具有互斥交付类型的项目永远不能位于同一组中。篮子可以包含来自多个供应商的物品;在这种情况下,来自不同供应商的产品可能不会组合在一起,即使它们共享交付类型。
客户要求计算最小组的数量,与每种邮资的成本无关。是的,这意味着如果单独交付四件物品将花费£1 +£2 +£3 +£4(四种不同的交付类型),但这些物品都共享第五种交付类型,费用为15英镑,那么用户将是为“合并”选项提供了一个更昂贵的小组。
Here is an HTML example of separate/combined options
使用存储过程从数据库中检索项目的可用交付类型,并根据类型ID和供应商ID创建唯一标识符,以便比较类型之间的相等性。但是,我似乎无法想出一个有效的算法来进行比较和生成组。
我希望在数据结构方面的最终结果是(伪代码):
Basket { List<Item> Items }
=>
GroupsTable {
List<SelectableDeliveryType> Columns,
List<Group { List<Item> }> Rows
}
每个Item
都包含自己的List<AvailableDeliveryType>
,然后可以轻松地使用SelectableDeliveryType
列来放置其单选按钮。
任何想法,指向涵盖这一点的一般算法概念(例如我认为它不是set cover problem)等等。非常感谢。
答案 0 :(得分:3)
从graph coloring减少这个问题是NP难题。给定由边连接的一组节点组成的图,该图中的k着色是一种着色图中每个节点的方式,使得没有两个连接的节点具有相同的颜色。色数问题如下 - 可以为图表着色的最小颜色数是多少?
我们可以针对您的问题减少色数问题(NP-hard)的任何实例,如下所示:对于每个节点,创建一个新产品。对于每个边缘,标记这两个产品不能分组到同一个集群中。然后,这些产品的任何聚类都对应着色 - 只是为每个聚类中的所有节点着色相同的颜色。因此,以最佳方式解决问题等同于求解图着色,因此(假设P ≠ NP)没有多项式时间算法。
不幸的是,已知图形着色很难近似;对于任何ε> 1,没有已知的多项式时间算法可以在最佳的常数因子内,或甚至在n 1-ε的因子内。 0.我认为你最好使用像Chaitin's algorithm这样的启发式方法,或者找到一种不同的方式来思考这个问题。
对于否定的结果感到抱歉,但希望这会有所帮助!