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

📄 wangluochonggou.cpp

📁 配电网重构是一个多目标、多时段、多组合、多约束的非线性优化问题。该问题的复杂性
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -