⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 curtailment.cpp

📁 电力系统发输电系统基于非序贯的蒙特卡罗抽样的风险评估程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
										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;
												*(flag7+j)=*(flag7+startfind)+1;
												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;
												*(flag7+j)=*(flag7+startfind)+1;
												*(flag4+flag1)=j;
												flag1++;
											}
											break;
										}
									}
								}
							}
							if(*(flag4+flag2)==-1)
								flag2=Busnum-1;
							flag2++;
						}
						//intPrintfVector(flag7,1,Busnum);
						temp1=0;
						int j=0;
						while(temp1<temp&&j<Busnum)
						{
							for(i=0;i<Busnum;i++)
							{
								if(*(flag7+i)==j)
									temp1+=tempbusdata[i].PL;
							}
							j++;
						}
						////////按比例削负荷削减域内的负荷
						if(temp1>temp)
							for(i=0;i<Busnum;i++)
							{
								if(*(flag7+i)<j&&*(flag7+i)>-1)
									tempbusdata[i].PL=tempbusdata[i].PL*(1-temp/temp1);
							}
						}
					delete []I;
					I=NULL;
					delete []O;
					O=NULL;
					delete []tempflag;
					tempflag=NULL;
					delete []tempflag1;
					tempflag1=NULL;
					}//////////hehe////////////////////////////////////
					delete []flowflag;
					flowflag=NULL;
				}
			}
			else if(flag1==Busnum)//系统没有解列
			{
					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;
										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;
												*(flag7+j)=*(flag7+startfind)+1;
												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;
												*(flag7+j)=*(flag7+startfind)+1;
												*(flag4+flag1)=j;
												flag1++;
											}
											break;
										}
									}
								}
							}
							if(*(flag4+flag2)==-1)
								flag2=Busnum-1;
							flag2++;
						}
						//intPrintfVector(flag7,1,Busnum);
						temp1=0;
						int j=0;
						while(temp1<temp&&j<Busnum)
						{
							for(i=0;i<Busnum;i++)
							{
								if(*(flag7+i)==j)
									temp1+=tempbusdata[i].PL;
							}
							j++;
						}
						////////按比例削负荷削减域内的负荷
						if(temp1>temp)
							for(i=0;i<Busnum;i++)
							{
								if(*(flag7+i)<j&&*(flag7+i)>-1)
									tempbusdata[i].PL=tempbusdata[i].PL*(1-temp/temp1);
							}
						}
					delete []I;
					I=NULL;
					delete []O;
					O=NULL;
					delete []tempflag;
					tempflag=NULL;
					delete []tempflag1;
					tempflag1=NULL;
					}//////////hehe////////////////////////////////////
					delete []flowflag;
					flowflag=NULL;
			}
		}
		for(i=0;i<overflowno;i++)
			tempbranchdata[*(overflowline+i)].alrnum=1;	
		count++;
	}//////////////////////////////////////////////////////////////
	delete []overflowline;
	overflowline=NULL;
	delete []flag3;
	flag3=NULL;
	delete []flag4;
	flag4=NULL;
	delete []flag5;
	flag5=NULL;
	delete []flag6;
	flag6=NULL;
	delete []flag7;
	flag7=NULL;
		//for(int i=0;i<Busnum;i++)
			//printf("%lf\t",tempbusdata[i].PL);
		//getchar();
	}
	delete []B;
	B=NULL;
	delete []X;
	X=NULL;
	delete []PSP;
	PSP=NULL;
	delete []Angle;
	Angle=NULL;
	delete []branchP;
	branchP=NULL;
	delete []over;
	over=NULL;
	delete []overflowline;
	overflowline=NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -