要素の数が比較的少ない場合は、itertools.product
を使用して可能なすべての選択を生成し、合計を調べることができます。たとえば、私たちはその後、
from itertools import product
choices = zip(*lists)
solutions = [p for p in product(*choices) if abs(sum(p)-target) < tol]
が与え
lists = [[0.75, 0.35, 0.05], [0.1, 0.05, 0.03]]
target = 0.83
tol = 0.001
で始まる場合zip(*lists)
は私たちが唯一のものを作ることができ、各選択肢を記述するタプル与えるので、これは動作します
>>> solutions
[(0.75, 0.05, 0.03)]
:
>>> list(zip(*lists))
[(0.75, 0.1), (0.35, 0.05), (0.05, 0.03)]
、その後product
は私たちの選択肢の可能なすべてのグループを与える:リストのサイズが大きくなるが、彼らは短いしている場合、それはだとして力まかせ探索のこの種は非常に迅速に実行不可能になることを
>>> list(product(*zip(*lists)))
[(0.75, 0.35, 0.05), (0.75, 0.35, 0.03), (0.75, 0.05, 0.05), (0.75, 0.05, 0.03), (0.1, 0.35, 0.05), (0.1, 0.35, 0.03),]
注意を悪くない。あなただけの任意のソリューションを見つけることを気にしている場合は、できるだけ早く1が検出されたとして停止する
>>> next(p for p in product(*choices) if abs(sum(p)-target) < tol)
(0.75, 0.05, 0.03)
を行うことができます。
ありがとうございました!パーフェクト – McLeodx