#include
#include
#include
#include
#include
#include
class Branch
{
public:
int IZA[1000];//支路状态数
int IZ1[1000];//支路一端结点号
int IZ2[1000];//支路另一端结点号
int IWGA[1000];//发电机状态数
int IWG[1000];//发电机节点号
int IQ;//发电机台数
double GV1[1000];//发电机端电压的上限
double GV2[1000];//发电机端电压的下限
double GQ1[1000];//发电机无功出力上限
double GQ2[1000];//发电机无功出力下限
double QG1[1000];//节点发电机无功上限
double QG2[1000];//节点发电机无功下限
double DQG[1000];
double VG1[1000];//节点发电机端电压的上限
double VG2[1000];//节点发电机端电压的下限
int ILP[1000];//负荷状态数
int ILD[1000];//负荷结点号
int IPV[1000];//PV 结点的结点号
double Z1[1000];//支路正序电阻
double Z2[1000];//支路正序电抗
double Z3[1000];//支路正序电纳
double Z4[1000];//支路正序电纳暂存数组
double W1[1000];//发电机有功
double W2[1000];//发电机无功
double WL1[1000];//负荷有功
double WL2[1000];//负荷无功
int N;//网络结点数
int M;//网络支路数
int No;//平衡节点号
int IP;//负荷个数
int N1;
int popsize;//种群大小
int NC;//可调无功补偿设备的台数
int INC[1000];//可调电容器的节点号
int NC1[1000];//电容器的挡数
double CC1[1000];//无功补偿容量的上限
double CC2[1000];//无功补偿容量的下限
double CS[1000];//无功补偿容量的分段步长
JCC1[1000];//节点无功补偿容量的上限
int CN1[1000];//节点电容器的挡数
double
double JCC2[1000];//节点无功补偿容量的下限
double
SC[1000];//节点无功补偿容量的分段步长
int CK[1000];//随机产生无功补偿装置的档位值
double CK1[1000];
int NT;//变比可调的变压器台数
int INT[1000];//可调变压器号
int NT1[1000];//变压器可调挡数
double TV1[1000];//变压器变比的上限
double TV2[1000];//变压器变比的下限
int TK1[1000];//随机产生变压器分接头位置
double TK2[1000];
double TS[1000];//变压器变比分段步长
double Uo;//平衡结点给定电压值
double UP;//PQ 结点电压初值
double V[1000];//存结点电压幅值
double PV[1000];//PV 节点电压的中间变量
double H[1000];//存结点电压相角
double PD[1000];//存结点负荷的有功
double QD[1000];//存结点负荷的无功
double PF[1000];//存结点给定的发电有功
double QF[1000];//存结点给定的发电无功
double BC[1000];//节点无功补偿容量
double LV1;//PQ 节点电压的上限
double LV2;//PQ 节点电压的下限
int IVI[1000];//存 PV 结点的标志
public:
void setdata();//随机产生初始变量
void Read();//读入数据
void init();//给结点电压赋初值,确定结点给定的负荷和发电功率及给 PV 结点加标志
};
12、branch.cpp
#include"branch.h"
//从 a.txt 文件读入数据
void Branch::Read()
{
for(int g=0;g<=999;g++)
{
IZA[g]=0;//支路状态数
IZ1[g]=0;//支路一端结点号
IZ2[g]=0;//支路另一端结点号
IWGA[g]=0;//发电机状态数
IWG[g]=0;//发电机节点号
Z1[g]=0;//支路正序电阻
Z2[g]=0;//支路正序电抗
Z3[g]=0;//支路正序电纳
Z4[g]=0;//支路电纳暂存数组
GV1[g]=0;//发电机端电压的上限
GV2[g]=0;//发电机端电压的下限
GQ1[g]=0;//发电机无功出力上限
GQ2[g]=0;//发电机无功出力下限
QG1[g]=0;//节点发电机无功上限
QG2[g]=0;//节点发电机无功下限
DQG[g]=0;
VG1[g]=0;//节点发电机端电压的上限
VG2[g]=0;//节点发电机端电压的下限
PV[g]=0;//PV 节点电压的中间变量
ILP[g]=0;//负荷状态数
ILD[g]=0;//负荷结点号
W1[g]=0;//发电机有功
W2[g]=0;//发电机无功
WL1[g]=0;//负荷有功
WL2[g]=0;//负荷无功
V[g]=0;//存结点电压幅值
H[g]=0;//存结点电压相角
PD[g]=0;//存结点负荷的有功
QD[g]=0;//存结点负荷的无功
PF[g]=0;//存结点给定的发电有功
QF[g]=0;//存结点给定的发电无功
IVI[g]=0;//存 PV 结点的标志
IPV[g]=0;//存 PV 结点的结点号
PV[g]=0;//存 PV 结点的电压
INC[g]=0;//无功补偿设备的节点号
NC1[g]=0;//电容器的挡数
CC1[g]=0;//无功补偿容量的上限
CC2[g]=0;//无功补偿容量的下限
CS[g]=0;//无功补偿容量的分段步长
CN1[g]=0;//节点电容器的挡数
JCC1[g]=0;//节点无功补偿容量的上限
JCC2[g]=0;//节点无功补偿容量的下限
SC[g]=0;//节点无功补偿容量的分段
CK[g]=0;
CK1[g]=0;
BC[g]=0;
INT[g]=0;//可调变压器号
NT1[g]=0;//变压器可调挡数
TV1[g]=0;//变压器变比的上限
TV2[g]=0;//变压器变比的下限
TS[g]=0;//变压器变比分段步长
TK1[g]=0;
TK2[g]=0;
}
ifstream aa("a.txt");
aa>>N>>M>>No>>Uo>>IQ>>IP>>UP>>NC>>NT>>LV1>>LV2>>popsize>>N1;
for(int h=1;h<=M;h++)
{
aa>>IZA[h];
aa>>IZ1[h];
aa>>IZ2[h];
aa>>Z1[h];
aa>>Z2[h];
aa>>Z3[h];
}
for(int i=1;i<=IQ;i++)
{
aa>>IWGA[i];
aa>>IWG[i];
aa>>W1[i];
aa>>W2[i];
aa>>GV1[i];
aa>>GV2[i];//发电机端电压的下限
aa>>GQ1[i];//发电机无功出力上限
aa>>GQ2[i];//发电机无功出力下限
}
for(int j=1;j<=IP;j++)
{
aa>>ILP[j];
aa>>ILD[j];
aa>>WL1[j];
aa>>WL2[j];
}
for(int k=1;k<=N1;k++)
{
aa>>IPV[k];
aa>>PV[k];
}
for(int m=1;m<=NC;m++)
{
aa>>INC[m];//无功补偿设备的节点号
aa>>NC1[m];//电容器的挡数
aa>>CC1[m];//无功补偿容量的上限
aa>>CC2[m];//无功补偿容量的下限
aa>>CS[m];//无功补偿容量的分段步长
}
}
for(int n=1;n<=NT;n++)//输入的时候按支路中变压器的顺序输入
{
aa>>INT[n];//可调变压器号
aa>>NT1[n];//变压器可调挡数
aa>>TV1[n];//变压器变比的上限
aa>>TV2[n];//变压器变比的下限
aa>>TS[n];//变压器变比分段步长
aa.close();
};
//给结点电压赋初值
void Branch::init()
{
for(int I=1;I<=N;I++)
{
V[I]=UP;
H[I]=0.0;
}
for(int I0=1;I0<=N1;I0++)
{
int J0=0;
J0=IPV[I0];
V[J0]=PV[I0];
}
V[No]=Uo;
//确定结点给定的负荷和发电功率及给 PV 结点加标志
for(int I1=1;I1<=IP;I1++)
{
if(ILP[I1]!=0)
{
int J1=ILD[I1];
PD[J1]=WL1[I1];
QD[J1]=WL2[I1];
}
}
for(int I2=1;I2<=IQ;I2++)
{
if(IWGA[I2]!=0)
{
int J2=IWG[I2];
PF[J2]=W1[I2];
QF[J2]=W2[I2];
VG1[J2]=GV1[I2];//节点发电机端电压的上限
VG2[J2]=GV2[I2];//节点发电机端电压的下限
QG1[J2]=GQ1[I2];//发电机无功出力上限
QG2[J2]=GQ2[I2];//发电机无功出力下限
DQG[J2]= QG1[J2]-QG2[J2];
}
}
for(int I3=1;I3<=N1;I3++)
{
int J3=IPV[I3];
IVI[J3]=1;
}
for(int I5=1;I5<=NC;I5++)
{
int J5=INC[I5];//无功补偿设备的节点号
CN1[J5]=NC1[I5];//节点电容器的挡数
JCC1[J5]=CC1[I5];//节点无功补偿容量的上限
JCC2[J5]=CC2[I5];//节点无功补偿容量的下限
SC[J5]=CS[I5];//节点无功补偿容量的分段步长
BC[J5]=0;//节点无功补偿容量
}
};
void Branch::setdata()
{
for(int k=2;k<=IQ;k++)//随机产生群体中第 P 个个体的发电机端电压变量的电压值并赋给
确定的节点
{
}
int K1=IWG[k];
V[K1]=rand()*(VG1[K1]-VG2[K1])/32767.0+VG2[K1];
for(int n=1;n<=NT;n++)//随机产生群体中第 P 个个体的变压器档位变量
{
TK1[n]=(rand()%(NT1[n]+1));
Z3[n]=TK1[n]*TS[n]+TV2[n];
}
for(int j=1;j<=NC;j++)//随机产生群体中第 P 个个体的电容器档位变量
{
int j1;
j1=INC[j];
CK[j1]=(rand()%(CN1[j1]+1));
BC[j1]=CK[j1]*SC[j1]+JCC2[j1];
}
}
21、Ldp.h
//形成导纳矩阵头文件
//形成 B`和 B``
//形成功率误差分量 dp,dq
#include"branch.h"
class LDP:public Branch
{
public:
double D11[1000];//正序导纳矩阵对角元的实部
double D12[1000];//正序导纳矩阵对角元的虚部
double Y1[1000];//正序导纳矩阵非对角非零元的实部
double Y2[1000];//正序导纳矩阵非对角非零元的虚部
double YZ1[1000];//不规则互导纳元素的实部
double YZ2[1000];//不规则互导纳元素的虚部
int IY1[1000];//不规则互导纳元素的行号
int IY2[1000];//不规则互导纳元素的列号
int IY[1000];//正序导纳矩阵非对角非零元的列号
int In[1000];//正序导纳矩阵每行非对角非零元的个数
int IFD[1000];//每行非对角非零元首元的地址
int LF;//下一个可用的空白地址
int LCOL[1000];//各列非零元的首元地址
int ITAG[1000];//存放在 CE 中各元素的行指数
int NOZE[1000];//各列非零元素数(某一结点的"度"数加 1,1 为对角元素数)
double CE1[1000];//B`阵的有关元素
double CE2[1000];//B``阵的有关元素
double DP[1000];//dP/V
double DQ[1000];//dQ/V
double AM;//DP[i],DQ[i]中最大值;
public:
void a();//形成导纳矩阵
void d();//形成 NOZE,ITAG 数组及 B`,B``元素
void c1();//形成 DP,DQ
};
22、Ldp.cpp
#include
#include
#include"Ldp.h"
//形成导纳矩阵
void LDP::a()
{
int IG=0;//当前支路状态临时寄存单元
double GIJ=0;//电导
double BIJ=0;//电纳
double GI=0;//I 结点自导纳实部
double GJ=0;//J 结点自导纳实部
double BI=0;//I 结点自导纳虚部
double BJ=0;//J 结点自导纳虚部
int L=0;
double R=0;
double X=0;
double B=0;
double A=0;
int I8=0;
int J8=0;
for(int a=0;a<=999;a++)
{
D11[a]=0;
D12[a]=0;
Y1[a]=0;
Y2[a]=0;
IY[a]=0;
YZ1[a]=0;
YZ2[a]=0;
IY1[a]=0;
IY2[a]=0;
In[a]=0;
IFD[a]=0;
LCOL[a]=0;
//
//
ITAG[a]=0;
LNXT[a]=0;
NOZE[a]=0;
NSEQ[a]=0;
CE1[a]=0;
CE2[a]=0;
DP[a]=0;
DQ[a]=0;
}
for(int j=1;j<=M;j++)
{
IG=IZA[j];
if(IG==0)