也可以使用Gustavo Niemeyer的Python 约束模块来解决这个问题。
import constraint
Device1=[8,8,4,4,200]
Device2=[16,0,16,0,250]
Device3=[8,0,4,4,300]
Device4=[16,8,4,4,300]
Device5=[8,8,2,2,150]
Target=[24,12,16,8]
devices = [Device1, Device2, Device3, Device4, Device5]
vars_number_of_devices = range(len(devices))
max_number_of_devices = 5
problem = constraint.Problem()
problem.addVariables(vars_number_of_devices, range(max_number_of_devices + 1))
problem.addConstraint(constraint.MaxSumConstraint(max_number_of_devices), vars_number_of_devices)
for io_index, minimum_sum in enumerate(Target):
problem.addConstraint(constraint.MinSumConstraint(minimum_sum, [device[io_index] for device in devices]), vars_number_of_devices)
print min(problem.getSolutions(), key=lambda distribution: sum([how_many * devices[device][-1] for device, how_many in distribution.iteritems()]))
这会产生以下输出:
{0: 2, 1: 1, 2: 0, 3: 0, 4: 0}
因此,最优解是 2 x Device1、1 x Device2、0 x Device3、0 x Device4、0 x Device5。
(请注意,变量使用从零开始的索引命名。Device1 对应于 0,Device2 对应于 1,依此类推。)