卫星时间窗口及其调度

1 选题介绍

这个选题主要指向的是在卫星移动通信,气象预报,遥感探测等多个领域发挥着越来越重要的作用。而且,在一般的航天任务应用中,我们往往需要使用一群卫星共同来完成任务。将一群卫星的集合,称作卫星星座的大背景下的模拟情况。在已有卫星数据和地面目标数据的前提下,实现对于一个指定时间段内,卫星星座对于城市群的覆盖情况,对于指定区域的覆盖情况,以及对于在限制条件下的卫星任务调度。

2 选题分析

2.1问题分析

这个选题有三个子问题,但是大前提都是在卫星星座的给定服务情况下求解问题:

对于三个子问题,解决每个子问题的前提是对卫星数据进行处理,将给定的卫星每秒数据进行读入和处理,整理成可利用的数据,以便于后续的使用。主要是将给定的22个卫星服务球面圆上的经纬度,求解出圆心和外接圆半径。

子问题1

求解卫星星座对于给定的城市集合,对于每座城市的覆盖情况,二重覆盖情况,以及对单个城市卫星星座最大时间间隙和平均时间间隙的求解。

该子问题主要是针对于卫星每一时刻的覆盖球面圆q和球上一点p的处理,存在两种情况,q包含p以及q不包含p。在初步的数据处理后,可以直接进行p与q的是否包含的计算;而对于二重覆盖的计算,则可以在计算是否覆盖的同时进行,最后将是否覆盖和二重覆盖的数据进行区分整理即可得到结果;对于最大时间间隙和平均时间间隙,则可以对于处理完了的时间覆盖窗口和给定的时间范围,进行求最大值Max和求和Total,最终求Total/时间间隙数,得到子问题1的全部所需结果。

子问题2

求解卫星星座对于某一给定区域在某一时刻的覆盖率。

该子问题是对于给定的一个经纬度矩形范围,来求解卫星星座对于该区域的覆盖情况。首先可以将经纬度矩形划分为20*20的400个小经纬度矩形,然后通过卫星星座与这400个小经纬度矩形进行是否包含,相交,不相交三种不同的后继处理。包含情况:直接进行对该小矩形的面积计算,并将该矩形标记上已覆盖;相交情况:将矩形按顺时针方向,划分为四个小矩形,加入不确定矩形的vector中,并标记上已划分;不相交:不做处理。在上述判断后,对于不确定矩形的vector中,进行新的一轮包含,相交,不相交的判断,不同的是,每个子矩形划分后继承父矩形的划分次数,原则上限制划分4次;相交情况处理从标记划分,到标记不确定。最终求的可确定矩形,不确定矩形,求解瞬时覆盖率。

子问题3:

在给定的测试数据下,对于不同时间范围,不同目标城市集,在卫星转换时间的限制下,进行对于地面城市的任务安排调度。

该子问题是在基于卫星转换时间的限制下,安排指定的卫星对于指定的地面城市服务任务的执行,力求得出卫星星座对于地面目标在指定时间内的可行解甚至于最优解。我的代码只实现了贪心策略下的可行解的求解,贪心策略为效益值最大的先安排任务,安排在尽可能早的时间内,直至没有任务能被完全执行或是被执行的时候停止。

2.2优化模型

子问题1:

主要是对于9个卫星一天内每一秒的22个经纬度描述的点所构成的球面多边形的数据进行处理。采取将球面多边形转化为球面圆的形式,进行后续处理,取22个经纬度描述的点的最上,最左,最右三个点进行圆心和半径的求解。

子问题2:

将给定的由四个经纬度描述的点的球面矩形,划分为20*20的小球面矩形,采用分治的思想进行卫星星座和这400个球面小矩形之间的几何关系的判定,求出每一时刻400个球面小矩形的被服务情况。

子问题3:

对于卫星星座和地面目标任务集合,限制条件有各卫星对于地面目标的可见时间窗口大小,卫星在服务完某一城市后的转换时间,城市所需服务最短时间。采取将判断条件设定为可见时间窗口是否大于城市所需时间加上卫星转换时间,将三个限制条件转换为两个,便于后续的任务调度。

2.3问题难点分析

子问题1

