📄 curtailment.cpp
字号:
if(*(flag4+flag2)==-1)
flag2=Busnum-1;
flag2++;
}
if(flag1==Busnum)//系统没有解列,该支路属于最小割集
{
tempbranchdata[*(overflowline+kk)].alrnum=0;
*(cut+overflowno11)=*(overflowline+kk);
overflowno11++;
}
}
///////////////重新搜索////////////////
for(int i=0;i<Busnum;i++)
{
*(flag3+i)=0;
*(flag4+i)=-1;
}
for(i=0;i<Branchnum;i++)
{
*(flag5+i)=0;
*(flag6+i)=-1;
}
flag=0;
flag1=1;
flag2=0;
//////////////////////////////////////////////////////////
while(flag2!=Busnum)
{
if(flag2==0)
{
startfind=*balanceno;//从平衡节点开始搜索
*(flag3+startfind)=1;
*(flag4+flag2)=startfind;
}
else if(*(flag4+flag2)!=-1)
startfind=*(flag4+flag2);
for(i=0;i<Branchnum;i++)
{
if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].from==tempbusdata[startfind].busno)
{
if(*(flag5+i)==0)
{
*(flag5+i)=1;
*(flag6+flag)=i;
flag++;
}
for(int j=0;j<Busnum;j++)
{
if(tempbusdata[j].busno==tempbranchdata[i].to)
{
if(*(flag3+j)==0)
{
*(flag3+j)=1;
*(flag4+flag1)=j;
flag1++;
}
break;
}
}
}
else if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].to==tempbusdata[startfind].busno)
{
if(*(flag5+i)==0)
{
*(flag5+i)=1;
*(flag6+flag)=i;
flag++;
}
for(int j=0;j<Busnum;j++)
{
if(tempbusdata[j].busno==tempbranchdata[i].from)
{
if(*(flag3+j)==0)
{
*(flag3+j)=1;
*(flag4+flag1)=j;
flag1++;
}
break;
}
}
}
}
if(*(flag4+flag2)==-1)
flag2=Busnum-1;
flag2++;
}
///////////////////////////////////////
int record_from=0;//平衡节点不与受节点一起
int record_to=0;//平衡节点与受节点一起=1
for(i=0;i<overflowno11;i++)
{
for(int j=0;j<flag1;j++)
{
if(tempbranchdata[*(cut+i)].alrnum==0
&&tempbusdata[*(flag4+j)].busno==tempbranchdata[*(cut+i)].from
&&tempbranchdata[*(cut+i)].branchP<0)
record_to=1;
else if(tempbranchdata[*(cut+i)].alrnum==0
&&tempbusdata[*(flag4+j)].busno==tempbranchdata[*(cut+i)].from
&&tempbranchdata[*(cut+i)].branchP>0)
{
record_from=1;
break;
}
else if(tempbranchdata[*(cut+i)].alrnum==0
&&tempbusdata[*(flag4+j)].busno==tempbranchdata[*(cut+i)].to
&&tempbranchdata[*(cut+i)].branchP>0)
record_to=1;
else if(tempbranchdata[*(cut+i)].alrnum==0
&&tempbusdata[*(flag4+j)].busno==tempbranchdata[*(cut+i)].to
&&tempbranchdata[*(cut+i)].branchP<0)
{
record_from=1;
break;
}
}
}
if(record_to==1&&record_from==0)//瓶颈线路
{
temp=0;
temp1=0;
for(h=0;h<Busnum;h++)
{
if(*(flag3+h)==0)
temp+=tempbusdata[h].PG;
}
for(h=0;h<overflowno11;h++)
{
temp1+=fabs(tempbranchdata[*(cut+h)].branchP)-tempbranchdata[*(cut+h)].capacity;
}
if(temp>0&&temp>temp1)
{
for(h=0;h<Busnum;h++)
{
if(*(flag3+h)==0)
tempbusdata[h].PG=tempbusdata[h].PG*(1-temp1/temp);
}
}
temp=0;
double temp2=0;
//找出平衡节点的备用容量
for(h=0;h<Branchnum;h++)
{
if(tempbranchdata[h].branchP>0&&tempbranchdata[h].from==*balanceno)
temp2+=tempbranchdata[h].branchP;
else if(tempbranchdata[h].branchP<0&&tempbranchdata[h].from==*balanceno)
temp2-=tempbranchdata[h].branchP;
else if(tempbranchdata[h].branchP>0&&tempbranchdata[h].to==*balanceno)
temp2-=tempbranchdata[h].branchP;
else if(tempbranchdata[h].branchP<0&&tempbranchdata[h].to==*balanceno)
temp2+=tempbranchdata[h].branchP;
}
if(tempbusdata[*balanceno].maxPG>temp2)
temp=tempbusdata[*balanceno].maxPG-temp2;
temp2=0;
for(h=0;h<Busnum;h++)
{
if(*(flag3+h)==1)
{
temp+=tempbusdata[h].maxPG-tempbusdata[h].PG;//检查备用容量
temp2+=tempbusdata[h].PL;
}
}
if(temp<temp1&&(temp1-temp)<temp2)//备用容量小于瓶颈线路的过载容量,削负荷
{
for(h=0;h<Busnum;h++)
{
if(*(flag3+h)==1)
{
tempbusdata[h].PL=tempbusdata[h].PL*(1-(temp1-temp)/temp2);
tempbusdata[h].PG=tempbusdata[h].maxPG;
}
}
}
else if(temp<temp1&&(temp1-temp)>temp2)
{
for(h=0;h<Busnum;h++)
{
if(*(flag3+h)==1)
{
tempbusdata[h].PL=0;
tempbusdata[h].PG=tempbusdata[h].maxPG;
}
}
}
delete []cut;
cut=NULL;
}
else //非瓶颈线路集
{
int *flowflag;
flowflag=new int[overflowno];
for(i=0;i<overflowno;i++)
{
tempbranchdata[*(overflowline+i)].alrnum=1;
*(flowflag+i)=0;
}
int bb,dd;
temp=0;
for(int ii=0;ii<overflowno;ii++)
{//////////////hehe///////////////////////////////////////////////////
if(tempbranchdata[*(overflowline+ii)].branchP>0&&*(flowflag+ii)==0)
{
dd=tempbranchdata[*(overflowline+ii)].from;
bb=tempbranchdata[*(overflowline+ii)].to;
temp=fabs(tempbranchdata[*(overflowline+ii)].branchP)-tempbranchdata[*(overflowline+ii)].capacity;
for(int jj=0;jj<overflowno;jj++)
{
if(tempbranchdata[*(overflowline+jj)].branchP>0
&&tempbranchdata[*(overflowline+jj)].from==bb&&*(flowflag+ii)==0)
{
*(flowflag+ii)=1;
dd=tempbranchdata[*(overflowline+jj)].from;
bb=tempbranchdata[*(overflowline+jj)].to;
temp=fabs(tempbranchdata[*(overflowline+jj)].branchP)-tempbranchdata[*(overflowline+jj)].capacity;
}
else if(tempbranchdata[*(overflowline+jj)].branchP<0
&&tempbranchdata[*(overflowline+jj)].to==bb&&*(flowflag+ii)==0)
{
*(flowflag+ii)=1;
bb=tempbranchdata[*(overflowline+jj)].from;
dd=tempbranchdata[*(overflowline+jj)].to;
temp=fabs(tempbranchdata[*(overflowline+jj)].branchP)-tempbranchdata[*(overflowline+jj)].capacity;
}
}
//for(jj=0;jj<Busnum;jj++)
//{
// if(tempbusdata[jj].busno==bb)
// bb=jj;
//}
}
else if(tempbranchdata[*(overflowline+ii)].branchP<0&&*(flowflag+ii)==0)
{
dd=tempbranchdata[*(overflowline+ii)].to;
bb=tempbranchdata[*(overflowline+ii)].from;
temp=fabs(tempbranchdata[*(overflowline+ii)].branchP)-tempbranchdata[*(overflowline+ii)].capacity;
for(int jj=0;jj<overflowno;jj++)
{
if(tempbranchdata[*(overflowline+jj)].branchP>0
&&tempbranchdata[*(overflowline+jj)].from==bb&&*(flowflag+ii)==0)
{
*(flowflag+ii)=1;
dd=tempbranchdata[*(overflowline+jj)].from;
bb=tempbranchdata[*(overflowline+jj)].to;
temp=fabs(tempbranchdata[*(overflowline+jj)].branchP)-tempbranchdata[*(overflowline+jj)].capacity;
}
else if(tempbranchdata[*(overflowline+jj)].branchP<0
&&tempbranchdata[*(overflowline+jj)].to==bb&&*(flowflag+ii)==0)
{
*(flowflag+ii)=1;
bb=tempbranchdata[*(overflowline+jj)].from;
dd=tempbranchdata[*(overflowline+jj)].to;
temp=fabs(tempbranchdata[*(overflowline+jj)].branchP)-tempbranchdata[*(overflowline+jj)].capacity;
}
}
}
int ccc=0;
for(int jj=0;jj<Busnum;jj++)
{
if(tempbusdata[jj].busno==bb)
{
bb=jj;
ccc++;
//break;
}
if(tempbusdata[jj].busno==dd)
{
dd=jj;
ccc++;
}
if(ccc==2)
break;
}
/////////////////////////////////////////////////
int *I,*O;//dd的送端节点集和bb的受端节点集
int *tempflag,*tempflag1;
int Inum=0,Onum=0;
I=new int[Busnum];
O=new int[Busnum];
tempflag=new int[Busnum];
tempflag1=new int[Busnum];
for(h=0;h<Busnum;h++)
{
*(tempflag+h)=0;
*(tempflag1+h)=0;
}
for(h=0;h<Branchnum;h++)
{
if(tempbranchdata[h].branchP>0&&tempbranchdata[h].to==tempbusdata[dd].busno)
{
for(int mm=0;mm<Busnum;mm++)
if(tempbusdata[mm].busno==tempbranchdata[h].from)
{
if(*(tempflag+mm)==0)
{
*(I+Inum)=mm;
Inum++;
*(tempflag+mm)=1;
}
break;
}
}
else if(tempbranchdata[h].branchP<0&&tempbranchdata[h].from==tempbusdata[dd].busno)
{
for(int mm=0;mm<Busnum;mm++)
if(tempbusdata[mm].busno==tempbranchdata[h].to)
{
if(*(tempflag+mm)==0)
{
*(I+Inum)=mm;
Inum++;
*(tempflag+mm)=1;
}
break;
}
}
if(tempbranchdata[h].branchP>0&&tempbranchdata[h].from==tempbusdata[bb].busno)
{
for(int mm=0;mm<Busnum;mm++)
if(tempbusdata[mm].busno==tempbranchdata[h].to)
{
if(*(tempflag1+mm)==0)
{
*(O+Onum)=mm;
Onum++;
*(tempflag1+mm)=1;
}
break;
}
}
else if(tempbranchdata[h].branchP<0&&tempbranchdata[h].to==tempbusdata[bb].busno)
{
for(int mm=0;mm<Busnum;mm++)
if(tempbusdata[mm].busno==tempbranchdata[h].from)
{
if(*(tempflag1+mm)==0)
{
*(O+Onum)=mm;
Onum++;
*(tempflag1+mm)=1;
}
break;
}
}
}
*(I+Inum)=dd;
*(O+Onum)=bb;
Inum++;Onum++;
double back_up1=0,back_up2=0,back_up3=0;
double temp2;//平衡节点出力
for(h=0;h<Inum;h++)
{
if(*(I+h)==*balanceno)
{
temp2=0;
for(int hh=0;hh<Branchnum;hh++)
{
if(tempbranchdata[hh].branchP>0&&tempbranchdata[hh].from==*balanceno)
temp2+=tempbranchdata[hh].branchP;
else if(tempbranchdata[hh].branchP<0&&tempbranchdata[hh].from==*balanceno)
temp2-=tempbranchdata[hh].branchP;
else if(tempbranchdata[hh].branchP>0&&tempbranchdata[hh].to==*balanceno)
temp2-=tempbranchdata[hh].branchP;
else if(tempbranchdata[hh].branchP<0&&tempbranchdata[hh].to==*balanceno)
temp2+=tempbranchdata[hh].branchP;
}
if(tempbusdata[*balanceno].maxPG>temp2)
back_up1+=temp2;
}
else
back_up1+=tempbusdata[*(I+h)].PG;
}
for(h=0;h<Onum;h++)
{
if(*(O+h)==*balanceno)
{
temp2=0;
for(int hh=0;hh<Branchnum;hh++)
{
if(tempbranchdata[hh].branchP>0&&tempbranchdata[hh].from==*balanceno)
temp2+=tempbranchdata[hh].branchP;
else if(tempbranchdata[hh].branchP<0&&tempbranchdata[hh].from==*balanceno)
temp2-=tempbranchdata[hh].branchP;
else if(tempbranchdata[hh].branchP>0&&tempbranchdata[hh].to==*balanceno)
temp2-=tempbranchdata[hh].branchP;
else if(tempbranchdata[hh].branchP<0&&tempbranchdata[hh].to==*balanceno)
temp2+=tempbranchdata[hh].branchP;
}
if(tempbusdata[*balanceno].maxPG>temp2)
back_up2=tempbusdata[*balanceno].maxPG-temp2;
back_up3+=temp2;
}
else
{
back_up2+=tempbusdata[*(O+h)].maxPG-tempbusdata[*(O+h)].PG;
back_up3+=tempbusdata[*(O+h)].PG;
}
}
if(back_up2>0)//受端节点有备用
{
double mini=temp;
if(mini>back_up1)
mini=back_up1;
if(mini>back_up2)
mini=back_up2;
//按比例减少送端节点的发电机出力
for(h=0;h<Inum;h++)
if(*(I+h)!=*balanceno)
tempbusdata[*(I+h)].PG=tempbusdata[*(I+h)].PG*(1-mini/back_up1);
//按比例增加受端节点的发电机出力
for(h=0;h<Onum;h++)
if(*(O+h)!=*balanceno&&back_up3!=0)
tempbusdata[*(O+h)].PG=tempbusdata[*(O+h)].PG*(1+mini/back_up3);
}
else
{
////////////////削负荷///////////////////////////
for(int i=0;i<Busnum;i++)
{
*(flag3+i)=0;
*(flag4+i)=-1;
*(flag7+i)=-1;
}
for(i=0;i<Branchnum;i++)
{
*(flag5+i)=0;
*(flag6+i)=-1;
}
///////////////////////确定削减域/////////////////////////
*(flag4+0)=bb;
*(flag7+bb)=0;
flag=0;
flag1=1;
flag2=0;
while(flag2!=Busnum)
{
if(flag2==0)
{
startfind=*(flag4+0);
*(flag3+startfind)=1;
}
else if(*(flag4+flag2)!=-1)
startfind=*(flag4+flag2);
//startfind=*(flag4+flag2);
for(i=0;i<Branchnum;i++)
{
if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].from==tempbusdata[startfind].busno)
{
if(*(flag5+i)==0)
{
*(flag5+i)=1;
*(flag6+flag)=i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -