问题概述
容量受限的设施选址问题:
有 n 个设施和 m 个顾客,我们希望选出
- n 个设施中哪些要开启
- 将顾客分配到某个设施
目标是最小化开启费用和分配费用的和。
注意:分配给一个设施的总需求不能超过它的容量。
求解结果要求:
红线指顾客被分配到哪个设施。例如第一个人去了第一个设施,第二个人去了第三个设施,以此类推。
问题实例的数据解释:
问题求解框架
使用 c++ 语言求解(代码Github 地址:code)
将问题抽象为一个类,用类变量存储相应的数据和求解结果,通过类方法实现算法,对变量进行算法操作,得出结果。
主程序只需用问题实例的数据创建一个问题实例,调用相应的方法即可完成对该问题实例的求解。
贪婪算法求解
贪婪算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。
在本题中,一种贪婪策略是在为每个顾客分配设施时,选择容量足够且分配费用最小的设施。算法代码如下:
Result Table:
Result | Time(s) | |
---|---|---|
p1 | 10355 | 0.004 |
p2 | 9041 | 0.005 |
p3 | 11041 | 0.004 |
p4 | 13041 | 0.004 |
p5 | 10827 | 0.006 |
p6 | 9513 | 0.009 |
p7 | 11513 | 0.005 |
p8 | 13513 | 0.004 |
p9 | 10355 | 0.003 |
p10 | 9041 | 0.004 |
p11 | 11041 | 0.003 |
p12 | 13041 | 0.004 |
p13 | 11915 | 0.007 |