У меня есть алгоритм поиска, который ищет комбинации функций сложения и умножения, чтобы достичь определенного диапазона чисел из определенного диапазона чисел.Это поиск самой короткой программы, программа, которая является чем-то вроде AAMMA, где начальное число добавляется, добавляется, умножается, умножается, добавляет, где конечное число находится в диапазоне от r до s.Он должен работать для каждого числа в начальном диапазоне от p до q.
Ввод - это a и m, то, что вы добавляете и умножаете на (num + a), (num * m) для каждой функции.Что я делаю, так это пробую каждую комбинацию функций, пока не найду ту, которая работает, останавливая эту ветку, если она становится слишком большой.Если я нахожу «программу», которая работает, я пробую программу на всех других числах в начальном диапазоне.Он делает это до тех пор, пока не обнаружит ветви, которые не достигают диапазона без перехода.
Я знаю, что поиск не слишком типичен, но я не думаю, что есть возможность для дубликатов, поэтому я не включил найденный список.
Он работает для меньших диапазонов ивходные данные, такие как
Problem3("1 2 2 3 10 20")
, но для больших диапазонов, это просто навсегда, мой тестовый случай
Problem3("8 13 28 91 375383947 679472915")
, который я даже не видел завершенным.Какой мой лучший подход здесь, многопоточность (надеюсь, нет), как-то ускорить мои внутренние функции или просто отказаться от этого подхода.
def Problem3(s):
a,m,p,q,r,s = list(map(int, s.split(" ")))
print(str(a) + "-C-" + str(m) + " processor")
print("Input guarenteed between " + str(p) + " and " + str(q))
print("Output is real number between " + str(r) + " and " + str(s))
open_set = queue.Queue()
# curr path depth
open_set.put([p, "", 0])
while not open_set.empty():
subroot = open_set.get()
multiCurr = subroot[0] * m
addCurr = subroot[0] + a
depth = subroot[2] + 1
if r <= addCurr <= s:
truePath = True
#If we find a working path, we need to check if it works for the other things
path = subroot[1] + "A"
for x in range(p, q+1):
for op in path:
if op == "A":
x += a
if op == "M":
x *= m
if r <= x <= s:
pass
else:
truePath = False
break
if truePath:
print("Found " + path + " at depth " + str(depth) + " with starting number " + str(p) + ", output " + str())
if r <= multiCurr <= s:
truePath = True
path = subroot[1] + "M"
for x in range(p, q+1):
for op in path:
if op == "A":
x += a
if op == "M":
x *= m
if r <= x <= s:
pass
else:
truePath = False
break
if truePath:
print("Found " + path + " at depth " + str(depth) + " with starting number " + str(p) + ", output " + str())
if addCurr > s and multiCurr > s:
pass
elif multiCurr > s:
open_set.put([addCurr, subroot[1] + "A", depth])
elif addCurr > s:
open_set.put([multiCurr, subroot[1] + "M", depth])
else:
open_set.put([multiCurr, subroot[1] + "M", depth])
open_set.put([addCurr, subroot[1] + "A", depth])