在建立、求解优化模型时,我们经常会碰到两个变量相乘的情况,包括:0-1变量乘以0-1变量、0-1变量乘以连续变量和连续变量乘以连续变量等形式,其中,前两种情况较为常见,线性化方法可见http://t.csdn.cn/mau3n和http://t.csdn.cn/nJVcp。本文将详细介绍一种连续变量乘以连续变量的线性化方法:二进制扩展法。
假设有两个连续变量x和y,其取值范围分别为和
,使用
个离散单元对变量y进行离散化,如下所示:
其中,为0-1变量,
为离散单元,如下所示:
然后,xy可以写成如下形式:
如此一来,就出现了0-1变量乘以连续变量的形式,可以用博客http://t.csdn.cn/nJVcp中的方法进行线性化,令
,xy的线性化结果如下所示:
注意:1)这种线性化方法会降低优化问题的求解速度,如果面临大量连续变量乘以连续变量的情况不推荐使用该方法;2)K值越大精度越高,求解速度越慢;3)KKT条件中的互补松弛条件也不推荐使用该方法,因为不等式约束的拉格朗日乘子与其对应的决策变量至少有一个为0,推荐使用大M法。
举一个简单的例子:
MATLAB代码如下所示:
clear all
close all
clc
x=sdpvar(1,1);
y=sdpvar(1,1);
xmin=5;
xmax=10;
ymin=5;
ymax=15;
Constraints=[];
Constraints=[Constraints,xmin<=x<=xmax,ymin<=y<=ymax];
%二进制扩展
K=12;
zk=binvar(K,1);
vk=sdpvar(K,1);
delta_y=(ymax-ymin)/(2^K);
Constraints=[Constraints,xmin*(1-zk)<=x-vk<=xmax*(1-zk)];
Constraints=[Constraints,xmin*zk<=vk<=xmax*zk];
Constraints=[Constraints,y==ymin+delta_y*((2.^[[1:K]-1])*zk)];
Constraints=[Constraints,x*ymin+delta_y*((2.^[[1:K]-1])*vk)<=50];%x*y<=50
f=x+y;
ops = sdpsettings('solver', 'gurobi', 'verbose', 1);
sol=solvesdp(Constraints,-f,ops);
x=value(x)
y=value(y)
出处可见:
- W. Wu, Z. Tian and B. Zhang, "An Exact Linearization Method for OLTC of Transformer in Branch Flow Model," in IEEE Transactions on Power Systems, vol. 32, no. 3, pp. 2475-2476, May 2017, doi: 10.1109/TPWRS.2016.2603438.
- M. V. Pereira, S. Granville, M. H. C. Fampa, R. Dix and L. A. Barroso, "Strategic bidding under uncertainty: a binary expansion approach," in IEEE Transactions on Power Systems, vol. 20, no. 1, pp. 180-188, Feb. 2005, doi: 10.1109/TPWRS.2004.840397.