Проблема с сравнением вектора CVXPY с массивом, у которого есть параметры внутри

#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 что и .