cvxpy中目标函数的级联

2024-04-28 09:48:24 发布

您现在位置:Python中文网/ 问答频道 /正文

def calculate_eta_general(t1, t2):
    ''' This is calculating the eta for general case 1<t1<=t2<=time_slot'''
    
    # sums all the bt from t1 to t2
    agg_load_trace = cp.Variable(time_slot)
    
    
    denominator = cp.Expression()
    for i in range(t1, t2+1):
        denominator += peak_estimation(agg_load_trace[0:i])
    prob1 = cp.Problem(cp.Maximize((sum(agg_load_trace[t1-1:t2])-2*agg[0])/\
                       denominator),constraints= \
                       [lower_agg_prediction()<= agg_load_trace, \
                       agg_load_trace <= upper_agg_prediction()])
        
    prob1.solve(solver=cp.SCS, max_iters = 100000)
    
    value1 = (sum(agg_load_trace.value[t1-1:t2])-2*agg[0])/\
           (sum(peak_estimation(agg_load_trace.value[i]) for i in range(t1, t2+1)))
    
    prob2 = cp.Problem(cp.Maximize((sum(agg_load_trace[t1-1:t2])-(t2-t1+1)*agg[1])/\
           (sum(peak_estimation(agg_load_trace[i]) for i in range(t1, t2+1)))),\
                constraints= [lower_agg_prediction()<= agg_load_trace,
                agg_load_trace <= upper_agg_prediction()])
    prob2.solve(solver=cp.SCS, max_iters= 100000)
    
    value2 = (sum(agg_load_trace.value[t1-1:t2])-(t2-t1+1)*agg[1])/\
           (sum(peak_estimation(agg_load_trace.value[i]) for i in range(t1, t2+1)))
    
    
    return cp.maximum(value1, value2)

理想情况下,我想写一个表达式作为sum(范围(t1,t2+1)内I的峰值估计(agg_load_trace[0:I])。但我不被允许这样做。这就是为什么我做了下面的事情

 denominator = cp.Expression()
    for i in range(t1, t2+1):
        denominator += peak_estimation(agg_load_trace[0:i])

但是,我得到了以下错误

  File "C:\Users\Siyuan Xu\OneDrive - purdue.edu\research\coding\main.py", line 352, in <module>
    print(calculate_eta_general(2,10))

  File "C:\Users\Siyuan Xu\OneDrive - purdue.edu\research\coding\main.py", line 243, in calculate_eta_general
    print("type is", type(peak_estimation(agg_load_trace[0])))

  File "C:\Users\Siyuan Xu\OneDrive - purdue.edu\research\coding\main.py", line 228, in peak_estimation
    prob = cp.Problem(cp.Minimize(offline_opt(np.array(Z_t.tolist() + \

AttributeError: 'index' object has no attribute 'tolist'

其中,峰值_估计被定义为另一个优化结果

def peak_estimation(Z_t):

    t = Z_t.size
    remain_trace = cp.Variable(time_slot - t)

    prob = cp.Problem(cp.Minimize(offline_opt(np.array(Z_t.tolist() + \
                      list(remain_trace)))), constraints = \
                      [lower_agg_prediction()[t:]<=remain_trace, \
                      remain_trace<= upper_agg_prediction()[t:]])
    prob.solve(solver=cp.SCS, max_iters=50000)
    return offline_opt(np.concatenate((Z_t,remain_trace.value)))

我的问题是如何编写一个表达式,将一组函数与要优化的参数化变量相加。就像这里一样,agg_load_trace=cp.Variable(time_slot)是要优化的变量数组


Tags: inforvaluetraceloadrangecpagg