斜率优化dp小结

最近刷了几道斜率优化dp算是对斜率优化有了一定的了解了

现在来小结一下

斜率优化dp的优化能力是将n^2优化成n,n^3优化成n^2

其转移方程一般是dp[k]=min(dp[i]+cost[i+1][k]),斜率优化优化的是排除一些不可能是最优解的解,那么什么情况下不可能是最优解呢



下面看一道题HDU 2829

状态转移方程是dp[i][j]=min(dp[k][j-1]+cost[k+1][i])

那么k2比k1更优的情况是

dp[k1][j-1]+cost[k1+1][i]>dp[k2][j-1]+cost[k2+1][i]

我们发现cost[k+1][i]=cost[1][i]-cost[1][k]-sum[k]*(sum[i]-sum[k])

那么我们带进去化简就可以得到

dp[k1][j-1]-cost[1][k1]+sum[k1]*sum[k1]-sum[k1]*sum[i]>dp[k2][j-1]-cost[1][k2]+sum[k2]*sum[k2]-sum[k2]*sum[i]

那么我们设

y1=dp[k1][j-1]-cost[1][k1]+sum[k1]*sum[k1]

y2=dp[k2][j-1]-cost[1][k2]+sum[k2]*sum[k2]

x1=sum[k1],x2=sum[k2]


所以k2比k1更优的条件是

y2-y1<(x2-x1)*sum[i]

如果等于那就是一样优,那就也是可以删掉k1的那么我们可以在条件上加一个=号

也就是(y2-y1)<=(x2-x1)*sum[i]


假设我有三个数k1,k2,k3,  k1<k2<k3

那么k2永远都不会是最优的情况是

(y3-y2)/(x3-x2)<(y2-y1)/(x2-x1)

我们分类讨论一下如果对于sum[i]来说

如果(y3-y2)/(x3-x2)<=sum[i]那么k3比k2优或者一样优,那么都是可以删掉的

如果(y3-y2)/(x3-x2)>sum[i],此时(y2-y1)/(x2-x1)>sum[i]那么k1比k2优



#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define maxn 1500

using namespace std;

int sum[maxn],dp[maxn][maxn],cost[maxn];
int que[maxn];

int DP(int n,int m){
    for (int k=1;k<=n;k++){
        dp[k][k-1]=0;
        dp[k][0]=cost[k];
    }//初始化完成

    int head,tail;
    for (int j=1;j<=m;j++){
        head=tail=0;
	//我们优化的是最后一个遍历所以对于每一个i我们都有一个新的que
	//对于一个新的j就是说我们分成j段
        //我要遍历的第一个k就是dp[j][j-1]
        //所以我们把j入队即可
que[tail++]=j; for (int i=j+1;i<=n;i++){ while(head+1<tail){ int q1=que[head],q2=que[head+1]; int y1=dp[q1][j-1]-cost[q1]+sum[q1]*sum[q1]; int y2=dp[q2][j-1]-cost[q2]+sum[q2]*sum[q2]; int x1=sum[q1],x2=sum[q2]; if ((y2-y1)<=sum[i]*(x2-x1)) head++; else break; }

	    //利用sum[i]从头到尾找最优
	    //下面解释下为什么这个是最优的,可以看到前面的已经是最优了
	   //我们发现他的斜率是单调递减的,也就是说此时head到后面任意一点的斜率永远>sum[i],所以head是最优的情况

            int k=que[head];
            dp[i][j]=dp[k][j-1]+cost[i]-cost[k]-sum[k]*(sum[i]-sum[k]);



            while(head+1<tail){
                int q1=que[tail-2],q2=que[tail-1],q3=i;
                int y3=dp[q3][j-1]-cost[q3]+sum[q3]*sum[q3];
                int y2=dp[q2][j-1]-cost[q2]+sum[q2]*sum[q2];
                int y1=dp[q1][j-1]-cost[q1]+sum[q1]*sum[q1];
                int x3=sum[q3],x2=sum[q2],x1=sum[q1];
                if (((y3-y2)*(x2-x1))<=((y2-y1)*(x3-x2)))  tail--;
                else break;
            }
            que[tail++]=i;
	   //因为我们要遍历到的下一个节点是dp[i+1][j],他的k的取值范围0-i所以我们要把i入队
	   //在入队的时候我们就要淘汰y2,这样子不仅淘汰了非最优解还维护了队列斜率的单调递减性质
        }
    }
    return dp[n][m];
}

int main()
{
    int m,n;
    while(~scanf("%d %d",&n,&m)&&(n&&m)){
        sum[0]=0;cost[0]=0;
        for (int k=1;k<=n;k++){
            int save;
            scanf("%d",&save);
            sum[k]=sum[k-1]+save;
            cost[k]=cost[k-1]+sum[k-1]*save;
        }

        printf("%d\n",DP(n,m));
    }
    return 0;
}





                
### Simulink 中光伏系统的建模与仿真 #### 一、Simulink中的光伏发电系统概述 在Simulink环境中构建光伏发电系统模型,能够有效模拟实际运行状况并测试各种控制策略的效果。该平台提供了丰富的组件库和支持多种物理域的联合仿真能力,使得复杂电力电子电路的设计变得直观简便。 对于基于电导增量法的最大功率点追踪(MPPT)算法,在Simulink中实现时可以利用内置函数或者自定义模块来完成核心逻辑运算[^1]。此方法通过对光伏板输出特性曲线斜率进行分析判断当前工作状态是否处于最优位置,并据此调整直流变换器参数使整个装置持续稳定地获取最大可用能量。 #### 二、具体实施步骤说明 为了更清晰地展示如何创建这样的项目,下面给出了一些关键环节: ##### 2.1 构造PV单元基础架构 采用单二极管等效电路作为描述太阳能电池电气行为的基础框架,其内部包含了理想电流源Iph代表光生载流子流动情况;Rs表示串联电阻反映材料本身固有损耗;Rsh用于刻画旁路路径影响程度;还有D0元件则对应着PN结反向饱和电流特征量级大小等因素共同作用下所形成的综合表现形式[^3]。 ```matlab % 定义单二极管模型参数 function i = single_diode_model(v, I_ph, I_rs, nNsVth, R_s, G_p) % v: 终端电压 (Volts) % I_ph: 光照产生的光电流 (Amps) % I_rs: 反向饱和电流 (Amps) % nNsVth: 迪奥德因子 * 数目 * 热电压 (Volts) % R_s: 串联回阻抗 (Ohms) % G_p: 并联电导ance (Siemens) exp_arg = (v + i*R_s)/(nNsVth); if(exp_arg>709) exp_val=Inf; elseif(exp_arg<-708) exp_val=-Inf; else exp_val=exp(exp_arg)-1; end i=(I_ph-I_rs*exp_val-v/R_s)/G_p; end ``` ##### 2.2 集成MPPT 控制机制 引入专门设计用来寻找最佳操作点即MPP处对应的输入变量组合方案——比如这里提到过的“电导增量”方式,则可以在MATLAB/Simulink里方便快捷地搭建起相应的功能区块来进行实验验证活动了。当检测到dP/dV<0时意味着已经越过了峰值区域应该减小占空比反之亦然直至找到那个让乘积达到最大的地方为止。 ##### 2.3 展现最终成果数据可视化部分 经过一系列处理之后得到的结果通常会以图形化界面的形式呈现出来供人们观察理解。这其中包括但不限于随时间变化而呈现出规律性的波形图样(如前所述之电流、电压及功率),它们不仅有助于评估整体性能指标的好坏优劣之处而且还能为进一步优化改进提供宝贵线索依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值