我有一个名为fleet_df的数据帧,看起来像这样:
Vehicle_ID Capacity
001 5
002 6
003 10
我还有a变量总需求量:
total_demand = 55
我想要的是列举所有更换车辆的组合,只要总容量大于或等于总容量,且小于或等于总容量的两倍
示例输出:
Scenario Vehicle_IDs Total_Capacity
1 001, 001, 001, 003, 003, 003, 003 55
2 003, 003, 003, 003, 003, 003, 003 70
...
我原以为这样会奏效,但到目前为止运气不佳:
enumerate(i for i in fleet_df['Capacity'].values.tolist() if (total_demand <= i) and (i <= total_demand * 2))
我错过了什么
我认为您可能可以这样做—获取行索引的组合,对于每个行组合,找到容量总和,并根据条件对其进行过滤
说明:
线路
将获得来自
fleet_df
的所有索引与来自0 to n
的i
元素的组合。因此,使用i=2
您将拥有comb_indices
as接下来,创建一个临时数据帧
comb_rows
,该行与组合comb_indices
中的索引匹配最后,将总容量满足所需总需求的匹配行追加到
final_df
一旦你有了
final_df
,你可以根据需要重命名索引这里
n
的值是每个组合中的元素数。当n
增加时,我不知道这将是一个有效的解决方案。而且n
取决于total_demand
,因为在total_demand
值控制下的重复可能是无限的。由于total_demand
值的增加幅度远大于车辆的单个容量,因此n
值也应更高,以满足所有组合的要求。n
的范围可以限定为total_demand/max(capacity)
到(2*total demand)/min(capacity)
。我想你应该得到这里面所有的匹配组合。因此,在本例中,n
的范围将是最终结果:
对于更高的值,可能有更好的解决方案,但这应该适用于示例数据集
相关问题 更多 >
编程相关推荐