在 PULP 库中实现 MILP 问题时出错

问题描述 投票:0回答:0

我有一个 MILP 问题,用于重新配置 33 总线网络,以最小化由以下约束定义的功率损耗:

约束中的变量定义如下:

我有以下定义约束的代码,我根据从 IEEE 文件中获得的数据创建了数组。

##### START OF PROBLEM DECLARATION #####

#Declare LParrays for storing LP variables
PS_arr = []
QS_arr = []
PF_arr = []
QF_arr = []
W_arr = []

#define the minimization problem
prob = LpProblem('Network-Reconfiguration',LpMinimize)

#generate the LP variables to solve for
for value1 in SN:
    PS_arr.append(LpVariable("PS{}".format(value1)))
    QS_arr.append(LpVariable("QS{}".format(value1)))

for value1 in FN:
    PF_arr.append(LpVariable("PF{}".format(value1)))
    QF_arr.append(LpVariable("QF{}".format(value1)))

for i in range(len(W)):
    if W[i] == 1:
        W_arr.append(1)
    else:
        W_arr.append(LpVariable("W{}".format(i),lowBound = 0, upBound = 1, cat='binary'))
        
    #W_arr.append(LpVariable("W{},{}".format(tap_bus_num[i],z_bus_num[i])),lowBound = 0, upBound = 1, cat='binary')


# objective function
objective_function = sum(-(PF + PS) for PF,PS in zip(PF_arr,PS_arr))
prob += objective_function

# define constraints
# for i in total # of lines 37 (32 regular lines + 5 tie lines)
for i in range(len(FN)):

    # constraint 1
    # prob += -10**6 * (1-W_L)<= 1 + 2*(PS_L*Z_L + QS_L*X_L - 0.5) + (PS_L**2 + QS_L**2) * Z_L**2 <= 10**6 * (1-W_L)
    prob += 1+2*(PS_arr[i]*R_arr[i] + QS_arr[i]*X_arr[i] - 0.5) + (PL_arr[i] + QL_arr[i]) * Z_arr[i]**2 >= -10**6*(1 - W_arr[i])
    prob += 1+2*(PS_arr[i]*R_arr[i] + QS_arr[i]*X_arr[i] - 0.5) + (PL_arr[i] + QL_arr[i]) * Z_arr[i]**2 <= 10**6*(1 - W_arr[i])



    # constraint 2
    # prob += PF_L + PS_L + R_L(PL_L + QL_L) == 0
    # prob += PL_L - PS_L >= 0
    # prob += PL_L - PF_L >= 0
    prob += PF_arr[i] + PS_arr[i] + R_arr[i]*(PL_arr[i] + QL_arr[i]) == 0
    prob += PL_arr[i] >= PS_arr[i]
    prob += PL_arr[i] >= PF_arr[i]


    # constraint 3
    # prob += QF_L + QS_L + X_L * (PL_L + QL_L) == 0
    # prob += QL_L - QS_L >= 0
    # prob += QL_L - QF_L >= 0
    prob += QF_arr[i] + QS_arr[i] + X_arr[i]*(PL_arr[i] + QL_arr[i]) == 0
    prob += QL_arr[i] >= QS_arr[i]
    prob += QL_arr[i] >= QF_arr[i] 

    # # constraint 4
    # # prob += sum(PS_L) + sum(PF_L) - 1*GS_i - PD_i + PG_i == 0
    # # GS_i is bus i conductance element
    # # PD_i is active load connected to bus i
    # # PG_i is active power generation connected to bus i

    # #need to put this in a seperate for loop for # of buses (only have a for loop for number of lines)
    # prob += sum(PS_arr) + sum(PF_arr) - 1*GS_arr[i] - PD_arr[i] + PG_arr[i] == 0


    # # constraint 5
    # # prob += sum(QS_L) + sum(QF_L) - 1*BS_i - QD_i + QG_i == 0
    # # BS_i is bus i susceptance element
    # # QD_i is reactive load connected to bus i
    # # QG_i is reactive power connected to bus i

    # prob += sum(QS_arr) + sum(QF_arr) - 1*BS_arr[i] - QD_arr[i] + QG_arr[i] == 0


    #constraint 6
    #prob += -10^6 *W_L <= PS_L <= 10^6*W_L

    #constraint 7
    #prob += -10^6 *W_L <= QS_L <= 10^6*W_L

    #constraint 8
    #prob += -10^6 *W_L <= PF_L <= 10^6*W_L

    #constraint 9
    #prob += -10^6 *W_L <= QF_L <= 10^6*W_L

    #constraint 10
    #prob += -10^6 *W_L <= PL_L <= 10^6*W_L

    #constraint 11
    #prob += -10^6 *W_L <= QL_L <= 10^6*W_L

    prob += PS_arr[i] >= -10**6*W_arr[i]
    prob += PS_arr[i] <= 10**6*W_arr[i]

    prob += QS_arr[i] >= -10**6*W_arr[i]
    prob += QS_arr[i] <= 10**6*W_arr[i]

    prob += PF_arr[i] >= -10**6*W_arr[i]
    prob += PF_arr[i] <= 10**6*W_arr[i]

    prob += QF_arr[i] >= -10**6*W_arr[i]
    prob += QF_arr[i] <= 10**6*W_arr[i]

    #these are constants not problem variables
    prob += PL_arr[i] >= -10**6*W_arr[i]
    prob += PL_arr[i] <= 10**6*W_arr[i]

    prob += QL_arr[i] >= -10**6*W_arr[i]
    prob += QL_arr[i] <= 10**6*W_arr[i]

for i in range(n_b):
    # constraint 4
    # prob += sum(PS_L) + sum(PF_L) - 1*GS_i - PD_i + PG_i == 0
    # GS_i is bus i conductance element
    # PD_i is active load connected to bus i
    # PG_i is active power generation connected to bus i

    #need to put this in a seperate for loop for # of buses (only have a for loop for number of lines)
    # prob += sum(PS_arr) + sum(PF_arr) - 1*GS_arr[i] - PD_arr[i] + PG_arr[i] == 0
    prob += sum(PS for PS in PS_arr) + sum(PF for PF in PF_arr) - 1*GS_arr[i] == PD_arr[i] - PG_arr[i]


    # constraint 5
    # prob += sum(QS_L) + sum(QF_L) - 1*BS_i - QD_i + QG_i == 0
    # BS_i is bus i susceptance element
    # QD_i is reactive load connected to bus i
    # QG_i is reactive power connected to bus i

    # prob += sum(QS_arr) + sum(QF_arr) - 1*BS_arr[i] - QD_arr[i] + QG_arr[i] == 0
    prob += sum(QS for QS in QS_arr) + sum(QF for QF in QF_arr) - 1*BS_arr[i] == QD_arr[i] - QG_arr[i]


#constraint 10: (this one sits outside of the for loop)
##of lines = #of buses - #of slack buses
#32 = 33 - 1
# prob += s_l - n_b + n_s == 0
#total number of closed lines must be equal to 32
prob+= sum(W for W in W_arr) == 32

##### END OF PROBLEM DECLARATION #####

# print(prob)  # Display the LP problem
#solve the lp problem
status = prob.solve()
print(status)
#show the values of the solved variables and the objective function solution
print(value(prob.objective))
minimum_losses = prob.objective.value()

解算器返回一个错误,我不知道从这里去哪里。另外为了提供一些上下文,W_arr 包含定义一行是关闭 (1) 还是打开 (0)

的二进制变量

我尝试了很多事情来达到这一点,但现在我被困住了

python compiler-errors linear-programming pulp mixed-integer-programming
© www.soinside.com 2019 - 2024. All rights reserved.