AvoidanceStrategySelector.cs 2.1 KB
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;
    }
}