該問題非常適合作爲數學程序公式化,可以用不同的優化庫解決。
它被稱爲確切的k-item揹包問題。
例如,您可以使用Package PuLP。它具有不同優化軟件包的接口,但捆綁了一個免費解算器。
easy_install pulp
免費解決者往往比商業的方法要慢,但我認爲應該漿能解決相當大的版本,您的問題與它的標準求解器。
from pulp import *
# Data input
players = ["William Smith", "Robert Thompson", "Joseph Robinson", "Richard Johnson", "Richard Hall"]
vote = [0.67, 0.31, 0.61, 0.88, 0.28]
price = [8.6, 6.7, 6.2, 4.3, 9.7]
P = range(len(players))
# Declare problem instance, maximization problem
prob = LpProblem("Portfolio", LpMaximize)
# Declare decision variable x, which is 1 if a
# player is part of the portfolio and 0 else
x = LpVariable.matrix("x", list(P), 0, 1, LpInteger)
# Objective function -> Maximize votes
prob += sum(vote[p] * x[p] for p in P)
# Constraint definition
prob += sum(x[p] for p in P) == 3
prob += sum(price[p] * x[p] for p in P) <= 30
# Start solving the problem instance
prob.solve()
# Extract solution
portfolio = [players[p] for p in P if x[p].varValue]
print(portfolio)
運行時繪製從125 3級的玩家使用相同的隨機數據13759布拉德·所羅門是0.5秒我的機器上:
您的問題可以用指腹如下解決。
這聽起來像你正在嘗試做模擬退火,爲此它有一個非scipy包位於:https://github.com/perrygeo/simanneal。另外,scipy.optimize中的盆栽功能可能會起作用,因爲它是爲了取代scipy.optimize.anneal,但我沒有親自使用它,現在也沒有時間來試用它。 –