一种蛮力攻击

时间:2016-12-12 15:31:46

标签: list sum brute-force

为了在我的学习中实现一个项目,我必须解决python上的一个问题,我需要一些帮助。

事实上,我想浏览问题的所有可能性,我有想法,但对我来说并不是那么清楚。

问题在于:

  • 233 200 134 167
  • 234 187 172 196
  • 237 220 133 163
  • 241 159 193 165

我们必须找到我们必须为每个inboud / outbound放置每辆卡车。 列表示卡车的装载量和数量,产品数量。

例如,如果我们将卡车A放入第一个入站(233),卡车B放入第二个入站(187),卡车C放入第三个入站(133),卡车D放入第四个入站( 165)我们总和233 + 187 + 133 + 165 = 718

我们的目标是尽量减少这笔款项。例如,如果我们只更换卡车A和卡车B,我们总和为234 + 200 + 133 + 165 = 732,这并不比以前好。

那么, 我们如何才能获得卡车放置所有可能性的总和? 有24个可能性,我们用excel写了它们,最好的可能性是卡车A(234)的位置,卡车B(159)的位置4,卡车C(134)的位置1和卡车D(163)的位置3,其总和为 690

我将使用这些列表,我知道如何在列表中获取数字,如何创建列表等。与列表编号进行求和,但我们如何获得我们可以进行的所有计算以excel为例,比如我之前写过的两次。

真诚的,

1 个答案:

答案 0 :(得分:0)

感谢"排列"。

然而,有了这个:

for elt in itertools.product([233,234,237,241],[200,187,220,159],[134,172,133,193],[167,196,163,165]):
print(elt)

我有这个答案(答案的一部分,不是所有的答案,这么多的可能性)

   (233, 200, 134, 167)(233, 200, 134, 196)(233, 200, 134, 163)(233, 200, 134, 165)(233, 200, 172, 167)(233, 200, 172, 196)(233, 200, 172, 163)
(233, 200, 172, 165)(233, 200, 133, 167)(233, 200, 133, 196)(233, 200, 133, 163(233, 200, 133, 165)(233, 200, 193, 167)(233, 200, 193, 196)(233, 200, 193, 163)(233, 200, 193, 165)(233, 187, 134, 167)(233, 187, 134, 196)(233, 187, 134, 163)(233, 187, 134, 165)(233, 187, 172, 167)(233, 187, 172, 196)(233, 187, 172, 163)(233, 187, 172, 165)(233, 187, 133, 167)(233, 187, 133, 196)

事实上,我们不能将233与200放在同一个列表中,因为同一辆卡车和同一辆卡车不能在两个入站点不同。所以我的问题是:如何更改功能产品(我认为这个功能带来的问题)有例如(233,187,133,165)(233,187,193,163)?

这是功能产品:

def product(*args, **kwds):
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
    result = [x+[y] for x in result for y in pool]
for prod in result:
    yield tuple(prod)