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

📄 pso.cpp

📁 求解梯级水库群优化调度
💻 CPP
字号:
#include "pso.h"
#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;

void main(int argc,char **argv)
{
	//两个电站
	int i,j,m;
	int num_pso,num_section,num_plant,num_iterate;
	double w,c1,c2;//定义惯性权重,学习因子
	double pso[PSONUM][DIMNUM];//定义PSONUM个粒子
	double discharge[PSONUM][DIMNUM];//定义PSONUM个与粒子相关量,下泄流量
	double psovalue[PSONUM];//粒子对应目标函数值
	double *pp[PSONUM],*pd[PSONUM];//指针数组
	double profit,storedvalue,temp;//发电收益,存水价值
	double power,l,a,b;//总发电量
	double weight_p=1,weight_s=1;
	FILE *fp;
	int pnum;//第几个电价
	string str_data;
	char c_dir[1000];
	str_data="\\data.ini";
    strcpy(c_dir,argv[0]);
	wsprintf(strrchr(c_dir,'\\'),str_data.c_str());
	str_data=c_dir;	
	cout<<str_data<<'\t'<<"考虑存水价值,选择初始水位:"<<endl;
	cin>>slevel[0];
	cin>>slevel[1];
	cin>>slevel[2];
	w=1,c1=1,c2=1;
	num_pso=PSONUM;num_section=SECTIONNUM;num_plant=PLANTNUM;num_iterate=1200;
	for(i=0;i<PSONUM;i++)*(psovalue+i)=0;
	profit=0,storedvalue=0,temp=0,power=0,l=0,a=0,b=0;
	cout<<"Input the num of the power price:";
	cin>>pnum;
	cout<<"Running the program...."<<endl;
//	pnum=10;
	set_price(str_data,pnum);
	stored_value();
	for(i=0;i<PSONUM;i++)
	{
		pp[i]=pso[i];
		pd[i]=discharge[i];
	}
	for(j=0;j<num_iterate;j++)
	{
		w=1-0.6/num_iterate*j;//w从1到0.4线性减少
		if(j==0)
		{
			srand((int)time(NULL));
			init(pp,pd);
			fitness(pp,pd,psovalue,str_data);
		}
		else
		{
			iterate(pp,pd);
			fitness(pp,pd,psovalue,str_data);
		}
		update(pp,pd,psovalue);
		cout<<setiosflags(ios::fixed)<<setprecision(10)<<gbestobject<<endl;
		upspeed(w,c1,c2,pp);
	}
	profit=0;power=0;temp=0;
	for(m=0;m<SECTIONNUM;m++)
	{
		for(j=0;j<PLANTNUM;j++)
		{
			temp+=getpower(m,j,gbest,gbestdischarge);
			profit+=getpower(m,j,gbest,gbestdischarge)*price[m*PLANTNUM+j];
		}
	}
	cout<<profit<<endl;
	power=temp;
	storedvalue=0;
	for(j=0;j<PLANTNUM;j++)
	{
		temp=getvolume(*(gbest+(SECTIONNUM-1)*PLANTNUM+j),j)-getvolume(*(slevel+j),j);
		storedvalue+=temp**(sprice+j);
	}
	cout<<"The object is:  ";
	cout<<setiosflags(ios::fixed)<<setprecision(1)<<gbestobject<<endl;
	cout<<"The total power amount is :"<<power<<'\n'<<"The total power profit is:"<<profit<<endl;
	cout<<"The total stored value is :"<<storedvalue<<'\n'<<"The total benefit is:"<<profit+storedvalue<<endl;
	strcpy(c_dir,argv[0]);
	wsprintf(strrchr(c_dir,'\\'),"\\out.ini");	
	if((fp=fopen(c_dir,"ab"))==NULL)
	{
		printf("can not open the out.ini file");
		exit(0);
	}
	for(i=0;i<100;i++)
		fprintf(fp,"*");
	fprintf(fp,"\r\n");
	for(i=0;i<100;i++)
		fprintf(fp,"*");
	fprintf(fp,"\r\n");
	fprintf(fp,"\r\n本次仿真结果如下:\r\n");
	l=L,a=A,b=B;
	fprintf(fp,"PSONUM=%d,IterateNum=%d,PLANTNUM=%d,SECTIONNUM=%d,A=%.0f,Price=%d\r\n",num_pso,num_iterate,num_plant,num_section,a,pnum);
	fprintf(fp,"B=%.0f,L=%.0f,调度期从6月份开始,至第二年5月份结束,期初各水库水位为:\r\n",b,l);
	for(i=0;i<PLANTNUM;i++)
		fprintf(fp,"plant[%d]=%.3f\t",i,slevel[i]);
	fprintf(fp,"\r\n");
	fprintf(fp,"仿真目标函数值为:%.3f,总发电量为:%.1f\r\n",gbestobject,power);
	fprintf(fp,"总发电收益为:%.1f,期末存水价值为:%.1f\r\n",profit,storedvalue);
	fprintf(fp,"发电收益和期末存水价值(权重均为1)之和为:%.1f\r\n",profit+storedvalue);
	fprintf(fp,"各时段末水库水位、时段平均泄水流量、时段平均发电引用流量、时段发电量如下:\r\n\r\n");
	fprintf(fp,"时段末水位(米)\t泄水流量(立方米/秒)\t发电引用流量(立方米/秒)\t发电量(千瓦时)\r\n");
	for(i=0;i<DIMNUM;i++)
	{
		j=i%PLANTNUM;//电站号
		m=i/PLANTNUM;//时段号
		if(*(gbestdischarge+i)>*(qmax+j))
			fprintf(fp,"%.3f\t%.4f\t%.4f\t%.1f\r\n",*(gbest+i),*(gbestdischarge+i),*(qmax+j),getpower(m,j,gbest,gbestdischarge));
		else
			fprintf(fp,"%.3f\t%.4f\t%.4f\t%.1f\r\n",*(gbest+i),*(gbestdischarge+i),*(gbestdischarge+i),getpower(m,j,gbest,gbestdischarge));
	}
	fclose(fp);
	cout<<"The program is over"<<endl;
	getchar();
}

⌨️ 快捷键说明

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