, как упомянуто в комментариях: упаковка коэффициентов в ranges
напрямую ускорит процесс:
from itertools import product
possiblesolution = 1930
solutionfound = False
rangedict2 = {'f1': range(-3*1850, -3*1910, -3),
'f2': range(2401, 2482),
'f3': range(5150, 5850)}
for combination in product(*rangedict2.values()):
if sum(combination) == possiblesolution:
solutionfound = True
print(combination[0]//(-3), combination[1], combination[2])
break
или совершенно другой подход: создайте словарьсуммы, которые вы можете получить от f1
и f2
, а затем проверьте, может ли быть достигнута ваша цель possiblesolution
:
from collections import defaultdict
rangedict3 = {'f1': range(-3*1850, -3*1910, -3),
'f2': range(2401, 2482),
'f3': range(5150, 5850)}
sums = {item: [[item]] for item in rangedict3['f1']}
# sums = {-5550: [[-5550]], -5553: [[-5553]], ...}
new_sums = defaultdict(list)
for sm, ways in sums.items():
for item in rangedict3['f2']:
new_sum = sm + item
for way in ways:
new_sums[new_sum].append(way + [item])
# new_sums = {-3149: [[-5550, 2401], [-5553, 2404], ...],
# -3148: [[-5550, 2402], [-5553, 2405], ...],
# ....}
for item in rangedict3['f3']:
if possiblesolution - item in new_sums:
f1_f2 = new_sums[possiblesolution - item]
print(f1_f2[0][0]//(-3), f1_f2[0][1], item)
# print(new_sums[possiblesolution - item], item)
break
, чтобы вы могли легко получить оставшиеся решения.
или просто смешать f2
и f3
вместе:
f1 = rangedict3['f1']
f2 = rangedict3['f2']
f3 = rangedict3['f3']
# the sums that are reachable from f2 and f3
f2_f3 = range(2401 + 5150, 2482 + 5850)
for item in f1:
if possiblesolution - item in f2_f3:
pmi = possiblesolution - item
x1 = item//(-3)
for x2 in f2:
if pmi-x2 in f3:
x3 = pmi-x2
break
print(x1, x2, x3)
break
и последнее незначительное ускорение: если вам действительно нужно только одно решение, есть только 4 (возможно, даже 3) возможные случаи для x2
и x3
:
f1 = rangedict3['f1']
f2 = rangedict3['f2']
f3 = rangedict3['f3']
min_x2 = min(f2)
max_x2 = max(f2)
min_x3 = min(f3)
max_x3 = max(f3)
# the sums that are reachable from f2 and f3
f2_f3 = range(2401 + 5150, 2482 + 5850 - 1)
for item in f1:
if possiblesolution - item in f2_f3:
pmi = possiblesolution - item
x1 = item//(-3)
if pmi-min_x2 in f3:
x2 = min_x2
x3 = pmi-x2
elif pmi-max_x2 in f3:
x2 = max_x2
x3 = pmi-x2
elif pmi-min_x3 in f2:
x3 = min_x3
x2 = pmi-x3
# elif pmi-max_x3 in f2:
else:
x3 = max_x3
x2 = pmi-x3
print(x1, x2, x3)
break