ускорение скорости обработки CVXPY - PullRequest
0 голосов
/ 20 мая 2019

Я написал некоторый код, который использует библиотеку cvxpy для решения задачи целочисленного программирования, однако запуск кода занимает так много времени, что мне было интересно, есть ли способ сделать код быстрее?

Задача целочисленного программирования в этом случае принимает матрицу формы (1569 x 3071) и имеет 3071 ограничение для удовлетворения. Код выглядит следующим образом:

mat_f = sys.argv[1]
matIdx2genome_dic_f = sys.argv[2]
genomes_f = sys.argv[3]

with open(matIdx2genome_dic_f, 'r') as in_f:
    matIdx2genome_dic = json.load(in_f)

M = np.load(mat_f)   

selection = cp.Variable(M.shape[1], boolean = True)
ones_vec = np.ones(M.shape[1])

constraints = []  
for i in range(len(M)):
    constraints.append(M[i] * selection >= 1)

total_genomes = ones_vec * selection

problem = cp.Problem(cp.Minimize(total_genomes), constraints)
print('solving the integer programming problem: ')
time = time.time()
problem.solve(parallel = True)
print('problem solved in: '+ str(time.time() - time))

solution = selection.value
solution = list(map(round, solution))
solution = np.array(solution)

which_genomes = np.where(solution == 1.0)[0]

with open(genomes_f, 'w') as out_f:
    for idx in which_genomes:
        out_f.write(matIdx2genome_dic[idx]+'\n')

Здесь важен первый аргумент командной строки, это пустая двоичная матрица, имеющая форму (1569, 3071). Проблема здесь состоит в том, чтобы минимизировать количество столбцов матрицы, чтобы каждая строка имела по крайней мере 1 в своих строках.

Мой вопрос: как мне написать этот скрипт, чтобы он мог работать быстрее? есть ли способ распараллелить это? Я установил параметр параллельного доступа в True в методе решения. Я не думаю, что он делает много, так как я слежу за использованием процессора, и он составляет всего 100%, так что я не думаю, что параллельный вариант делает много? Или есть другой способ (решатель, который я должен назвать, может быть), который решил бы это быстрее?

...