Python 在总价格接近N的梦幻足球阵容中自动挑选11名球员的算法

Python 在总价格接近N的梦幻足球阵容中自动挑选11名球员的算法,python,algorithm,Python,Algorithm,我有500辆车的名单 我想从列表中选出11个数字,加起来等于N,N在X范围内,我认为这不是最好的方法,但它可能会起作用: import random data # list of 500 floats n = 11 # numbers to pick bottom_limit = X top_limit = Y max_tries = 100 data_min = min(data) data_max = max(data) i = 0 while i < max_tries:

我有500辆车的名单


我想从列表中选出11个数字,加起来等于N,N在X范围内,我认为这不是最好的方法,但它可能会起作用:

import random

data  # list of 500 floats
n = 11 # numbers to pick
bottom_limit = X
top_limit = Y
max_tries = 100

data_min = min(data)
data_max = max(data)

i = 0
while i < max_tries:
    i += 1
    picked = []

    for j in xrange(n-1):  # pick random except the last one
        picked.append(random.choice(data))
    s = sum(picked)

    if s + data_min < top_limit and s + data_max > bottom_limit:
        # Ok, we know we can find proper values, let's do it
        filtered = []
        for value in data:
            if value + s > bottom_limit and value + s < top_limit:
                filtered.append()

        picked.append(random.choice(filtered))
        break  # Success
else:
    print 'Unable to pick, sorry'
成功率与数据和限制值高度相关


希望这能有所帮助。

正如评论人士指出的,这是一个NP难问题。但是,如果您的数据不太糟糕,那么以下几点应该可以很好地发挥作用:

picks[] := K numbers chosen at random from the population
While sum(picks) is not in the allowable range
  if sum(picks) < MinRange
    select an element p from picks at random
    let subpop := elements in population which are larger than p
    replace p with a random element from subpop
  if sum(picks) > MaxRange
    select an element p from picks at random
    let subpop := elements in population which are smaller than p
    replace p with a random element from subpop
这很容易编码,它将返回一个满足约束的相对随机的选择,并且不会花费太长时间,除非你真的有一个困难的问题实例,在这种情况下,使用任何算法都很难找到解决方案


如果要加快算法的速度,则可以选择元素p作为每次拾取的最小/最大元素。这会使算法运行得更快,但也会减少拾取的随机选择。

X和Y是什么?你能用整数来近似他们和球员的分数吗? 如果是这样,那么就可以使用动态规划,比如

但有几个问题

该算法需要OY内存和OM+Y时间,其中M为玩家总数。 如果您想找到所有允许的团队,然后随机选择一个,那么您将遇到一个问题,这类团队的数量可能是指数级的。
所以,对于实际方法,我投票支持mrip的建议。

动态规划:它是背包问题的一个改进版本,也是子集和问题的一个改进版本。这并不奇怪,因为两者都是NP完全的。你只需要一个选择?而且它必须给所有玩家一个公平的机会?谢谢四叶,他们甚至不知道用谷歌做什么!你不必随机挑选球员。随机选择玩家会导致冲突,从而减慢找到解决方案的速度。相反,您可以系统地循环不同的组合,希望尽快找到解决方案。