集合的最优分组问题

来源:互联网 发布:符文战争桌游淘宝 编辑:程序博客网 时间:2024/05/18 13:23

问题

仓库人员需要按照订单上的信息将商品从货架上拣选出来,这些订单大致形态如下:

订单1:{商品1、商品2、商品3}
订单2:{商品2、商品3、商品5、商品6、商品7}
订单3:{商品1、商品4}
……
订单10000:{商品239、商品445、商品500}

假定总共1万订单,商品种类500种。在这些订单中的商品不大于10种,至少有1种,以1-5种商品组合的订单数量为最多,很多订单的商品组合可能很相似,但假定相互完全相同的订单不会大批出现(不大于10单)。
现在我们需要将这1万个订单交由仓库人员拣选,显然系统应当对这些订单进行合并优化,让每个员工只需要取较少种类的商品就可以完成拣选出较多的订单,即让相似的订单尽可能组合成一个订单组。由于员工的个人限制,一个员工一次拣选包含的订单数不宜大于50。请考虑设计一种算法或策略,使拣选过程中每个选包的商品种类总数尽可能最小。

设定

  1. 为了使问题一般化,接下来不在考虑订单中商品不大于10种,订单相似程度等信息。

一个解法

这是一个划分集合的问题,尽可能保证每个商品尽可能出现的订单集合(选包)数较少,这其实也是要求每个订单集合的订单尽可能相似。而每个选包又通过商品建立错综复杂的联系,怎么切分这个订单的集合呢~

问题演化

在说到“联系”时,我突然想到想到这个以当做一个网络切分的问题来处理。订单可以定义为A类节点,而商品当做B类节点。而订单包含商品则构成一条边。我们可以通过将商品一分为二的方式来切分这个大的网络,从而得到小的网络(选包),也就是问题的有效解。如下图所示:
这里写图片描述
图片示例中,通过将B2拆分为2个,使得A1,A2无法连通构成两个连通图,成为两个选包,而边的数量不变。其实不难发现图中下层圆形图标的个数即是各个选包的商品总种类数。

结合上述类比,这里对问题重新描述: 原始图共包含10000个A节点和500个B节点,需要通过拆分最少的B类节点,使得图分解为若干个连通图,并且每个图中A节点的数量不大于50。
我先不分析上面这个问题,而去介绍一个社交网络中网络划分问题:社交网络图中怎么合理的把人群划分为不同的群体。其中的一个理念就是通过切断最少的联系(边),让图变成成多个连通图。虽然是个最优化问题,但却不是通过训练(最优化)的方法来求解的。而是依次断开边介数最高的边来切分网络,而解决相同问题的另外一个方法就是谱聚类(这一个我就完全不懂了)。

解题思路

其实如果了解介数在社交网络场景的同学应该是不用再看了,方法已经很明显了:
1. 让连通图中每一个A类节点都需要通过最短路径传播消息到其余的A类节点。
2. 计算所有B类节点的点介数。并将介数最大的节点进行拆分。
3. 重复上述操作 直到 每个图都满足A节点数小于50。

小结

虽然貌似是找到了一个解,但是我并不能严格的说明结果满足每个选包的商品种类总数最小。希望看到问题的你也能够留言分享你对问题的想法以及其他有用的参考信息。

0 0
原创粉丝点击