You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core方阵API开发:最优组合计算需求及性能问题

解决方案:带兼容性约束的最大权子集选择

你的问题本质是带兼容性约束的最大权子集选择问题:给定带金额权重的元素集合,元素间由方阵定义共存规则(Y=可共存,N=不可共存),需从输入的元素组合中选出合法兼容子集,使总金额最大。以下是针对不同规模场景的可行实现方案:

1. 先把问题建模成图结构

将每个元素抽象为图的节点:

  • 若两个元素X和Y不可共存(方阵中X-Y对应单元格为N),则在X、Y间添加一条冲突边。
    此时问题转化为:在冲突图中,从输入子集里找最大权独立集——即子集内任意元素间无冲突边,且总金额最高。

2. 分场景选择算法

场景1:元素规模≤20个(小规模)

用状态压缩+动态规划,直接遍历所有可能的合法组合:

  • 用二进制数表示元素选择状态(比如4个元素时,0001代表选A,0101代表选A和C)。
  • 预处理过滤出所有合法状态(状态内元素两两兼容)。
  • 在输入元素范围内,计算每个合法状态的总金额,取最大值对应的状态。

场景2:元素规模>20个(大规模)

状态压缩会因组合爆炸失效,可根据冲突图类型选择:

  • 若冲突图是二分图(可分成两个互不相交的子集,子集内元素全兼容),用最大流最小割算法求解(二分图最大权独立集 = 总权重 - 最小割)。
  • 若冲突图非二分图,用启发式近似算法:比如贪心算法(按金额从高到低选,选一个元素就排除所有冲突元素),或模拟退火、遗传算法,在可接受时间内得到接近最优的结果。

3. .NET Core 代码实现

基础模型与兼容性检查

// 元素实体
public class Element
{
    public string Id { get; set; } // 对应A/B/C/D
    public int Priority { get; set; }
    public int Amount { get; set; } // 金额权重
}

// 兼容性约束服务
public class CompatibilityChecker
{
    private readonly Dictionary<(string, string), bool> _compatMap;

    public CompatibilityChecker(Dictionary<(string, string), bool> compatData)
    {
        // 传入方阵数据,比如("A","B")=false表示A和B不能共存
        _compatMap = compatData;
    }

    // 检查两个元素是否可共存
    public bool IsCompatible(string x, string y)
    {
        // 假设方阵是对称的(X和Y不能共存是双向的)
        return _compatMap.TryGetValue((x, y), out bool result) ? result : false;
    }

    // 检查一个元素子集是否合法(所有元素两两兼容)
    public bool IsValidSubset(IEnumerable<string> subset)
    {
        var elements = subset.ToList();
        for (int i = 0; i < elements.Count; i++)
        {
            for (int j = i + 1; j < elements.Count; j++)
            {
                if (!IsCompatible(elements[i], elements[j]))
                {
                    return false;
                }
            }
        }
        return true;
    }
}

小规模场景:状态压缩DP实现

public class MaxAmountSolver
{
    private readonly CompatibilityChecker _checker;
    private readonly Dictionary<string, Element> _elements;

    public MaxAmountSolver(CompatibilityChecker checker, Dictionary<string, Element> elements)
    {
        _checker = checker;
        _elements = elements;
    }

    public List<string> FindMaxSubset(List<string> inputElements)
    {
        var elementIndexMap = inputElements.Select((e, idx) => (e, idx))
                                           .ToDictionary(pair => pair.e, pair => pair.idx);
        int totalStates = 1 << inputElements.Count;
        int maxTotal = 0;
        int bestState = 0;

        // 遍历所有非空状态
        for (int state = 1; state < totalStates; state++)
        {
            var currentSubset = inputElements.Where((e, idx) => (state & (1 << idx)) != 0).ToList();
            if (!_checker.IsValidSubset(currentSubset))
            {
                continue;
            }
            // 计算当前子集总金额
            int currentTotal = currentSubset.Sum(e => _elements[e].Amount);
            if (currentTotal > maxTotal)
            {
                maxTotal = currentTotal;
                bestState = state;
            }
        }

        // 解析最优状态对应的元素
        return inputElements.Where((e, idx) => (bestState & (1 << idx)) != 0).ToList();
    }
}

大规模场景:贪心近似实现

public List<string> FindGreedyMaxSubset(List<string> inputElements)
{
    // 按金额从高到低排序元素
    var sortedElements = inputElements.Select(e => _elements[e])
                                      .OrderByDescending(x => x.Amount)
                                      .ToList();
    var selected = new List<string>();
    var excluded = new HashSet<string>();

    foreach (var elem in sortedElements)
    {
        if (excluded.Contains(elem.Id))
            continue;
        // 选中当前元素,排除所有冲突元素
        selected.Add(elem.Id);
        foreach (var other in inputElements)
        {
            if (!_checker.IsCompatible(elem.Id, other))
            {
                excluded.Add(other);
            }
        }
    }

    return selected;
}

示例验证

输入元素:A、B、D

  • 兼容性约束:A与B冲突、A与D冲突、B与D兼容
  • 状态遍历后,合法子集里总金额最高的是B+D(50),符合需求输出。

内容的提问来源于stack exchange,提问作者Mukul Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:23:11