✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
⛄ 内容介绍
问题描述
卫星观测任务调度问题描述如下。基于对太空在轨卫星观测需求,需要在地面观测设备有限的情况下对我国上空在轨运行卫星进行观测任务调度。假设全国现共有M个地面观测设备(每个观测设备都需要对卫星执行相应的观测任务),N个待观测卫星,且M<<N。每个待观测卫星相对于不同的地面设备都有P个可供选择的可见时间窗口,P的数量根据卫星和观测设备的不同而有所差异。其中,每个可观测设备都可以在任何待观测卫星与之对应的可见时间窗口内对该卫星进行观测,观测的时长根据实际任务中该卫星所需观测时间而不同。同时,任意一颗卫星都可在其可见时间窗口内被地面观测设备所观测。由于观测设备自身的物理特性,每个地面观测设备对一颗卫星进行观测结束后对下一颗卫星观测之前,都需要经过设备转换时间,设备的转换时间根据设备的自身特性不同而不同。在地面观测设备选择对哪一颗卫星的哪一段可见时间窗口进行观测时,不同的卫星之间由于实际观测任务需求的不同,观测的优先级也不同。该卫星所承担的角色越重要,其观测优先级就越高,同时由于地面观测设备的精度有所偏差,地面观测设备精度越高,该设备的优先级也越高。不难理解,优先级高的地面观测设备应该尽量选择优先级较高的卫星进行观测。在整个观测任务的规划调度中,每颗卫星最多应被观测一次。调度的目标是在整个观测任务调度的过程中,尽量用较短的时间观测完更多优先级较高的卫星,使最终的卫星和地面站优先级达到最大。
此外,在对多卫星进行观测的任务调度中,还应满足以下约束条件:
(1)地面观测设备在对其中一个卫星的某一个可见时间窗口进行观测时,除设备故障原因,中途不能中断观测,且观测时间要达到实际任务规划中该卫星的观测时间需求;
(2)同一时间同一台地面观测设备只能在某一个卫星的某个可见时间窗口内对该卫星进行观测,同一时间卫星的某个可见时间窗口也只能被一台地面设备进行观测;
(3)当卫星的某一时间窗口被其中一台地面设备观测结束之后,该卫星的任何可见时间窗口都不能被其他地面设备进行观测,每个卫星最多只能被观测一次;
(4)对于同一台地面观测设备而言,其在完成对一颗卫星的观测任务后,对下一颗卫星进行观测前,需要经过设备的转换时间;
本文的卫星观测任务调度,观测设备是基于光学观测,不考虑观测设备与卫星之间的频率等其他物理因素,假设天气情况良好,在卫星的可见时间窗口内,各设备与卫星都可见。
⛄ 部分代码
%% 清空环境
clc
clear
close all
%% 模型参数
global Global
Global.num_satellite = 4; %卫星数
Global.num_object = 12; %观测目标数
%% 读取数据
% opts.SelectedVariableNames = 1:2;
a = readmatrix('data/G.csv','Range','B2:B5');
Global.rank_satellite = a';%卫星优先级(列表/矩阵)
a = readmatrix('data/P.csv','Range','B2:B13');
Global.rank_object = a';%观测目标优先级(列表/矩阵)
a = readmatrix('data/need.csv','Range','B2:B13');
Global.sat_need_time = a';%观测目标观测时长(列表/矩阵)
Global.visible_window = cell(Global.num_object,Global.num_satellite);
Global.num_visible_window = zeros(Global.num_object,Global.num_satellite);
for i=1:Global.num_object
datfile = ['data/sat' num2str(i) '.csv'];
a = readmatrix(datfile,'Range','B1:M4');
for j=1:Global.num_satellite
index = a(j,:)~=0;
Global.visible_window{i,j} = a(j,index);
Global.num_visible_window(i,j) = numel(Global.visible_window{i,j})/2;
end
end
%% 算法参数
maxgen = 300;
popsize = 150;
population = Init(popsize);
trace_obj = zeros(1,maxgen);
trace_con = zeros(1,maxgen);
%% 进化开始
for i=1:maxgen
% 交叉变异
offspring = Mutate(population,i/maxgen);
% 挑选新个体
population = Select(population,offspring,popsize);
% 记录信息
bestobj = population(1).objs;
trace_obj(i) = bestobj;
trace_con(i) = population(1).cons;
if ~mod(i,10)
cons = [population.cons];
num = sum(cnotallow==0);
avgcons = mean(cons);
disp(['第' num2str(i) '代,满足约束个体数量:' num2str(num), ',最佳个体:' num2str(bestobj)])
end
end
%进化结束
%% 展示结果
figure
plot(trace_obj)
title('最优目标值进化示意图')
bestsol = population(1);
drawresult
⛄ 运行结果
⛄ 参考文献
[1] 郝会成, 姜维, 李一军. 基于混合遗传算法的敏捷卫星任务规划求解[J]. 科学技术与工程, 2013(17):7.
[2] 高新洲, 郭延宁, 马广富,等. 采用混合遗传算法的敏捷卫星自主观测任务规划[J]. 2021.
[3] 王法瑞. 基于改进遗传算法的微小卫星自主任务规划方法研究[D]. 哈尔滨工业大学.
[4] 苗悦, 王峰, 张永强. 基于改进遗传算法的编队成像卫星自主任务规划[C]// 2017年空间机电与空间光学学术研讨会. 0.