В зависимости от ожидаемого ввода, вам может быть лучше с простым алгоритмом поиска по дереву.Ваш результирующий вектор содержит относительно низкие числа, что позволяет рано обрезать большинство ветвей дерева.Моя попытка реализовать этот алгоритм приводит к ожидаемому результату через 0,2 секунды:
def testSolution(a, b, x):
result = 0
for i in range(len(b)):
n = 0
for j in range(len(a[i])):
n += a[i][j] * x[j]
if n < b[i]:
result = -1
elif n > b[i]:
return 1
return result
def solve(a, b):
def solveStep(a, b, result, step):
if step >= len(result):
return False
result[step] = 1
areWeThere = testSolution(a, b, result)
if areWeThere == 0:
return True
elif areWeThere < 0 and solveStep(a, b, result, step + 1):
return True
result[step] = 0
return solveStep(a, b, result, step + 1)
result = map(lambda x: 0, range(len(a[0])))
if solveStep(a, b, result, 0):
return result
else:
return None
matrix_a = [[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]]
vector_b = [2, 0, 2, 1, 2, 1, 1, 1, 1, 1, 1]
print solve(matrix_a, vector_b)
Это должно было проверить только 1325 возможных векторов с вашим входом, что намного меньше, чем все возможные результаты (67 миллионов).В худшем случае, конечно, 67 миллионов тестов.