Python名单优化器

时间:2015-03-25 17:46:13

标签: python optimization knapsack-problem

我正在尝试构建一个python程序来优化幻想体育名单。我已经调查了scipy,我对如何解决这个问题非常困惑。问题是最大化名单的预期点数,限制在每个玩家位置之一。此外,每个球员都有薪水,所有球员工资的总和也受到限制。所以简而言之,我想选择球员组合来最大化预期得分,同时不超过工资帽。

我最初使用嵌套循环开始这样做,但这需要花费很长时间。

有关如何解决此问题的任何想法?

以下是pandas数据框中的数据示例。

    Position    Name    Salary  AvgPointsPerGame
    0   PG  Russell Westbrook   13200   54.004
    1   SG  James Harden        11500   49.982
    2   PF  Anthony Davis       11200   49.594
    3   SF  LeBron James        10100   47.861
    4   PG  Chris Paul          9900    44.278
    5   C   DeMarcus Cousins    9600    49.477
    6   SF  Kevin Durant        9500    43.481
    7   PF  Blake Griffin       8900    41.705
    8   PF  LaMarcus Aldridge   8800    42.816
    9   PF  Pau Gasol           8700    42.250
    10  PG  John Wall           8600    41.722
    11  C   DeAndre Jordan      8300    37.342
    12  SG  Eric Bledsoe        8200    37.132
    .....

我正在研究所提出的背包问题...任何关于修改此代码的建议1)将行李的大小限制为6,并且2)将每个位置限制为最多2个点。谢谢你的帮助。

def knapsack(items, limit):
table = [[0 for w in range(limit + 1)] for j in xrange(len(items) + 1)]

for j in xrange(1, len(items) + 1):
    pos, name, cost, val = items[j-1]
    for w in xrange(1, limit + 1):
        if cost > w:
            table[j][w] = table[j-1][w]
        else:
            table[j][w] = max(table[j-1][w], table[j-1][w-cost] + val)

result = []
w = limit
for j in range(len(items), 0, -1):
    was_added = table[j][w] != table[j-1][w]

    if was_added:
        pos, name, cost, val = items[j-1]
        result.append(items[j-1])
        w -= wt

return result

1 个答案:

答案 0 :(得分:1)

我使用自己的遗传算法来解决这个问题。由于有很多小细节,我不会完全拼写出来,但这已经足够开始了:

  1. 创建一个随机挑选团队的功能
  2. 创建一个函数,给定一个团队,检查它是否有效(工资上限)
  3. 创建一个为团队打分的功能
  4. 创建一个创建一个新团队的功能,给予两个团队(队友)
  5. 首先挑选十个随机团队
  6. 排名前三的队伍并交配共有6支队伍
  7. 完全随机挑选3支球队,总共9支球队
  8. 排名,排序,重复
  9. 你应该在一分钟之内收敛。

    秘密酱是配套功能。当在X位置交换A队和B队时,你将有一组随机挑选的队员。到那个集合,完全随机添加另一个玩家。另一点:当你交配并检查工资帽并且失败时,只需选择一个父团队作为孩子。