这里是粒子群算法的代码部分
#ifndef SECONDQUE_H
#define SECONDQUE_H
#include<mainwindow.h>
#include<stdlib.h>
struct star{
double x1;
double y1;
star(){
x1=y1=0;
}
};
struct dim {
double a1;
double a2;
dim() {};
dim(double a, double b) {
a1 = a;
a2 = b;
}
dim operator*( dim&b) {
return dim(this->a1*b.a1,this->a2*b.a2);
}
dim operator-( dim&b){
return dim(this->a1-b.a1,this->a2-b.a2);
}
dim operator+( dim&b){
return dim(this->a1+b.a1,this->a2+b.a2);
}
};//二维
const int NN = 3;//初始种群数量
const int timess = 20;
struct particle {
dim v;
dim x;//x是当前位置,v是当前速度
double fit;//fit是全局最优解,pbest是自身最优解
unsigned long long fit2;//用于存储平方和
dim pbest;
particle() {};
particle(dim v1, dim x1, double fit1, dim pbest1,double fit22) {
v = v1;
x = x1;
fit = fit1;
pbest = pbest1;
fit2=fit22;
}
particle(particle& p) {
v = p.v;
x = p.x;
fit = p.fit;
pbest = p.pbest;
fit2=p.fit2;
}
};
const double maxx = 142.0068;//它的x1,x2是-10到10,需要更改为经度75-135内,纬度0-55内
const double minn = 67.9932;
const double max1 = 62.0068;
const double min1 = -7.0068;
const dim w0(0.5, 0.5);//自身速度惯性系数
const dim c10(0.2, 0.2);//自身历史最优加速系数
const dim c20(0.2, 0.2);//全局最优加速系数
struct shike1{
//用于存放86400秒中,每一秒能经过对应区域的圆心
QVector<star>weixing;
};
class secondque
{
public:
secondque();
QString Wname1[9]={"F:\\daerxiaQT\\WeiXingxitong\\SatCoverInfo_0.txt","F:\\daerxiaQT\\WeiXingxitong\\SatCoverInfo_1.txt","F:\\daerxiaQT\\WeiXingxitong\\SatCoverInfo_2.txt","F:\\daerxiaQT\\WeiXingxitong\\SatCoverInfo_3.txt","F:\\daerxiaQT\\WeiXingxitong\\SatCoverInfo_4.txt","F:\\daerxiaQT\\WeiXingxitong\\SatCoverInfo_5.txt","F:\\daerxiaQT\\WeiXingxitong\\SatCoverInfo_6.txt","F:\\daerxiaQT\\WeiXingxitong\\SatCoverInfo_7.txt","F:\\daerxiaQT\\WeiXingxitong\\SatCoverInfo_8.txt"};//文件路径数组
void secque();
shike1 cunfang2[86400];
particle zhongqunl[5];
particle zhongqunk[5];//平方和种群
particle min0;//全剧最佳
particle pmin;//平方和全局最佳
double shiying(dim x,particle& p);
void New_Fit(particle& p);
void InitP();
void Just(particle& p);
bool Judge(particle& p, particle& new_p);
bool Judge2(particle& p, particle& new_p);
void PT();
void GT();
};
#endif // SECONDQUE_H
#include "secondque.h"
#include"QFile"
#include<time.h>
#include<QDebug>
secondque::secondque()
{
}
void secondque::secque(){
//在经度75°E-135°E,纬度范围0°N-55°N的区域范围内,寻找时间间隙最大值最小的点的坐标,
//以及时间间隙最大值的平方和最小的点的坐标,经纬度精确到0.1°
//就是在经度75-135内,纬度0-55内
int qq2=0;
for(int ii=0;ii<9;ii++){
QFile file(Wname1[ii]);//经验证,九个文件是成功打开了的
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
int jiluc=0,miaoshu=0;
double yuan1,yuan2,yuan3,yuan4;
while (!file.atEnd())
{
QByteArray line = file.readLine();
QString str = QString(line);
QString ss="/";//需通过制表符或者空格来分开同一行的经纬度值,/代表是下一时刻的开始
int weizhi=str.indexOf(ss);
if(weizhi!=-1){
jiluc=0;
int kongg=str.indexOf(" ");//此处用于计算该圆是处于哪一个时刻,好放进第三题数组里
int dian1=str.indexOf(":");
int dian2=str.indexOf(":",str.indexOf(":")+1);
QString st1="",st2="",st3="";
if((dian1-kongg)==2)
st1+=str[kongg+1];
else{
st1+=str[kongg+1];
st1+=str[kongg+2];
}
st2+=str[dian1+1];
st2+=str[dian1+2];
st3+=str[dian2+1];
st3+=str[dian2+2];
miaoshu=st1.toInt()*60*60+st2.toInt()*60+st3.toInt();
continue;
}
else{
//否则该行即为坐标行
jiluc++;
if(jiluc!=1&&jiluc!=11)
continue;
QString kongge=" ",tab0=" ";//空格符与制表符
int kw=str.indexOf(kongge);//查找空格符位置
int tw=str.indexOf(tab0);//制表符位置
if(kw==-1)//没找到空格符代表该行是两个制表符
kw=str.indexOf(tab0,tw+1);
QString num0="",num1="";
for(int i0=1;i0<kw;i0++){
if(i0==1&&str[i0]=="-")
continue;
num0+=str[i0];//经度
}
for(int i0=kw+1;i0<kw+12;i0++){
num1+=str[i0];//纬度
}
double n1=num0.toDouble(),n2=num1.toDouble();
if(jiluc==1){
yuan1=n1;
yuan2=n2;
continue;
}
if(jiluc==11){
yuan3=n1;
yuan4=n2;
}
if(jiluc==11){
double x1=(double)(yuan1+yuan3)/(double)2;
double y1=(double)(yuan2+yuan4)/(double)2;//得到了此时刻圆心位置
if(x1<=maxx&&x1>=minn&&y1>=min1&&y1<=max1){
star ad;
ad.x1=x1;
ad.y1=y1;
cunfang2[miaoshu].weixing.push_back(ad);//将对应秒数下能够覆盖矩形的一部分的圆心存储进来
qq2++;
}
}
}
}
}
}
qDebug()<<qq2;
}
double secondque::shiying(dim x,particle& p){
int flagd=0,flagf=0,flagg=0;//分别用于判断4个状态以及存储最大时间间隙
unsigned long long flagh=0;//存储平方和
for(int i=0;i<86400;i++){
int flags=0;
for(int j=0;j<cunfang2[i].weixing.size();j++){
double cha1,cha2;
if(x.a1>cunfang2[i].weixing[j].x1)
cha1=x.a1-cunfang2[i].weixing[j].x1;
else
cha1=cunfang2[i].weixing[j].x1-x.a1;
if(x.a2>cunfang2[i].weixing[j].y1)
cha2=x.a2-cunfang2[i].weixing[j].y1;
else
cha2=cunfang2[i].weixing[j].y1-x.a2;
bool pa1=0;
if((cha1*cha1+cha2*cha2)<=49.0882){
pa1=1;
}
if(pa1==1){
flags=1;
//qDebug()<<"size"<<cunfang2[i].weixing.size();size里是有东西的,这儿无错
}
}
if(flags==0&&flagd==0){//代表此时处于时间间隙
flagf++;
}
else if(flags==0&&flagd==1){//代表前一秒处于时间窗口,此时进入时间间隙
flagd=0;
flagf++;
}
else if(flags==1&&flagd==1){//代表处于时间窗口内
}
else if(flags==1&&flagd==0){//代表前一秒处于时间间隙,此时处于时间窗口
if(flagf>flagg)
flagg=flagf;
flagh+=flagf*flagf;
flagd=1;
flagf=0;
}
}
//qDebug()<<"flagg"<<flagg;
p.fit2=flagh;
return flagg;
}
void secondque::New_Fit(particle &p){
p.fit =shiying(p.x,p);//适应函数,得到当前的自身解
}
void secondque::InitP(){
min0.x = { (double)99,(double)10 };//经度75-135内,纬度0-55内
pmin.x={ (double)99,(double)10 };
New_Fit(min0);
New_Fit(pmin);
//qDebug()<<min0.fit;
for (int i = 0; i < 5; i++) {
//zhongqunl[i].v.a1 = double(rand() % 76+67)+0.3;
//zhongqunl[i].v.a2 = double(rand() % 70-7)+0.3;
//zhongqunl[i].x.a1 = double(rand() % 76+67)+0.3;
//zhongqunl[i].x.a2 = double(rand() % 70-7)+0.3;
zhongqunk[i].v.a1 = double(rand() % 76+67)+0.3;
zhongqunk[i].v.a2 = double(rand() % 70-7)+0.3;
zhongqunk[i].x.a1 = double(rand() % 76+67)+0.3;
zhongqunk[i].x.a2 = double(rand() % 70-7)+0.3;
zhongqunl[0].v.a1=129.3;
zhongqunl[0].v.a2=30.3;
zhongqunl[0].x.a1 =100.3;
zhongqunl[0].x.a2 =-6.7;
zhongqunl[1].v.a1 =98.3;
zhongqunl[1].v.a2 =22.3;
zhongqunl[1].x.a1=126.3;
zhongqunl[1].x.a2=18.3;
zhongqunl[2].v.a1 =129.3;
zhongqunl[2].v.a2=38.3;
zhongqunl[2].x.a1=100.3;
zhongqunl[2].x.a2=61.3;
zhongqunl[3].v.a1=121.3;
zhongqunl[3].v.a2=46.3;
zhongqunl[3].x.a1=83.3;
zhongqunl[3].x.a2=61.3;
zhongqunl[4].v.a1=99.3;
zhongqunl[4].v.a2=28.3;
zhongqunl[4].x.a1=102.3;
zhongqunl[4].x.a2=56.3;
zhongqunk[i].x.a1 = 92.3;
zhongqunk[i].x.a2 = 49.3;
qDebug()<<zhongqunk[i].v.a1<<zhongqunk[i].v.a2<<zhongqunk[i].x.a1<<zhongqunk[i].x.a2;
New_Fit(zhongqunl[i]);
New_Fit(zhongqunk[i]);
//qDebug()<<zhongqunl[i].fit<<zhongqunl[i].x.a1<<zhongqunl[i].x.a2;
zhongqunl[i].pbest = { zhongqunl[i].x.a1, zhongqunl[i].x.a2 };//用来迭代更新
zhongqunk[i].pbest = { zhongqunl[i].x.a1, zhongqunl[i].x.a2 };//用来迭代更新
if (zhongqunl[i].fit < min0.fit) {
min0 = zhongqunl[i];//得到全局最优解
//qDebug()<<min0.x.a1<<min0.x.a2;
}
if (zhongqunk[i].fit2 < pmin.fit2) {
pmin = zhongqunk[i];//得到全局最优解
//qDebug()<<min0.x.a1<<min0.x.a2;
}
}//初始化种群速度与距离和最佳适应
}
void secondque::Just(particle &p){
if (p.x.a1 > maxx)p.x.a1 = maxx;
if (p.x.a2 > max1)p.x.a2 = max1;
if (p.x.a1 < minn)p.x.a1 = minn;
if (p.x.a2 < min1)p.x.a2 = min1;
}
bool secondque::Judge(particle& p, particle& new_p){
if (p.fit > new_p.fit)return true;
else return false;
}
bool secondque::Judge2(particle& p, particle& new_p){
if (p.fit2 > new_p.fit2)return true;
else return false;
}
void secondque::PT(){
dim r1 = { double(rand() % 76+67),double(rand() %70-7) };
dim r2 = { double(rand() % 76+67),double(rand() % 70-7) };
particle temp;
particle temp2;
dim w00(0.5, 0.5);//自身速度惯性系数
dim c100(0.2, 0.2);//自身历史最优加速系数
dim c200(0.2, 0.2);//全局最优加速系数
for (int i = 0; i < 5; i++) {
dim x1=zhongqunl[i].v*w00;
dim x3=zhongqunl[i].pbest-zhongqunl[i].x;
dim x4=c100*r1*x3;
dim x5=min0.x-zhongqunl[i].x;
dim x6=c200*r2*x5;
temp.v = x1 + x4 + x6;
temp.x = zhongqunl[i].x + temp.v;
//平方和部分
dim x11=zhongqunl[i].v*w00;
dim x31=zhongqunl[i].pbest-zhongqunl[i].x;
dim x41=c100*r1*x31;
dim x51=min0.x-zhongqunl[i].x;
dim x61=c200*r2*x51;
temp2.v = x11 + x41 + x61;
temp2.x = zhongqunl[i].x + temp.v;
Just(temp);
Just(temp2);
New_Fit(temp);
New_Fit(temp2);
if (Judge(zhongqunl[i], temp)) {
zhongqunl[i].fit = temp.fit;
zhongqunl[i].pbest = temp.x;
}
if (Judge2(zhongqunl[i], temp)) {
zhongqunl[i].fit2 = temp.fit2;
zhongqunl[i].pbest = temp.x;
}
}
}
void secondque::GT(){
for (int i = 0; i < 5; i++){
if (zhongqunl[i].fit < min0.fit)
min0 = zhongqunl[i];
if(zhongqunk[i].fit2 < pmin.fit2)
pmin=zhongqunk[i];
}
}
效果
![请添加图片描述](https://img-blog.csdnimg.cn/eb4220d5591a4cf087e8b59ebc5e248c.gif