乘积线性化问题探析

简介: 乘积线性化问题探析


摘要:很多同学都碰到模型中含有两个变量乘积,在采用matlab进行求解时,会因为非线性而求解失败,本次分享三类编程实例,帮助理解如何实现乘积线性化。


一、两个变量均是连续性变量

这种问题是最复杂的,应用yalmip+求解器直接进行求解不可行,举个电力专业的例子,以购电成本最低为目标,购电成本是电价和购电量的乘积(这里假定电价只有上下限约束),编程实例如下:

clc;clear all;
 
cost=sdpvar(1,24,'full');%电价变量
 
p=sdpvar(1,24,'full');%电量变量
 
%约束
 
Constraints=[];
 
Constraints=[Constraints,sum(p)==300];%总电量
 
Constraints=[Constraints,0<=p<=30];%单个时刻电量
 
Constraints=[Constraints,0.9<=cost<=1.1];%电价范围约束
 
objective=sum(cost.*p);
 
ops=sdpsettings('verbose', 1, 'solver', 'cplex');
 
sol=optimize(Constraints,objective,ops);
 
%分析错误标志
 
if sol.problem == 0
 
    disp('succcessful solved');
 
else
 
    disp('error');
 
    yalmiperror(sol.problem)
 
end

毫不意外,这样是求解不出来的,出现下图的报错信息。

这种情况如何求解详见第三部分。

二、一个是离散型变量一个是连续变量

这种问题可以通过模型转化的方式进行求解,还是举上面的例子,电价作为离散型变量,一般按照峰谷平的分时电价方式,这种方式更符合实际情况,假设用电客户可以根据需要自行设定每个时段电价,但是要满足峰谷平电价分别对应的小时数,具体模型目标为:

上式中,cost代表电价,为1*T的向量,P代表购电量,为T*1的向量,能够看出来,通过矩阵相乘就得到购电成本这一目标函数。

下面进行模型转换,定义3*T的01变量ucost,代表电价选择的状态变量,第一行到第三行分别代表选择谷平峰电价,如某列(某时刻)第一行为1,其他行为0,则代表选择谷时电价。

定义离散型电价costi=[0.9 1.05 1.1]为离散型电价常数,则上述目标模型可转化为:

这样转化之后就得到了01变量和连续性变量的乘积形式了,可以采用求解器进行求解或者采用如下线性化方式进行再次转化。

实例:用电客户存在灵活性调度负荷和基础负荷两部分,综合考虑整体购电成本,编程如下:

clc;clear all;
 
FH1=[2084,1933,1782,1657,1564,1612,1982,2189,2412,2729,2905,3096,3189,3073,3000,2917,3149,3355,3526,3620,3715,3276,2911,2309];
 
ucost=binvar(3,24,'full');%电价变量
 
p=sdpvar(1,24,'full');%灵活性负荷变量
 
%约束
 
cost=[0.9 1.05 1.1];
 
Constraints=[];
 
Constraints=[Constraints,sum(p)==500];%总可转移电量
 
Constraints=[Constraints,0<=p<=50];%单个时段灵活性负荷约束
 
Constraints=[Constraints,sum(ucost)==1];%每个时刻只能选择一种电价
 
Constraints=[Constraints,sum(ucost(1,:))==6];%谷时电价小时数
 
Constraints=[Constraints,sum(ucost(2,:))==10];%平时电价小时数
 
Constraints=[Constraints,sum(ucost(3,:))==8];%峰时电价小时数
 
objective=sum(cost*ucost*(FH1+p)');
ops=sdpsettings('verbose', 1, 'solver', 'cplex');
sol=optimize(Constraints,objective,ops);
%分析错误标志
if sol.problem == 0
    disp('succcessful solved');
else
    disp('error');
    yalmiperror(sol.problem)
end
%结果
figure;
plot(value(cost*ucost),'m-','LineWidth',1.2)
grid on
ylim([0.8 1.2])
xlabel('时间');
ylabel('电价');
figure;
plot(FH1+value(p),'r-','LineWidth',1.2);
hold on
plot(FH1,'b-*','LineWidth',1.2);
legend('优化后负荷','基础负荷');
grid on

得到如下的运行结果:

可见灵活性调度负荷均叠加在谷时和平时电价时段,优化结果合理。

三、难以转化的乘积处理

对于难以线性化转化的乘积,可以通过将策略显性处理,而不是一味追求求解器的应用方法,下面这个文献采用非合作博弈方式就很值得借鉴。

该文献通过提前将策略部分进行分析,然后得到不同功率区间的电价方案,从而方便实现求解,而且这些分析过程增加了模型工作量和亮点,更加有助于最终成效。

其他模型也可以考虑类似的策略显性过程,通过提前将优化过程捋清楚,然后再进行编程就容易的多。

视频讲解:

image.png

乘积线性化问题探析

相关文章
【概率论基础】条件概率 | 乘法法则 | 事件的独立性
【概率论基础】条件概率 | 乘法法则 | 事件的独立性
160 0
【概率论基础】条件概率 | 乘法法则 | 事件的独立性
|
7月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
9月前
高等数学II-知识点(3)——广义积分、定积分几何应用、定积分求曲线弧长、常微分方程、可分离变量的微分方程、一阶微分方程-齐次方程、一阶线性微分方程
高等数学II-知识点(3)——广义积分、定积分几何应用、定积分求曲线弧长、常微分方程、可分离变量的微分方程、一阶微分方程-齐次方程、一阶线性微分方程
123 0
|
算法 C++
C++基础算法二分篇
C++基础算法二分篇
|
负载均衡 算法 安全
基于混合整数二阶锥(MISOCP)的配电网重构(附matlab代码)
配电网重构是指在满足配电网运行基本约束的前提下,通过改变配电网中一个或多个开关的状态对配电网中一个或多个指标进行优化。通过配电网重构,可以在不增加设备投资的情况下,充分发挥配电系统的潜力,提高系统的性能指标,具有较好的经济效益。配电网重构的算法有许多,包括数学规划方法,如分支定界法、0-1 整数规划、单纯形法等;启发式算法,如最优流算法、开关交换法等;智能优化算法,如模拟退火算法、遗传算法、蚁群算法、粒子群算法、禁忌搜索算法等。这篇博客将采用混合整数二阶锥(Mixed-integer second-order cone programming, MISOCP)实现配电网重构问题的求解。
|
机器学习/深度学习 传感器 算法
基于有限差分法和追赶法解对角矩阵解二维热传导问题附matlab代码
基于有限差分法和追赶法解对角矩阵解二维热传导问题附matlab代码
凸优化理论基础3——凸集和凸锥重要例子
凸优化理论基础3——凸集和凸锥重要例子
1000 0
凸优化理论基础3——凸集和凸锥重要例子
|
机器学习/深度学习 传感器 人工智能
鲁棒局部均值分解 (RLMD)附Matlab代码
鲁棒局部均值分解 (RLMD)附Matlab代码
|
人工智能 开发者
泰勒公式出发点 | 学习笔记-
快速学习泰勒公式出发点