AvoidanceStrategySelector.cs
2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Generic;
using Rcs.Application.Services.PathFind.Realtime;
namespace Rcs.Infrastructure.PathFinding.Realtime;
/// <summary>
/// 默认的矩阵式等待升级策略选择器。
/// </summary>
public sealed class AvoidanceStrategySelector : IAvoidanceStrategySelector
{
/// <summary>
/// 根据失败次数和开关配置返回等待升级阶段的候选策略列表。
/// </summary>
/// <param name="context">策略选择上下文。</param>
/// <returns>按优先级排列的策略编码列表。</returns>
public IReadOnlyList<string> SelectHoldCandidates(AvoidanceSelectionContext context)
{
var candidates = new List<string>(6);
var fail = Math.Max(0, context.FailStreak);
if (fail >= Math.Max(1, context.EscalateWaitThreshold))
{
candidates.Add(AvoidanceStrategyCodes.WaitNearest);
}
if (fail >= Math.Max(1, context.EscalateDetourThreshold))
{
candidates.Add(AvoidanceStrategyCodes.LocalDetour);
}
var retreatAdded = false;
if (context.HasReverseConflict &&
context.EnableRetreat &&
fail >= Math.Max(1, context.EscalateRetreatThreshold))
{
candidates.Add(AvoidanceStrategyCodes.Retreat);
retreatAdded = true;
}
if (context.EnableLateralYield &&
fail >= Math.Max(1, context.EscalateLateralYieldThreshold))
{
candidates.Add(AvoidanceStrategyCodes.LateralYield);
}
if (context.EnableParkingYield &&
fail >= Math.Max(1, context.EscalateParkingThreshold))
{
candidates.Add(AvoidanceStrategyCodes.ParkingYield);
}
if (context.EnableRetreat &&
fail >= Math.Max(1, context.EscalateRetreatThreshold) &&
!retreatAdded)
{
candidates.Add(AvoidanceStrategyCodes.Retreat);
}
if (fail >= Math.Max(1, context.EscalateReplanThreshold))
{
candidates.Add(AvoidanceStrategyCodes.ReplanTail);
}
return candidates;
}
}