主要是对于9个卫星一天内每一秒的22个经纬度描述的点所构成的球面多边形的数据进行处理。对于读入9个文件名为类似于SatCoverInfo_0.txt的txt文件,但是一个文件内容过多,直接采取一行一行读取,一个文件所需时间在vs2019下大约为11秒,全部读取+预处理大约为100s。所需时间过多,所以采取将文件一次性读入的操作,避免磁盘内部读取次数过多,时间耗费大,在不同文件之间,采取多线程读取的方式,这样子单个文件读取速度稍快一点点,在vs2019下需要约9s,而9个文件全部读取在vs2019下需要约21s,整体效率提升了好多;如何将数据转换为可用的,文件内部数据为一天每一秒的22个经纬度描述的点,如何通过这22个点来判断后续球面上某点是否在卫星服务范围内,可以采取射线法,但是存储所需内存也过多,我选择将22个点,选取三个相距比较大的点,求取这22个点所在的外接圆,只需要存储圆心坐标和外接圆半径。

子问题2:

主要是卫星星座对于指定球面多边形存在多种几何关系,不好进行覆盖面积的计算。存在三种情况需要区分,同时对于球面矩形计算出来的面积是否精准也是一个难点。对于第一个难点,采取将整个多边形进行网格划分,分成小部分进行后续判断划分。对于第二个难点直接采取球坐标系下二重积分求取面积。

子问题3:

主要是卫星和地面目标之间或是内部的限制,导致调度任务的安排难以实现最优。是各个卫星对于不同地面目标的可服务时间窗口的限制,各个卫星在服务完某个地面目标后有不同的时间转换时间的限制,以及各个地面目标的效益和损耗时间的限制。

3 算法设计与实现

主要是子问题2和子问题3具有算法思想,分别利用了分治和贪心的思想。子问题1主要还是原始数据的处理。

3.1算法主要思想

子问题2:

利用了分治的思想,将一个大的问题分解为一个个小的子问题,进行求解,然后将子问题的解返回,最终得到问题的解。

子问题3:

利用了贪心的思想,将地面目标集中按效益从大到小降序排列,然后在时间安排上也采取贪心的想法,任务安排在最早的时间段。

3.2核心算法设计

3.2.1 算法一 分治思想

子问题2:

利用了分治的思想,将一个大的问题分解为一个个小的子问题,进行求解,然后将子问题的解返回,最终得到问题的解。是将指定的球面多边形在网格上被划分成20*20的小网格,然后对每个小网格进行几何判断,分三种情况进行处理;当小网格处于和某卫星相交的情况下,进行划分,存入到存储划分网格的容器中,然后再分三种情况进行处理,最终得到覆盖面积的大小。

3.2.2 算法二 贪心思想

子问题3

主要是将效益值大的目标城市先安排,然后在该城市在其可见时间窗口中选取不冲突的最早时间区间,进行任务的安排。

3.3数据结构设计

三个子问题的数据结构都是相似的。

共同的数据结构

定义了Point类型的结构体,包含经纬度和三维坐标的存储变量,以及设置经纬度的函数和经纬度转换为三维坐标的函数;定义了名为TimeSlot的类,包括时间窗口的开始时间,结束时间,持续时间,以及秒数转换为**:**:**的形式的函数;定义了一个City类,内部存储目标城市集合,存储城市名字和城市经纬度的变量,以及可见时间窗口的存储容器vector,类型为TimeSlot。

点类

struct Point

{

double lon = 0;//经度

double lat = 0;//纬度

double x, y, z;

void set_location(double x, double y);

void ChangeLon();

};

TimeSlot

class TimeSlot

{

public:

void time_area_set(string name, int begin, int end, int length);

string cover_cityname = "";

string begin_time = "";

string end_time = "";

int begin;

int end;

int length;

};

City类

class City

{

public:

vector<TimeSlot> *SingleTime=NULL;

string *target_name = NULL;  //所给定的目标城市

Point *target_loc = NULL;   //目标城市的经纬度

void xigou();

int* cost=NULL;

int* value = NULL;

int city_num = 0;

void init(int num);

};

子问题2中,对于球面多变形的存储,定义了矩形的类,内部包括左上角,右上角,左下角,右下角四个点的信息,以及设置矩形信息的函数和分割矩形的函数。

class angle

{

public:

Point UL, UR, LL, LR;

int flag = -1;//-1表示未被访问 0表示已经划分 1表示已覆盖

int divi_time = 0;//划分次数

void divi_angle(angle& target, int num);

void set_location(double UL_lon, double UL_lat, double LR_lon, double LR_lat);

};

3.4算法模块设计

子问题1

