📄 pso.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 + -