python批量做线性规划(每次的约束条件参数有变换)

需要用到scipy库里面的函数

scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method=‘simplex’, callback=None, options=None)

代码

from scipy import optimize as op
import numpy as np
c=np.array([2,3,-5])
A_ub=np.array([[-2,5,-1],[1,3,1]])
B_ub=np.array([-10,12])
A_eq=np.array([[1,1,1]])
B_eq=np.array([7])
x1=(0,7)
x2=(0,7)
x3=(0,7)
res=op.linprog(-c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3))
print(res)

c指的应该是要求最大值的函数的系数数组,A_ub是应该是不等式未知量的系数矩阵,仔细观察的人应该发现,为什么第一行里面写的是[-2,5,-1]而不是[2,5,-1]呢,应该要与图里对应才对啊,原来这不等式指的是<=的不等式,那如果是>=呢,乘个负号就行了。A_eq就是其中等式的未知量系数矩阵了。B_ub就是不等式的右边了,B_eq就是等式右边了。bounds的话,指的就是每个未知量的范围了。我们看一下结果

     fun: -14.571428571428571
 message: 'Optimization terminated successfully.'
     nit: 2
   slack: array([3.85714286, 0.57142857, 6.42857143, 7.        , 0.        ])
  status: 0
 success: True
       x: array([6.42857143, 0.57142857, 0.        ])

批量做线性规划,每次约束条件参数有变化

数据部分截图
这是一道电网经济优化调度题。这里不讲解

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
from scipy.optimize import linprog#线性规划包
#读取数据
file=pd.read_csv('微电网日前经济调度.csv',encoding='utf-8')


#x[0]  # 风机实时接入功率
# x[1]  # 光伏实时接入功率
# x[2] 购电实时功率
# x[3] 售电实时功率

shuju=[]#存放目标值
PF=[]#存放风机实时功率
PS=[]#存放光伏实时功率
PN=[]#存放主网实时功率

#遍历每一行
for index, row in file.iterrows():
    Pbuy = row['购电价格']
    Psell = row['售电价格']
    PF_max = row['风机kW']
    PS_max = row['光伏kW']
    PL = row['负荷kW']
    "---目标函数___"
    #(风机购电成本+光伏购电成本+微电网向主网购电费用-微电网向主网售电费用)
    #c(P0.52*x[0]+0.75*x[1]+Pbuy*x[2]-Psell*x[3])

    c=np.array([0.52,0.75,Pbuy,-Psell])

    "---不等式约束___,这里放入上下限中,不在这里书写"


    #A x[0]<=PF_max风机接入实时功率小于风机的最大功率
    # -x[0]<= 0风机接入实时功率大于等于0
    # x[1]<=PS_max 光伏接入的实时功率小于光伏的最大功率
    #-x[1]<=0光伏接入的实时功率大于0
    #A_ub=np.array([[1,0,0,0],[-1,0,0,0],[0,1,0,0],[0,-1,0,0]])
    #B_ub=np.array([PF_max,0,PS_max,0])

    "---等式约束___"
    #风机实时接入功率 + 光伏实时接入功率  +实时售电功率 = 实时负荷+实时购电功率
    # x[0]  # 风机实时接入功率
    # x[1]  # 光伏实时接入功率
    # x[2] 购电实时功率
    # x[3] 售电实时功率

    #x[0]+x[1]+x[2]-x[3]=PL

    A_eq=np.array([[1,1,1,-1]])
    B_eq = np.array([PL])

    x0 = (0, PF_max)#风机实时接入功率
    x1 = (0, PS_max)#光伏实时接入功率
    x2 = (0, 150)#购电实时功率
    x3 = (0, 150)#售电实时功率

    res = linprog(c, A_ub=None, b_ub=None, A_eq=A_eq,  b_eq=B_eq,bounds=(x0,x1,x2,x3))
    x=res.x
    shuju.append(res.fun)
    PF.append(x[0])
    PS.append(x[1])
    PN.append(PL-x[0]-x[1])
    #print(res.fun)

print('总的费用',np.array(shuju).sum()*0.25)

plt.plot(file['负荷kW'],'b--',label='负荷')
plt.plot(np.array(PF),'r-',label='风机实时功率')
plt.plot(np.array(PS),'g-.',label='光伏实时功率')
plt.plot(np.array(PN),'c:',label='与主网交换功率')
plt.ylabel('P/kW')
plt.xlabel('t/0.25h')
plt.legend()
plt.show()

更多优化算法见链接
python求解带约束目标优化问题(非线性规划,粒子群,遗传,差分进化)
在这里插入图片描述
作者:电气-余登武。写作不容易,点个赞再走。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/114360100