system: [SYSTEM]

user: 3. 改进的A * 算法 下面我们将在经典的A*算法 [ 6 ] - [ 12 ] 的基础上，提出了一种改进的A*算法，用于解决本文的飞行器航迹规划问题。 A*算法是一种启发式搜索算法。通过在搜索空间不断评估路径的估价函数值来启发式搜索节点来构造最优路径。通常A*算法的常用估价函数表示为 f ( n ) = g ( n ) + h (n) 其中，n为当前节点， f ( n ) 是从初始点经由节点为n到目标点的估价函数， g ( n ) 是在状态空间中从初始节点到节点n的实际代价， h ( n ) 是从节点n到目标节点的估计代价。 A*搜索算法的搜索效率由搜索方向和搜索步长决定。为了提升搜索效率，需要从搜索方向、搜索节点确定改进。路径的优劣则主要依赖于估价函数的设计。所以我们从搜索节点和方向方面改进，结合本文要解决的问题，我们改进了校正点的选择，例如每次选择可达域中最近的校正点，并且本文需要加入水平、垂直的校正，在算法的搜索方向改进中，考虑如果当前校正了水平误差，则水平误差暂时无忧，能最快降低垂直误差的机会就是下一次校正，如此交替进行，这样就 能确保两个误差都尽可能小，所以改进后的算法的设计对极端情况承受能力较强，并将改进的算法的具体步骤设计在下文給出，除非另有说明，否则我们总是在本文中使用算法命名的符号。 第一方面，我们针对所有文献 [ 1 ] 中的数据，来分别规划满足约束条件(1)~(7)时，飞行器运行的最优航迹，并综合性考虑以下两个优化目标： 关于飞行器的文献 [ 1 ] 中附件1数据的参数为： α 1 = 25 ，     α 2 = 15 ，     β 1 = 20 ，     β 2 = 25 ，     θ = 30 ，     δ = 0.001 关于飞行器的文献 [ 1 ] 中附件2中数据的参数为： α 1 = 20 ，     α 2 = 10 ，     β 1 = 15 ，     β 2 = 20 ，     θ = 20 ，     δ = 0.001 1) 通过算法来预判每个最优路径，使航迹长度尽可能小； 2) 通过算法来使经过校正区域进行校正的次数尽可能少，并讨论分析所用算法的有效性和复杂度。 第二方面，我们针对所有文献 [ 1 ] 附件中的数据(参数与第一问的相同)，分别规划满足条件(1)~(8)时飞行器的航迹，并综合性考虑以下两个优化目标： 1) 通过算法来预判每个最优路径，使航迹长度尽可能小； 2) 通过算法来使经过校正区域进行校正的次数尽可能少，并讨论分析所用算法的有效性和复杂度。 最后根据一、二两种方案设计出算法1和2，并根据通过软件实现后得出的结果，画出两个方面的两个数据集的航迹规划路径图，见图1~6，将结果(即飞行器从起点出发所经过的误差校正点编号，和校正前的误差)依次填入航迹规划的结果表中，见表1~8，并得出算法的时空复杂度，证明算法是有效可行的，见表9。 算法1 Step1：计算当前点A的可达域； Step2：若可达域非空，转Step3，否则，标记当前点为失败点，转Step5； Step3：若终点在可达域中，结束程序，逆序输出轨迹栈元素即可得到航迹规划。否则，转Step4； Step4：选择可达域中最近的点Aclose作为后继点，将可达域存入可达域栈C中，将上一校正点Apre校正后的水平误差pre_h和垂直误差pre_v存入对应栈，以pre_h和pre_v为基础加上Apre到A点所产生的误差增量来更新对应误差h、v，将后继点加入轨迹栈，标记后继点为当前点，转Step1； Step5：将轨迹栈中栈顶元素出栈(此元素与当前点一致，均为失败点)，再从栈顶出栈一个元素，标记为当前点，将可达域栈栈顶元素出栈，去除可达域中失败点的信息(确保此点不会再有机会选中)之后作为新的可达域，将水平误差栈和垂直误差栈栈顶元素出栈，替换当前水平误差h和垂直误差v，转Step2。 图1. 一(数据1)航迹路径图 图2. 一(数据2)航迹路径图 算法2 Step1：计算当前点A的可达域，若终点是在可达域转Step2；否则转Step3； Step2：计结束程序，逆序输出轨迹栈元素即可得到航迹规划； Step3：计计算当前点到达可达域各点的误差，在此误差值下，假设可达域各点Bi为当前点； Step4：计计算Bi是否存在可达域，将存在可达域的点加入集合P； Step5：计计算点A到P中各点的距离以及P中各点到终点的距离之和，以上一校正点Apre校正后的水平误差pre_h和垂直误差pre_v为基础加上Apre到A点所产生的误差增量来更新对应误差h、v，取最小距离点作为后继点，将后继点加入轨迹栈，标记后继点为当前点，进入Step1。 图3. 二(数据1)航迹路径图 图4. 二(数据2)航迹路径 第三方面，我们解决飞行器在部分校正点进行误差校正时存在无法达到理想校正的情况，假设飞行器到达该校正点时即可知道在该点处是否能够校正成功，但不论校正成功与否，均不能改变规划路径，因此，部分校正点存在校正失效的可能，会增大该方向误差的值，进而减少其误差余量，将影响后续校正点的选择，会改变航迹甚至使得航迹规划失败。因校正失效的概率较低，只有20%，根据不同情况可以用两种方法处理失效的校正，并设计出算法3和算法4，它是以算法1和算法2为基础调整校正时的误差更新机制。 图5. 三(数据1)航迹路径图 图6. 三(数据2)航迹路径图 Table 1 Final track route 数据 航迹路径 数据1 ['A'， '503'， '200'， '136'， '80'， '237'， '278'， '375'， '172'， '340'， '277'， '501'， 'B'] 数据2 ['A'，'140'， '150'， '114'， '234'， '222'， '230'， '225'， '255'， '123'， '45'， '160'， '92'， '93'， '61'， '292'， 'B'] 表1. 最终航迹路径一 Table 2 Track planning results Table 1 : Data 矫正点编号 矫正前垂直误差 矫正前水平误差 矫正点类型 0 0 0 出发点A 140 5.6558 5.6558 垂直 150 6.7568 12.4126 水平 114 15.52 8.7632 垂直 234 4.5312 13.2944 水平 222 11.8136 7.2823 垂直 230 11.16 18.4422 水平 225 14.9956 3.8358 垂直 255 7.4652 11.3009 水平 123 15.9366 8.4714 垂直 45 10.0062 18.4776 水平 160 17.4913 7.4851 垂直 92 5.7762 13.2613 水平 93 15.2609 9.4847 垂直 61 9.8342 19.3189 水平 292 16.3881 6.5539 垂直 326 6.9605 13.5144 终点B 表2. 航迹规划结果表一：数据1 Table 3 Track planning results Table 1 : Data 校正点编号 校正前垂直误差 校正前水平误差 校正点类型 0 0 0 出发点A 503 13.3879 13.3879 垂直 200 0.8651 14.253 水平 136 14.2711 13.4061 垂直 80 4.2867 17.6928 水平 237 8.9145 4.6277 垂直 278 17.9422 22.57 水平 375 23.4841 5.5418 垂直 172 15.4964 21.0382 水平 340 21.6449 6.1485 垂直 277 12.0024 18.1509 水平 501 20.1663 8.164 垂直 612 8.49 16.654 终点B 表3. 航迹规划结果表一：数据2 Table 4 Comparison of Algorithms 1 and 2 on Data 1 and 算法 数据编号 校正点数量(个) 航迹长度(米) 算法1 1 31 169641 算法2 1 11 110358 算法1 2 31 1680639 算法2 2 15 850848 表4. 算法1和2在数据1和2上的对比 Table 5 Final track route 数据 航迹路径 数据1 ['A'， '503'， '200'， '136'， '80'， '237'， '278'， '375'， '172'， '340'， '277'， '501'， 'B'] 数据2 ['A'，'140'， '150'， '114'， '234'， '222'， '230'， '225'， '255'， '123'， '45'， '160'， '92'， '93'， '61'， '292'， 'B'] 表5. 最终航迹路径二 Table 6 Track planning results Table 2 : Data 校正点编号 校正后垂直误差 校正后水平误差 校正点类型 0 0 0 出发点A 503 0 13.3879 垂直 200 0.8651 0 水平 136 0 13.4061 垂直 80 4.2867 0 水平 237 0 4.6277 垂直 278 17.9422 0 水平 375 0 5.5418 垂直 172 15.4964 0 水平 340 0 6.1485 垂直 277 12.0024 0 水平 501 0 8.164 垂直 612 0 0 终点B 表6. 航迹规划结果表二：数据1 Table 7 Track planning results Table 2 : Data 矫正点编号 矫正后垂直误差 矫正后水平误差 矫正点类型 0 0 0 出发点A 140 0 5.6558 垂直 150 6.7568 0 水平 114 0 8.7632 垂直 234 4.5312 0 水平 222 0 7.2823 垂直 230 11.1599 0 水平 225 0 3.8358 垂直 255 7.4652 0 水平 123 0 8.4714 垂直 45 10.0062 0 水平 160 0 7.4851 垂直 92 5.7762 0 水平 175 0 8.3641 垂直 279 9.6878 0 水平 301 0 4.9531 垂直 61 12.3271 0 水平 292 0 6.5539 垂直 326 0 0 终点B 表7. 航迹规划结果表二：数据2 Table 8 Track planning results Table 3 : Data 1 and Data 数据1 数据2 矫正点编号 矫正后 垂直误差 矫正后 水平误差 矫正点类型 矫正点编号 矫正后 垂直误差 矫正后 水平误差 矫正点类型 0 0 0 出发点A 0 0 0 出发点A 503 5 13.3879 垂直 157 0 9.4768 垂直 200 5.8651 5 水平 169 3.7014 0 水平 354 5 7.23 垂直 322 0 4.1481 垂直 80 19.8381 5 水平 252 3.8718 0 水平 237 5 9.6277 垂直 266 0 7.9939 垂直 282 18.6817 0 水平 270 6.4 0 水平 33 0 2.4699 垂直 89 0 7.5508 垂直 11 10.9239 0 水平 236 10.1274 0 水平 403 0 12.8409 垂直 132 0 9.7042 垂直 594 11.0291 0 水平 53 10.2592 0 水平 501 0 11.1969 垂直 112 0 5.2029 垂直 612 0 0 终点B 268 2.1572 0 水平 273 0 5.0481 垂直 103 5.2292 0 水平 250 0 5.7711 垂直 243 6.9589 0 水平 73 0 3.5428 垂直 82 5.7316 0 水平 6 0 7.1847 垂直 249 9.0008 0 水平 274 0 2.8407 垂直 51 2.6237 0 水平 201 0 7.2799 垂直 12 8.7014 0 水平 321 0 7.1906 垂直 279 10.3589 1 水平 301 0 5.9531 垂直 38 9.8721 0 水平 110 0 3.9265 垂直 61 6.843 0 水平 292 0 6.5539 垂直 326 0 0 终点B 表8. 航迹规划结果表三：数据1和数据2 Table 9 Space-time complexity of Algorithm 1 - 算法 时间复杂度 空间复杂度 算法1 N 2 N 算法2 N 3 N 表9. 算法1~4的时空复杂度 算法3 Step1：计算当前点A的可达域； Step2：若可达域非空，转Step3，否则，标记当前点为失败点，转Step5； Step3：若终点在可达域中，结束程序，逆序输出轨迹栈元素即可得到航迹规划。否则，转Step4； Step4：选择可达域中最近的点Aclose作为后继点，将可达域存入可达域栈C中，将上一校正点Apre校正后的水平误差pre_h和垂直误差pre_v存入对应栈，以pre_h和pre_v为基础加上Apre到A点所产生的误差增量来更新对应误差h、v，若后继点为可能失效点，将对应误差加上bia进行二次校正，将后继点加入轨迹栈，标记后继点为当前点，转Step1； Step5：将轨迹栈中栈顶元素出栈(此元素与当前点一致，均为失败点)，再从栈顶出栈一个元素，标记为当前点，将可达域栈栈顶元素出栈，去除可达域中失败点的信息(确保此点不会再有机会选中)之后作为新的可达域，将水平误差栈和垂直误差栈栈顶元素出栈，替换当前水平误差h和垂直误差v，转Step2。 算法4 Step1：计算当前点A的可达域，若终点是在可达域转Step2；否则转Step3； Step2：结束程序，逆序输出轨迹栈元素即可得到航迹规划； Step3：计算当前点到达可达域各点的误差，在此误差值下，假设可达域各点Bi为当前点； Step4：计算Bi是否存在可达域，将存在可达域的点加入集合P； Step5：计算点A到P中各点的距离以及P中各点到终点的距离之和，以上一校正点Apre校正后的水平误差pre_h和垂直误差pre_v为基础加上Apre到A点所产生的误差增量来更新对应误差h、v，若后继点为可能失效点，将对应误差加上bia进行二次校正，取最小距离点作为后继点，将后继点加入轨迹栈，标记后继点为当前点，进入Step1。