首页 > 解决方案 > 有限资源的有效分配(最大利润,所有可能的组合列表)

问题描述

我想通过有限的资源分配找到最有利可图的资源分配组合,并列出可能的组合。换句话说,我想找到最大化利润的价值,找到下一个最佳解决方案,并做出可能的组合。

这似乎是一个经典的运筹学问题。

total_capa = 700000

我的 csv 数据如下。

设置为浮点数的数据可以转换为整数。

[data.csv]

product,request,profit,min_alloc(req*0.2),max_alloc(req*0.8)
P_00,22138.6,4132247.36,4427.72,17710.88
P_01,201476.7,54198545.43,40295.34,161181.36
P_02,27800.7,4799053.7,5560.14,22240.56
P_03,52556.6,7732785.93,10511.32,42045.28
P_04,1202.2,517304.11,240.44,961.76
P_05,3802.9,2006703.02,760.58,3042.32
P_06,4606.7,3297285.5,921.34,3685.36
P_07,5714.9,3018404.34,1142.98,4571.92
P_08,25422,15964314.07,5084.4,20337.6
P_09,7847.6,4384356.19,1569.52,6278.08
P_10,21953.4,11709708.87,4390.68,17562.72
P_11,41175.5,26195563.14,8235.1,32940.4
P_12,44087.7,49352201.43,8817.54,35270.16
P_13,4264.9,4549461.29,852.98,3411.92
P_14,79543.9,34724780.52,15908.78,63635.12
P_15,135107.2366,58980990.73,27021.44732,108085.7893
P_16,18670.8,12741108.84,3734.16,14936.64
P_17,2214.9,1960165.54,442.98,1771.92
P_18,2442.6,727947.95,488.52,1954.08
P_19,4965.3,4816934.02,993.06,3972.24
P_20,6723.3,26192130.56,1344.66,5378.64
P_21,64212.4,27260739.4,12842.48,51369.92
P_22,3107.3,5859277.59,621.46,2485.84
P_23,6520.5,10059709.66,1304.1,5216.4
P_24,3278.5,5365847.74,655.7,2622.8
P_25,18118.1,23691658.74,3623.62,14494.48
P_26,5646.5,329967.15,1129.3,4517.2
P_27,55203.4,18480457.89,11040.68,44162.72
P_28,1945.4,853201.7,389.08,1556.32
P_29,77482.8,49685683.45,15496.56,61986.24
P_30,9363.6,6281517.34,1872.72,7490.88

“请求”表示客户的请求,但资源有限,不可能满足所有人。所以我把min_alloc和max_alloc的约束。我想就如何最大化利润向这里的专家寻求建议。我正在使用 python 和熊猫。

标签: pythonpandaslinear-programmingmixed-integer-programmingoperations-research

解决方案


我怀疑这个模型反映了你想要的:

 max sum(p, profit[p]*alloc[p])
 sum(p, alloc[p]) <= total_capa
 min_alloc[p] <= alloc[p] <= max_alloc[p]  

这是一张LP。对于 LP 来说,次优的解决方案没有明确定义(想象一下只是将一个 epsilon 移开)。我们可以使用类似的东西:与之前的 alloc*[p] 相比,至少将 Delta 移开(在某种意义上)。IE

 sum(p, |alloc[p]-alloc*[p]| ) >= Delta

这是非凸的,因此需要二进制变量。这可能需要一点思考(一些分配的大小有点大)。


推荐阅读