主要是将处理完后的卫星数据,通过近乎遍历的方式,求各个卫星对于每个卫星的可见时间窗口。但是根据实际情况中,如果当前卫星a对于地面目标p处于服务状态,假如k秒后a对于p也处于服务状态,那么中间的k-1秒也会是处于服务状态,省去小部分判断。对于可见时间窗口和二重覆盖窗口,通过一个int数组,初始化为0,下标表示当前的秒数,内部存储数据最终每秒情况下,当前目标城市有多少个服务卫星;表示同时设置变量beg和end,初始化也为0,用于寻找每个城市对于不同卫星的可见时间窗口;在一个城市对于所以卫星在指定时间范围内是否被服务以及服务卫星数量的处理后,对于该定义的int数组进行遍历,同时进行被覆盖时间的整合和二重覆盖时间的寻找,即前者寻找连续大于0的数字串长度,后者寻找连续为2的数字串长度。

子问题2

除了卫星数据的处理外,与其他两问没有太大的联系。该子问题是对于指定矩形的对于卫星星座覆盖率的求解。对于初始划分20*20,都标记为不相交,对于每个小矩形进行求解,因为卫星服务的球面圆远大于小矩形,所以进行几何判断,区分出包含,相交,不相交三种情况。包含情况为标记该小矩形为已覆盖,后续不参与其他卫星几何判断;相交则标记为相交情况,后续也不参与其他卫星几何判断,不相交则跳过;对于划分后的矩形进行二次判断,包含和不相交处理情况和先前一致,而相交情况下,限制划分次数为4,划分次数为4,处于相交状态的小矩形不予后续处理,跳过;划分次数不为4,则继续执行划分。在上述处理的同时,进行包含小矩形的面积累加。

子问题3

第一问中的每个城市不同卫星的可见时间的计算结果,作为子问题3的先驱数据,类似于一个gannt图,而第一问的数据更像是没有被安排的初始情况。该子问题是在基于卫星转换时间的限制下,安排指定的卫星对于指定的地面城市服务任务的执行,力求得出卫星星座对于地面目标在指定时间内的可行解甚至于最优解。我的代码只实现了贪心策略下的可行解的求解,贪心策略为效益值最大的先安排任务,安排在尽可能早的时间内,直至没有任务能被完全执行或是被执行的时候停止。

4 结果测试

4.1运行环境描述

程序运行在windows11 64 位操作系统, 基于 x64 的处理器下的visual studio 2019上,用C++进行程序编写。

4.2测试数据设计

卫星的测试数据主要是在卫星的服务球面圆上较为均匀的取22个经纬度描述的点,一共23行数据。类似于以下形式:

2022/1/1 0:00:00

259.6234369809845 7.127690837081347

255.4404955237949 5.726330337135493

254.0408442700897 4.324969837189639

253.22703283685058 2.923609337243784

252.78567479991366 1.52224883729793

252.64497219019384 0.1208883373520742

252.78602961324285 -1.2804721625937798

253.2276971299826 -2.6818326625396343

254.04171512407595 -4.08319316248549

255.4413679133661 -5.484553662431344

259.6234443474301 -6.8859141623771984

263.8623272892994 -5.484553662431344

265.26198007858954 -4.08319316248549

266.07599807268286 -2.6818326625396343

266.5176655894227 -1.2804721625937798

266.6587230124716 0.1208883373520742

266.5180204027518 1.52224883729793

266.0766623658149 2.923609337243784

265.2628509325758 4.324969837189639

263.8631996788706 5.726330337135493

259.6234369809845 7.127690837081347

对于目标城市集合,一行代表一个城市,一行里面的数据依次为城市名,所在经度,所在纬度,损耗时间以及效益值。

4.3测试结果分析

子问题1的测试结果大体上与实际服务范围相近,一般误差在2s以内,表明第一问的处理是可以被接受的,符合实际结果的。

子问题2的测试结果仍旧存在一定误差,在初始时误差不大,在0.1以内,但是随着真实覆盖面积的增大,程序得到的覆盖率仍旧存在着较大误差,在采取矩形分割为球面三角形计算时,忽略了弧导致的面积偏大,以至于误差很大;在换积分计算球面矩形后,仍存在着误差,但是误差有所减小。

子问题3的贪心解与最优解的最终效益总和有着较大的差异,表明贪心策略的不足,贪心策略单单采取效益值最大作为处理先后顺序的原则仍存在不足。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值