📄 wangluochonggou.cpp
字号:
pNodePQ[head].q = gNodePQ[nodeNum][1];
iRoad++;
head++;
}
for (i = 7; i < 12; i++) { // 第三段线路 正向 5 条支路
if (population[j].chrom[i] != '1')
break;
if (i == 7)
pRoad[iRoad].head = 2; // 支路分叉节点
else
pRoad[iRoad].head = head;
pRoad[iRoad].tail = head+1;
roadNum = gChromRoad[i]; // 染色体 i 对应的支路
pRoad[iRoad].r = gRoadRX[roadNum][0];
pRoad[iRoad].x = gRoadRX[roadNum][1];
nodeNum = gRoadNode[roadNum][1] - 1; // 支路 roadNum 正向 末端节点
gNodeVIndex[head] = nodeNum;
pNodePQ[head].p = gNodePQ[nodeNum][0]; // 节点 P、Q
pNodePQ[head].q = gNodePQ[nodeNum][1];
iRoad++;
head++;
}
lossP += PowerFlow(head, 1, pRoad, pNodePQ);
if ( j == 0) {
for (i = 0; i < head; i ++)
gNodeV[gNodeVIndex[i]] = v[i];
}
// 计算第二个平衡节点
memset(pRoad,0,sizeof(pRoad));
memset(pNodePQ,0,sizeof(pNodePQ));
pRoad[0].head = 1; // 电源节点 2 所在支路
pRoad[0].tail = 2;
pRoad[0].r = gRoadRX[5][0];
pRoad[0].x = gRoadRX[5][1];
pNodePQ[0].p = gNodePQ[5][0];
pNodePQ[0].q = gNodePQ[5][1];
gNodeVIndex[0] = 5;
pNodePQ[1].p = gNodePQ[6][0];
pNodePQ[1].q = gNodePQ[6][1];
gNodeVIndex[1] = 6;
iRoad = 1;
head = 2;
for (i = 3; i >= 0; i--) { // 第一段线路 反向
if (population[j].chrom[i] != '1')
break;
pRoad[iRoad].head = head;
pRoad[iRoad].tail = head+1;
roadNum = gChromRoad[i]; // 染色体 i 对应的支路
pRoad[iRoad].r = gRoadRX[roadNum][0];
pRoad[iRoad].x = gRoadRX[roadNum][1];
nodeNum = gRoadNode[roadNum][0] - 1; // 支路 roadNum 反向 末端节点
gNodeVIndex[head] = nodeNum;
pNodePQ[head].p = gNodePQ[nodeNum][0]; // 节点 P、Q
pNodePQ[head].q = gNodePQ[nodeNum][1];
iRoad++;
head++;
}
for (i = 4; i < 7; i++) { // 第二段线路 正向
if (population[j].chrom[i] != '1')
break;
if (i == 4)
pRoad[iRoad].head = 2; // 支路分叉节点
else
pRoad[iRoad].head = head;
pRoad[iRoad].tail = head+1;
roadNum = gChromRoad[i]; // 染色体 i 对应的支路
pRoad[iRoad].r = gRoadRX[roadNum][0];
pRoad[iRoad].x = gRoadRX[roadNum][1];
nodeNum = gRoadNode[roadNum][1] - 1; // 支路 roadNum 正向 末端节点
gNodeVIndex[head] = nodeNum;
pNodePQ[head].p = gNodePQ[nodeNum][0]; // 节点 P、Q
pNodePQ[head].q = gNodePQ[nodeNum][1];
iRoad++;
head++;
}
lossP += PowerFlow(head, 1, pRoad, pNodePQ);
if ( j == 0) {
for (i = 0; i < head; i ++)
gNodeV[gNodeVIndex[i]] = v[i];
}
// 计算第三个平衡节点
memset(pRoad,0,sizeof(pRoad));
memset(pNodePQ,0,sizeof(pNodePQ));
pRoad[0].head = 1; // 电源节点 3 所在支路
pRoad[0].tail = 2;
pRoad[0].r = gRoadRX[11][0];
pRoad[0].x = gRoadRX[11][1];
pNodePQ[0].p = gNodePQ[11][0];
pNodePQ[0].q = gNodePQ[11][1];
gNodeVIndex[0] = 11;
pNodePQ[1].p = gNodePQ[12][0];
pNodePQ[1].q = gNodePQ[12][1];
gNodeVIndex[1] = 12;
iRoad = 1;
head = 2;
for (i = 6; i >= 4; i--) { // 第二段线路 反向
if (population[j].chrom[i] != '1')
break;
pRoad[iRoad].head = head;
pRoad[iRoad].tail = head+1;
roadNum = gChromRoad[i]; // 染色体 i 对应的支路
pRoad[iRoad].r = gRoadRX[roadNum][0];
pRoad[iRoad].x = gRoadRX[roadNum][1];
nodeNum = gRoadNode[roadNum][0] - 1; // 支路 roadNum 反向 末端节点
gNodeVIndex[head] = nodeNum;
pNodePQ[head].p = gNodePQ[nodeNum][0]; // 节点 P、Q
pNodePQ[head].q = gNodePQ[nodeNum][1];
iRoad++;
head++;
}
for (i = 11; i >= 7; i--) {
if (population[j].chrom[i] != '1')
break;
if (i == 11)
pRoad[iRoad].head = 2; // 支路分叉节点
else
pRoad[iRoad].head = head;
pRoad[iRoad].tail = head+1;
roadNum = gChromRoad[i]; // 染色体 i 对应的支路
pRoad[iRoad].r = gRoadRX[roadNum][0];
pRoad[iRoad].x = gRoadRX[roadNum][1];
nodeNum = gRoadNode[roadNum][0] - 1; // 支路 roadNum 反向 末端节点
gNodeVIndex[head] = nodeNum;
pNodePQ[head].p = gNodePQ[nodeNum][0]; // 节点 P、Q
pNodePQ[head].q = gNodePQ[nodeNum][1];
iRoad++;
head++;
}
lossP += PowerFlow(head, 1, pRoad, pNodePQ);
if ( j == 0) {
for (i = 0; i < head; i ++)
gNodeV[gNodeVIndex[i]] = v[i];
}
population[j].value = lossP;
}
}
void calculatefitnessvalue()//计算适应度
{
int i, k;
L++;
printf("遗传第%d代\n个体:遗传代数:染色体编码:网损\n",L);
// double temp;
for(i=0;i<popsize;i++)
{
population[i].fitness=population[i].value/18.35298;
printf("%2d : %2d : ",i+1,population[i].mCnt);
for (k=0;k<chromlength;k++)
printf("%c",population[i].chrom[k]);
printf("\t: %3.8f\t",population[i].fitness);
}
int index = 0;
struct individual tempIndi;
for(i = 0; i < OptCnt; i++) { // 只需找出前OptCnt个最大值即可
index = i; // 假设第i+1个个体适应度最大
for(int j = i+1; j < popsize; j++) {
if ( population[index].fitness > population[j].fitness )
index = j;
}
// 把最大适应度个体放在前面
if(i != index) {
tempIndi = population[i];
population[i] = population[index];
population[index] = tempIndi;
}
population[i].mCnt += 1; // 直接遗传代数加 1
}
printf("\n");
}
void selectoperator() //比例选择算法
{
int i,j,k;
double sum=0.0;
srand( (unsigned)time(NULL) );
struct individual newpopulation[POPSIZE];
for(i=0;i<popsize-OptCnt;i++)
{
j = rand()%popsize;
k = rand()%popsize;
if(population[j].fitness < population[k].fitness)
newpopulation[i] = population[j];
else
newpopulation[i] = population[k];
}
for(i=OptCnt;i<popsize; i++)
{
population[i]=newpopulation[i-OptCnt];
}
}
void crossoveroperator() //交叉算法
{
int i,j;
int index[POPSIZE];
int point,temp;
double p;
char ch;
srand( (unsigned)time(NULL) );
for (i=OptCnt;i<popsize;i++)
{
index[i]=i;
}
for (i=OptCnt;i<popsize;i++) // 随机选择要交叉的数组下标
{
point=rand()%(popsize-i)+i;
temp=index[i];
index[i]=index[point];
index[point]=temp;
}
short beg, end;
for (i=OptCnt;i<popsize-1;i+=2)
{
p=rand()%1000/1000.0;
pc = GetPc( population[index[i]].mCnt > population[index[i+1]].mCnt ? population[index[i]].mCnt : population[index[i+1]].mCnt );
if (p<pc)
{
point=rand() % 3; // 3 为电源数
if (point == 0 ) { // 交叉第一段 4 条支路
beg = 0;
end = 4;
}
else if (point == 1) { // 交叉第二段 3 条支路
beg = 4;
end = 7;
}
else { // 交叉第三段 5 条支路
beg = 7;
end = 12;
}
for (j = beg; j < end; j++)
{
ch = population[index[i]].chrom[j];
population[index[i]].chrom[j] = population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j] = ch;
}
}
}
}
void mutationoperator() //变异操作
{
short beg, end, i, j, point;
double p;
for(i=OptCnt;i<popsize;i++)
{
p=rand()%1000/1000.0;
if (p<GetPm(i))
{
point=rand() % 12; // 12 为支路数
if (population[i].chrom[point]) { // 支路没有断开可以变异
if (point < 4 ) { // 第一段 4 条支路
beg = 0;
end = 4;
}
else if (point < 7) { // 第二段 3 条支路
beg = 4;
end = 7;
}
else { // 第三段 5 条支路
beg = 7;
end = 12;
}
for (j = beg; j < end; j++)
population[i].chrom[j] = '1';
population[i].chrom[point] = '0';
}
}
}
}
void input() //数据输入
{
printf("初始化全局变量:\n");
printf(" 种群大小(50-500):");
scanf("%d", &popsize);
if((popsize%2) != 0)
{
printf( " 种群大小已设置为偶数\n");
popsize++;
};
printf(" 最优个体最小保留代数(20-50):");
scanf("%d", &Mmax);
printf(" 最优个体遗传数10-%d:",popsize/2);
scanf("%d", &OptCnt);
// popsize = 60;
// Mmax = 20;
// OptCnt = 10;
}
void main() //主函数
{
int i, L = 1;;
srand( (unsigned)time(NULL) );
generation=0;
// 初始化直接遗传代数
input();
for( i = 0; i < popsize; i++ )
population[i].mCnt = 0;
generateinitialpopulation();
evaluatepopulation();
int j = -1;
while(j < 0 )
{
generatenextpopulation();
evaluatepopulation();
for(i = 0; i < OptCnt; i ++) {
if (population[i].mCnt >= Mmax) {
j = i;
break;
}
}
}
printf("最小网损值等于:%f\n",population[j].fitness);
printf("其染色体编码为:");
for (i=0;i<chromlength;i++)
printf("%c",population[j].chrom[i]);
printf("\n");
printf("断开的支路为:\t");
for (i=0;i<chromlength;i++) {
if(population[j].chrom[i] == '0')
printf("支路 %d \t", gChromRoad[i]+1);
}
printf("\n");
}
int agaus(double a[],double b[],int n)
{
int *js,l,k,i,j,is,p,q;
double d,t;
js=(int *)malloc(n*sizeof(int));
l=1;
for (k=0;k<=n-2;k++)
{
d=0.0;
for (i=k;i<=n-1;i++) {
for (j=k;j<=n-1;j++)
{
t=fabs(a[i*n+j]);
if (t>d) { d=t; js[k]=j; is=i;}
}
}
if (d+1.0==1.0)
l=0;
else {
if (js[k]!=k) {
for (i=0;i<=n-1;i++) {
p=i*n+k; q=i*n+js[k];
t=a[p]; a[p]=a[q]; a[q]=t;
}
}
if (is!=k) {
for (j=k;j<=n-1;j++) {
p=k*n+j; q=is*n+j;
t=a[p]; a[p]=a[q]; a[q]=t;
}
t=b[k]; b[k]=b[is]; b[is]=t;
}
}
if (l==0) {
free(js); printf("fail\n");
return(0);
}
d=a[k*n+k];
for (j=k+1;j<=n-1;j++) {
p=k*n+j;
a[p]=a[p]/d;
}
b[k]=b[k]/d;
for (i=k+1;i<=n-1;i++) {
for (j=k+1;j<=n-1;j++) {
p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];
}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
if (fabs(d)+1.0==1.0) {
free(js);
printf("fail\n");
return(0);
}
b[n-1]=b[n-1]/d;
for (i=n-2;i>=0;i--) {
t=0.0;
for (j=i+1;j<=n-1;j++)
t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;
}
js[n-1]=n-1;
for (k=n-1;k>=0;k--) {
if (js[k]!=k) {
t=b[k];
b[k]=b[js[k]];
b[js[k]]=t;
}
}
free(js);
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -