我需要解决一个问题。我有5台设备。它们都有4种I/O类型。还有一个目标输入/输出组合。在第一步中,我希望找到设备之间的所有组合,以便所选设备的总I/O数都等于或大于目标值。让我解释一下:
# Devices=[numberof_AI,numberof_AO,numberof_BI,numberof_BO,price]
Device1=[8,8,4,4,200]
Device1=[16,0,16,0,250]
Device1=[8,0,4,4,300]
Device1=[16,8,4,4,300]
Device1=[8,8,2,2,150]
Target=[24,12,16,8]
也有一些限制。在组合中,最多可以有5台设备。
在第二步,在找到的组合中,我将选择最便宜的一个。
实际上,我用Python中的for循环解决了这个问题。我工作得很有魅力。但即使我用的是cython也要花很多时间。
对于这类问题,我还能从哪些其他选择中受益?
只需检查所有组合。由于您只有5台设备,因此(最多)可以使用
6^5=7776
(因为这5个位置中的每一个都可能未使用,所以您必须使用6
)。然后对每一种可能性,你都要检查它是否符合你的标准。我不明白为什么要花这么多时间。下面的脚本在我的机器上不需要一秒钟就可以计算出这些东西。
需要Python2.7。
还可以使用Gustavo Niemeyer的Python Constraint模块来解决这个问题。
这将产生以下输出:
因此,最优解是2 x设备1,1 x设备2,0 x设备3,0 x设备4,0 x设备5。
(注意,变量是使用基于零的索引命名的。设备1对应于0,设备2对应于1,依此类推。)
您可以使用类似PuLP的线性编程包。(注意,这还需要安装一个LP库,如GLPK)。
下面是如何使用它来解决您给出的示例:
运行这个非常快,我得到n1=2和n2=1,其他的都是0。
相关问题 更多 >
编程相关推荐