новый для python, и у меня возникли проблемы с преобразованием сценария в более эффективный алгоритм, который мне дал.
Здесь код python:
#!/usr/bin/env python
import itertools
target_sum = 10
a = 1
b = 2
c = 4
a_range = range(0, target_sum + 1, a)
b_range = range(0, target_sum + 1, b)
c_range = range(0, target_sum + 1, c)
for i, j, k in itertools.product(a_range, b_range, c_range):
if i + j + k == 10:
print a, ':', i/a, ',', b, ':', j/b, ',', c, ':', k/c
(например, он только 3 переменные, но я хочу использовать его на тысячах переменных в конце).
Здесь результат, который я ищу (все комбо, которые приводят к результату 10):
1 : 0 , 2 : 1 , 4 : 2
1 : 0 , 2 : 3 , 4 : 1
1 : 0 , 2 : 5 , 4 : 0
1 : 2 , 2 : 0 , 4 : 2
1 : 2 , 2 : 2 , 4 : 1
1 : 2 , 2 : 4 , 4 : 0
1 : 4 , 2 : 1 , 4 : 1
1 : 4 , 2 : 3 , 4 : 0
1 : 6 , 2 : 0 , 4 : 1
1 : 6 , 2 : 2 , 4 : 0
1 : 8 , 2 : 1 , 4 : 0
1 : 10 , 2 : 0 , 4 : 0
В вопросе Можно ли масштабировать алгоритмы грубой силы? был предложен лучший алгоритм, но мне сложно выполнять логику в python. Новый тестовый код:
# logic to convert
#for i = 1 to k
#for z = 0 to sum:
# for c = 1 to z / x_i:
# if T[z - c * x_i][i - 1] is true: #having trouble creating the table...not sure if thats a matrix
# set T[z][i] to true
#set the variables
sum = 10
data = [1, 2, 4]
# trying to find all the different ways to combine the data to equal the sum
for i in range(len(data)):
print(i)
if i == 0:
continue
for z in range(sum):
for c in range(z/i):
print("*" * 15)
print('z is equal to: ', z)
print('c is equal to: ', c)
print('i is equal to: ', i)
print(z - c * i)
print('i - 1: ', (i - 1))
if (z - c * i) == (i - 1):
print("(z - c * i) * (i - 1)) match!")
print(z,i)
Извините, что он явно довольно грязный, я понятия не имею, как создать таблицу в разделе, где есть:
if T[z - c * x_i][i - 1] is true:
set T[z][i] to true
В других местах при преобразовании algo у меня было больше проблем, потому что в строках типа 'или я = 1 to k', конвертирующих его в python, возникает ошибка: "TypeError: 'int' object не является произносимым"
Любая помощь или предложения были бы потрясающими. Я изучил синтаксис в python, но еще ничего не сделал с алгоритмами (так что, пожалуйста, расскажите со мной).
Заранее спасибо.
Вы можете получить тот блок, который создает таблицу для динамического программирования с помощью этого:
from collections import defaultdict
# T[x, i] is True if 'x' can be solved
# by a linear combination of data[:i+1]
T = defaultdict(bool) # all values are False by default
T[0, 0] = True # base case
for i, x in enumerate(data): # i is index, x is data[i]
for s in range(sum + 1):
for c in range(s / x + 1):
if T[s - c * x, i]:
T[s, i + 1] = True
True
в T[(sum, len(data))]
если решения существуют.
Вы можете создать таблицу, которая вам нужна, со списком списков:
t = [[False for i in range(len(data))] for z in range(sum)] #Creates table filled with 'False'
for i in range(len(data)):
print(i)
if i == 0:
continue
for z in range(sum):
for c in range(int(z/i)):
print("*" * 15)
print('z is equal to: ', z)
print('c is equal to: ', c)
print('i is equal to: ', i)
print(z - c * i)
print('i - 1: ', (i - 1))
if (z - c * i) == (i - 1):
print("(z - c * i) * (i - 1)) match!")
t[z][i] = True # Sets element in table to 'True'
Что касается вашего TypeError, вы не можете сказать я = 1 к k, вам нужно сказать: for я in range(1,k+1):
(предполагая, что вы хотите включить k
).
Еще один совет: вы не должны использовать sum
как имя переменной, потому что это уже встроенная функция python. Попробуйте помещать print sum([10,4])
в вашу программу где-нибудь!
for i in range(1, k+1)
.
print foo
а неprint(foo)
.print(foo)
в Python 2.x, поэтому, если ему это нравится, не говорите ему не использовать его! Я делаю это много времени сам, когда пишу здесь.