gpt4 book ai didi

用于找出不同可能组合的 C# 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:00 26 4
gpt4 key购买 nike

我有 10 个盒子,每个盒子可以容纳一组/类型的项目中的一个项目,每个“组”类型只适合 10 种盒子类型中的一种。项目池可以有 n 个项目。这些组具有完全不同的项目。每个项目都有一个价格,我想要一个算法来生成所有不同的可能性,这样我就可以根据项目属性计算出不同的价格点与每个项目的自定义排名/权重分配。

问题的小图

BOX A - can have item 1,2,3,4 in it

BOX B - can have item 6,7,8,9,10,11,12

BOX C - can have item 13,15,16,20,21

更多细节
解决方案将是一组 BOX A、BOX B 和 BOX C,根据这组框具有最高等级。每个盒子只能包含该盒子的指定元素之一。一个元素就是一个物体,物体有3个属性(硬度、弹性、强度)。每个属性可以有 1-100 的分数。目标是为每个属性输入一个权重,然后逻辑将遍历所有项目并根据每个属性的权重确定排名最高的项目组合。为了便于解释,我为每个项目使用了 3 个属性,但项目可以有大约 10 个不同的属性。

项目存储在数据库中,它们有一列表示它们可以放入哪个盒子。所有类型的盒子都存储在一个数组中,我可以将项目放在一个通用列表中。任何人都可以找到一种直接的方法来做到这一点。

我已经尝试做 10 个嵌套的 foreach,看看我是否能找到更简单的方法。嵌套循环将花费许多小时来运行。每个的嵌套基本上拉出所有组合,然后计算每个组合的排名,并存储排名前 10 的项目组合以供输出

最佳答案

听起来您只需要从每个框中获取“最佳”项目,因为将每个组中最佳项目的分数相加将得出最佳总分。如果是这样,您应该能够在数据库中通过适当的查询或在客户端的简单 LINQ-to-objects 查询中(如果需要)完成所有这些操作。由于我不是 SQL 人员,所以我将只采用客户端方法。使用 Item 类的明显定义:

public static double Score<T>(T item, IEnumerable<Weighting<T>> weights)
{
return weights.Aggregate(0.0, (p, w) => p + w.Apply(item));
}

public static T MaxBy<T>(this IEnumerable<T> items, Func<T, double> selector)
{
double curMax = double.MinValue;
T curItem = default(T);
foreach (T i in items)
{
double curValue = selector(i);
if (curValue > curMax)
{
curMax = curValue;
curItem = i;
}
}
return curItem;
}

public class Weighting<T>
{
public Weighting(double weight, Func<T, double> attributeSelector)
{
_weight = weight;
_attributeSelector = attributeSelector;
}

private readonly double _weight;
private readonly Func<T, double> _attributeSelector;

public double Apply(T item) { return _weight * _attributeSelector(item); }
}

Weighting<Item>[] weights = {new Weighting<Item>(1, i => i.Elasticity),
new Weighting<Item>(2, i => i.Firmness),
new Weighting<Item>(.5, i => i.Strength)};

var hsQuery = from i in allItems
group i by i.Box into boxItems
select boxItems.MaxBy(bi => Score(bi, weights));

我想有一种聪明的方法可以让加权分数成为 SQL 查询中的计算列,然后您可以group by box where score = max(score) 并直接从数据库。

关于用于找出不同可能组合的 C# 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2695179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com