卫星系统算法课设(二)-志明老师

这里是粒子群算法的代码部分

#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

做的蛮垃圾的,大家不要嫌弃

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值