我有一个 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)
的二进制变量我尝试了很多事情来达到这一点,但现在我被困住了