問題は、数学的なプログラムとして処方することに適していると異なる最適化ライブラリを用いて解決することができます。
正確なkアイテムナップザック問題として知られています。
たとえば、パッケージ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人の選手を描画するためのランタイムが私のマシンで0.5秒です。
シミュレーテッドアニーリングをしようとしているようですが、ここにはscipy以外のパッケージがあります:https://github.com/perrygeo/simanneal。代わりに、scipy.optimizeのbasinhopping機能はscipy.optimize.annealを置き換えるものであるため動作するかもしれませんが、私はそれを個人的に使用しておらず、現在は試してみる時間がありません。 –