目录
0 前言
1 为什么需要线性化?
2 分段函数线性化
3 乘积线性化
0 前言
之前分享过3篇关于线性化处理的文章,具体链接如下:
知识分享|分段函数线性化及matlab测试
学习园地 | yalmip实用操作-线性化
非线性优化 | 非线性问题matlab+yalmip求解案例
本次分享一个高阶的线性化处理技巧,让线性化不仅有助于程序调试运行,更能够成为文章的一大亮点,也能解决文章创新点不足的问题。
1 为什么需要线性化?
对于电力系统优化而言,智能算法和规划方法(包括线性规划、非线性规划等)是常用的优化方法,两类方法在应用上大不相同。
众所周知,智能算法能够直接处理非线性的问题,但是智能算法有个缺点,优化结果接近最优值,但是难以达到最优值,这成为我们学习研究中的一个障碍。
规划方法主要依靠各类求解器(gurobi/cplex/mosek等)寻优,能够寻得最优解,但是对模型的要求比较高,对于存在的非线性项,有些必须通过线性化处理才能求解,有些简单非线性问题可以直接求解,但是速度比较慢,线性化处理之后能够大幅提高运行求解效率。
2 分段函数线性化
前言部分第一个分享链接是分段函数线性化的通用模式,电力系统优化最常用的分段函数是关于布尔变量类,如线路跳闸变量受传输容量限制,具体模型如下:
如果用implies函数来实现这个约束可采用下述方式。
for j=1:46
Constraints = [Constraints,implies(abs(Fs(j,s)) - flmax .* wls(j,s)>=0,els(j,s)==1)];
Constraints = [Constraints,implies(abs(Fs(j,s)) - flmax .* wls(j,s)<=0,els(j,s)==0)];
end
上述程序段中wls指的是线路联通状态,这样约束书写方式比较常规,直观且易于理解,但是implies函数求解较慢,以【重磅】计及连锁故障传播路径的电力系统 N-k故障场景筛选模型为例,整个模型运行时间为500多秒。
除上面求解方式之外,可以通过更加灵巧的线性化方式进行处理,模型处理如下:
上式中,M是个极大的数,
是个极小的值。
这是应用大M法进行线性化处理的示范,这种方式是对分段函数的等价转化,不用采用implies函数进行编程,程序实现如下:
Constraints = [Constraints, abs(Fs(:,s)) - flmax .* wls(:,s) <= M*els(:,s) ];
Constraints = [Constraints, abs(Fs(:,s)) - flmax .* wls(:,s) >= M*(els(:,s)-1) + eps ];
线性化处理之后模型运行时间只需要80秒,求解速度大幅提升。
大家在模型分析的过程可以充分应用线性化处理技巧,将模型转化为方便求解的数学模型,从而极大提到程序调试运行效率。
3 乘积线性化
前言中第二个链接分析了01变量乘积线性化的处理方式,分析其中一个通用的模型转化方法如下:
上式中,对于另外一个非01变量需要先确定上下限才能精确的实现模型求解,在常用的电力系统优化中,可以容易确定变量的上下限值,但是在对偶模型中对于对偶变量的限值的确定往常还是比较含糊的,有些用一些比较大的数值作为上限值,但是,在深度的应用中可以采用克莱默法则来精确分析对偶变量的上限值。
第一步:将模型约束写成紧凑形式,如下:
A 是对偶变量的系数矩阵,x 为对偶变量构成的矩阵。
第二步:根据克莱默法则计算对偶变量x。
因为A 是一个整数矩阵,所以其行列式的绝对值大于等于 1,如下式所示:
联立上面两个公式,可得:
因为[A h]为全幺模矩阵,所以其行列式的绝对值小于等于 1,如下所示:
通过该式可求得模型对偶变量的上下限值,从而可以应用乘积线性化的公式进行约束精准表达。上述采用网络流模型求解对偶变量上下限的方法,参考《计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型》。
通过这种方式的处理既体现了线性化过程,又将文章的层次提高了一截,同学们可以重点参考一下。