FanDuel NBA阵容优化器

时间:2017-02-19 02:53:49

标签: python-3.x

这段代码运行没有错误,在我的生命中,我无法理解为什么除了"用法:"之外它没有返回任何输出。消息后跟CSV文件的路径,应该是读取/解析。

感谢任何帮助。

salary_cap = 60000


def get_position_number(name):
    return {
        'Center': 0,
        'Point Guard': 1,
        'Power Forward': 2,
        'Shooting Guard': 3,
        'Small Forward': 4
    }[name]


def main(a, y):
    solver = pywraplp.Solver('CoinsGridCLP',
    pywraplp.Solver.CBC_MIaED_INTEGER_PROGRAMMING)

range_c = range(len(a[0]))
range_pg = range(len(a[1]))
range_pf = range(len(a[2]))
range_sg = range(len(a[3]))
range_sf = range(len(a[4]))

take_c = [solver.IntVar(0, 1, 'take_c[%i]' % j) for j in range_c]
take_pg = [solver.IntVar(0, 1, 'take_pg[%i]' % j) for j in range_pg]
take_pf = [solver.IntVar(0, 1, 'take_pf[%i]' % j) for j in range_pf]
take_sg = [solver.IntVar(0, 1, 'take_sg[%i]' % j) for j in range_sg]
take_sf = [solver.IntVar(0, 1, 'take_sf[%i]' % j) for j in range_sf]

teams_c = []
teams_pg = []
teams_pf = []
teams_sg = []
teams_sf = []

for teamNumber in range(0, 29):
    teams_c.insert(teamNumber, solver.Sum([(a[0][i][3] == teamNumber + 1) * take_c[i] for i in range_c]))
    teams_pg.insert(teamNumber, solver.Sum([(a[1][i][3] == teamNumber + 1) * take_pg[i] for i in range_pg]))
    teams_pf.insert(teamNumber, solver.Sum([(a[2][i][3] == teamNumber + 1) * take_pf[i] for i in range_pf]))
    teams_sg.insert(teamNumber, solver.Sum([(a[3][i][3] == teamNumber + 1) * take_sg[i] for i in range_sg]))
    teams_sf.insert(teamNumber, solver.Sum([(a[4][i][3] == teamNumber + 1) * take_sf[i] for i in range_sf]))

value_c = solver.Sum([a[0][i][1] * take_c[i] for i in range_c])
value_pg = solver.Sum([a[1][i][1] * take_pg[i] for i in range_pg])
value_pf = solver.Sum([a[2][i][1] * take_pf[i] for i in range_pf])
value_sg = solver.Sum([a[3][i][1] * take_sg[i] for i in range_sg])
value_sf = solver.Sum([a[4][i][1] * take_sf[i] for i in range_sf])

salray_c = solver.Sum([a[0][i][2] * take_c[i] for i in range_c])
salray_pg = solver.Sum([a[1][i][2] * take_pg[i] for i in range_pg])
salray_pf = solver.Sum([a[2][i][2] * take_pf[i] for i in range_pf])
salray_sg = solver.Sum([a[3][i][2] * take_sg[i] for i in range_sg])
salray_sf = solver.Sum([a[4][i][2] * take_sf[i] for i in range_sf])

solver.Add(salray_c + salray_pg + salray_pf + salray_sg + salray_sf <= y)

solver.Add(solver.Sum(take_c[i] for i in range_c) == 1)
solver.Add(solver.Sum(take_pg[i] for i in range_pg) == 2)
solver.Add(solver.Sum(take_pf[i] for i in range_pf) == 2)
solver.Add(solver.Sum(take_sg[i] for i in range_sg) == 2)
solver.Add(solver.Sum(take_sf[i] for i in range_sf) == 2)

# Maa 4 a per team
for i in range(0, 29):
    solver.Add(teams_c[i] + teams_pg[i] + teams_pf[i] + teams_sg[i] + teams_sf[i] <= 4)

solver.Maaimize(value_c + value_pg + value_pf + value_sg + value_sf)
solver.Solve()
assert solver.VerifySolution(1e-7, True)
print('Solved in', solver.wall_time(), 'milliseconds!', "\n")
salary = 0

for i in range_c:
    if take_c[i].SolutionValue():
        salary += a[0][i][2]
        print(a[0][i][0], '(C): ${:,d}'.format(a[0][i][2]), '(' + str(a[0][i][1]) + ')')

for i in range_pg:
    if take_pg[i].SolutionValue():
        salary += a[1][i][2]
        print(a[1][i][0], '(PG): ${:,d}'.format(a[1][i][2]), '(' + str(a[1][i][1]) + ')')

for i in range_pf:
    if take_pf[i].SolutionValue():
        salary += a[2][i][2]
        print(a[2][i][0], '(PF): ${:,d}'.format(a[2][i][2]), '(' + str(a[2][i][1]) + ')')

for i in range_sg:
    if take_sg[i].SolutionValue():
        salary += a[3][i][2]
        print(a[3][i][0], '(SG): ${:,d}'.format(a[3][i][2]), '(' + str(a[3][i][1]) + ')')

for i in range_sf:
    if take_sf[i].SolutionValue():
        salary += a[4][i][2]
        print(a[4][i][0], '(SF): ${:,d}'.format(a[4][i][2]), '(' + str(a[4][i][1]) + ')')

print("\n", 'Total: ${:,d}'.format(salary), '(' + str(solver.Objective().Value()) + ')')


if len(sys.argv) < 2:
    print('Usage:', sys.executable, sys.argv[0], 'players.csv')
    sys.exit(1)

team = [[], [], [], [], []]


with open('players.csv') as csvfile:
    reader = csv.DictReader(csvfile)

for row in reader:
    team[get_position_number(row['Subposition'])].append(
        [row['Name'], float(row['Value']), int(row['Salary']), int(row['Team'])]
    )


main(team, salary_cap)

1 个答案:

答案 0 :(得分:0)

发生了什么

以下代码

if len(sys.argv) < 2:
    print('Usage:', sys.executable, sys.argv[0], 'players.csv')
    sys.exit(1)

检查参数向量,包含脚本名称的列表以及通过命令行给出的所有参数是否短于2。 例如,请使用以下文件:

import sys
print(sys.argv, len(sys.argv))

如果你跑:

$ python your_script.py
$ ['your_script.py'] 1
$ python your_script.py parameter
$ ['your_script.py', 'parameter'] 2

在第一个例子中,参数向量的长度为1,第二个例子的长度为2。

回到你的脚本。如果参数向量具有少于两个条目,即用户没有给出参数,则程序终止,错误代码为1(sys.exit(1),每个值!= 1表示错误)。

如何解决

您需要为脚本提供.csv文件作为第一个命令行参数:

$ python your_script players.csv

否则脚本无法使用。 Dave Hensley在使用部分的README of this script中也提到了这一点。