集合覆盖问题、最大覆盖问题、呼叫中心排班问题闲谈

经典SCP描述包含一个集合U以及U内元素构成的
若干各小类集合S,目标是找到S 的一个子集,该子集满足所含元素包含了所有的元素且使小类集合个数最少。例如,U={1,2,3,4,5},S={{1,2},{3,4},{2,4,5},{4,5}},找到集合能满足条件的可以有O={{1,2},{3,4}{4,5}}或是O={{1,2},{3,4},{2,4,5}},至于具体选哪种组合,还有引申的一个问题:WSC,即Weighted Set Cover加权集合覆盖,每个集合类被赋予不同的权值,从而由权值决定最终的选择。
对于完全集合覆盖问题的决定版本是NPC(non-deterministic polynomial complete)的,而优化版本是NP-hard的.

一、集合覆盖问题

    集合覆盖问题(Set Covering Problem,简称SCP)是运筹学研究中典型的组合优化问题之一,工业领域里的许多实际问题都可建模为集合覆盖问题,如资源选择问题、设施选址问题(移动基站的选址、物流中心的选址)等。

    SCP的一个典型应用描述如下:要在一个城市建造若干个消防队驻扎地,使得全城的每一个建筑物都能在某个消防队的5分钟车程内。在不同的地方建造驻扎地都有相应的代价,那么在哪些地方建造驻扎地能满足上述条件且花费的总代价最低就成为待解决的问题。

    集合覆盖问题已被证明是一个NP完全问题,没有多项式时间精确算法,因此实际应用中,往往采用一些近似算法,如贪婪算法,或元启发式算法,如蚁群算法、禁忌搜索算法、遗传算法来求得近似最优解。

    集合覆盖问题也可从设施选址的角度描述如下:待建的设施点集合为N,需要满足服务的需求点的集合为M,每个设施点都能覆盖一定范围内的需求点。集合覆盖问题就是从设施点集合N中找出数量最少的子集去覆盖全部的需求点。当每个设施点都有一定的代价(建造费用、地价)等,这个时候集合覆盖问题就是选择代价最低的一组设施点去建造设施,使其覆盖全部的需求点。这个叫带有权重的集合覆盖问题。

二、最大覆盖问题

    最大覆盖问题:但现实情况是,我能提供的钱(代价)有一个上限。我必须限定的钱去建造足够多的设施,使其尽可能的满足需求。那么这个问题就叫最大覆盖问题。最大覆盖问题就是在代价被限定的条件下,去选择设施点建造设施,使其最大限度的覆盖需求点。它的目标变成了覆盖范围最大,而总代价变成了约束条件。

三、部分覆盖问题

    部分覆盖问题(也叫广义最大覆盖问题):主要是针对最大覆盖问题的一个补充,即把是否覆盖的二元(要么覆盖,要么不覆盖)变成了覆盖程度的一个衡量,每个需求点都有其各自的覆盖程序。部分覆盖问题的目标就是使覆盖需求点的总权重达到最大。

四、排班问题

    其实呼叫中心排班问题就可以归结为部分覆盖问题,准确的说是M/G/P排队系统的部分覆盖问题。因为顾客有多个,每天每个时间点的顾客数量是随机的,那么排班问题就是这一整天我如何安排话务员数量,能尽可能的覆盖顾客的话务,并且这一整天可供安排的话务员(提供服务的设施)数量是一定的。

 

    以上各问题,当规模较小时,可以用整数规划的分支定界法(先求解原问题的线性松弛问题,对解向量中的非整数部分再进行分支定界)、拉格朗日松弛算法(利用拉格朗日算子松弛掉原问题中难以处理的约束,从而将问题变为较易解决的拉格朗日问题,并通过求取拉格朗日对偶问题而逐步逼近获取原问题的最优解),当规模比较大时,可以采用元启发式算法来求得近似最优解。如蚁群算法、禁忌搜索算法、遗传算法等。

    目前,国内对于这些问题已经有所研究,特别是集合覆盖问题,相关文献较多。但多数是给出近似算法后,进行理论验证,而缺少数据实验验证。个别有数据实验的文献,又因为实例规模较小,而没有什么说服力。实例数据可见:

    OR-Library:http://people.brunel.ac.uk/~mastjjb/jeb/orlib/files/ (SCP开头的实例为集合覆盖问题),共有数十个实例。

    其中各实例规模一般较大,如scp41,为200×1000的规模。即待选设施点为200个,需求点为1000个。scpcyc06(240×192)、scpcy07(672×448)等为不带权重的集合覆盖问题,规模较小。文献《一种遗传算法在集合覆盖问题中的应用研究》(陈亮)中针对四个实例进行了数值实验,但均未能得到最优解。

    原文作者:蚁群算法
    原文地址: https://blog.csdn.net/wangh0802/article/details/78504792
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