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

📄 curtailment.cpp

📁 电力系统发输电系统基于非序贯的蒙特卡罗抽样的风险评估程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						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 + -