#python #numpy #optimization #mathematical-optimization #cvxpy
#python #numpy #оптимизация #математическая оптимизация #cvxpy
Вопрос:
У меня есть логический вектор с именем cvx_bwic или длиной N, для простоты предположим, что N = 100. Учитывая огромный размер моей проблемы (тысячи целочисленных переменных), я также пытаюсь использовать функцию прогрева. В идеале моя цель состояла бы в том, чтобы разделить N на 10 частей и сделать так, чтобы каждое подмножество было меньше или равно параметру. Это моя первая попытка:
cvx_bwic = cvx.Variable( 100, boolean=True)
tot = cvx_bwic.shape[0]
chunks = 10
interval_size = int(tot/chunks)
param_d = {}
start_idx = 0
end_idx = interval_size
for i in range(chunks):
print("n* Working on i = {}, start_idx = {}, end_idx = {}, cvx_bwic = {} ".format(i, start_idx, end_idx, cvx_bwic.shape))
param_d['param' str(i)] = cvx.Parameter( integer=True)
param_d['param' str(i)].value=0
if start_idx == 0:
arr_filter = np.concatenate( (np.array([param_d['param' str(i)]]*interval_size),
np.array([1]*(tot - interval_size))) , axis=0 )
elif end_idx == cvx_bwic.shape[0]:
arr_filter = np.concatenate( (np.array([1]*start_idx) ,
np.array([param_d['param' str(i)]]*interval_size),
np.array([1]*(tot - interval_size- start_idx)) ) , axis=0 )
else:
arr_filter = np.concatenate( (np.array([1]*start_idx) ,
np.array([param_d['param' str(i)]]*interval_size),
np.array([1]*(tot - interval_size- start_idx))) , axis=0)
arr_filter = arr_filter * 1.0
conslist.append(eval("cvx_bwic <= arr_filter"))
start_idx = start_idx interval_size
end_idx = end_idx interval_size
Как только код выполняет «eval(«cvx_bwic <= arr_filter»)» python выдает мне следующее сообщение об ошибке: *** Ошибка значения: установка элемента массива с последовательностью.
Мой вопрос к вам заключается в следующем:
правильно ли это пытаться управлять 100 возможными логическими переменными, используя только 10 параметров?
Спасибо
Комментарии:
1. Это неполный код без особого контекста, и поэтому вы, вероятно, не найдете здесь особой помощи. Но кое-что общее: имхо, в 99% всех случаев, когда люди используют
eval
, они не знают, что делают, и, вероятно, упускают некоторые основы python. Я никогда не видел прецедента для этого и реализовал множество моделей оптимизации.2. Спасибо, Саша, у меня есть несколько сотен ограничений, протестированных с помощью eval, так что в этой части, поверь мне, я знаю, что делаю. Я просто очень смущен cvxpy, и в документации отсутствуют реальные примеры.
3. Я бы держался
cvx_bwic <= arr_filter
вне цикла и вычислялarr_filter
вне (т. е. до) модели. Это вычисление не включает CVXPY и является чистым Python. Убедитесь, что он имеет тот же размер,cvx_bwic
что и .