用于计算不同可能组合的 C# 算法
我有 10 个盒子,每个盒子可以容纳一组/类型的物品中的一个物品,每个“组”类型仅适合 10 种盒子类型之一。项目池可以有n个项目。这些组有完全不同的项目。每个项目都有一个价格,我想要一个能够生成所有不同可能性的算法,这样我就可以根据项目属性计算出不同的价格点与每个项目的自定义排名/权重分配。
所以问题的更小图片
BOX A - 可以包含项目 1,2,3,4
BOX B - 可以包含项目 6,7,8,9,10,11,12
BOX C - 可以包含项目 13,15,16,20,21
<强>更多细节
解决方案是一组方框 A、方框 B 和方框 C,根据该组方框具有最高排名。每个盒子只能包含该盒子指定的物品之一。 一个物品就是一个物体,物体有3个属性(硬度、弹性、强度)。每个属性可以有1-100的分数。目标是输入每个属性的权重,然后逻辑将遍历所有项目,并根据每个属性的权重确定排名最高的项目组合。为了便于解释,我为每个项目使用了 3 个属性,但项目可以有大约 10 个不同的属性。
这些项目存储在数据库中,它们有一列表示它们可以进入哪个盒子。所有盒子类型都存储在一个数组中,我可以将这些项目放入通用列表中。任何人都会看到一种简单的方法来做到这一点。
我尝试过执行 10 个嵌套的 foreach,看看是否能找到更简单的方法。嵌套循环将需要许多小时才能运行。每个的嵌套基本上拉出所有组合,然后计算每个组合的排名,并存储排名前 10 的项目组合以进行输出
I have 10 boxes, each box can hold one item from a group/type of items, each 'group' type only fits in one of the 10 box types. The item pool can have n number of items. The groups have completely distinct items. Each item has a price, i want an algorithm that will generate all the different possibilities, so i can figure out different price points vs custom rank/weight assignment to each of the items, based on item attributes.
so a smaller picture of the problem
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
More Detail
The solution would be a set of BOX A, BOX B, AND BOX C, having the greatest rank based on the set of boxes. Each box can only contain ONE of the designated items for that box.
An item is an object, the object has 3 attributes(firmness, elasticity, strength). Each attribute can have 1-100 for a score. The goal is to enter a weight for each attribute, then the logic will run through ALL items and determine the top ranked item combinations based on the weights for each attribute. I have used 3 attributes for each item for ease of explanation, but items can have about 10 different attributes.
The items are stored in a db, they have a column which denotes which box they can go in. All box types are stored in an array, and I can put the items in a generic list. Anyone see a straightforward way to do this.
I have tried doing 10 nested foreach's to see if i could find a simpler way. The nested loops will take MANY hours to run. the nested for each's basically pull all combinations, then calculate a rank for each combination, and store the top 10 ranked combination of items for output
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
不确定这是否是您想要的,但根据我从您的问题中可以推断出的信息,使用 LINQ 的编码会简单得多。这是我对答案的猜测:
HTH...
Not sure if this was what you were looking for, but based on what I can infer from your question, using LINQ will be a lot simpler to code. Here's my guesstimate of what the answer should be:
HTH...
这看起来像一个二进制程序,其中
(将上面的内容粘贴到 LaTeX 求值器中,例如 math.se,以查看符号)
这可以使用分支定界进行优化,其步骤比评估每个组合要少得多。
This looks like a binary program, where
(paste the above into a LaTeX evaluator, like math.se, to see the symbols)
This can be optimized using branch-and-bound in far fewer steps than evaluating every combination.
听起来您只需要从每个盒子中获取“最佳”项目,因为将每组中最佳项目的分数相加将得到最佳的总分。如果是这样,您应该能够通过适当的查询在数据库中完成这一切,或者根据需要在客户端通过简单的 LINQ 到对象查询来完成这一切。由于我不是 SQL 人员,因此我将采用客户端方法。使用 Item 类的明显定义:
我想有一种巧妙的方法可以使加权分数成为 SQL 查询中的计算列,然后您可以
按框分组,其中 Score = max(score)
和直接从数据库获取结果。It sounds like you just need to get the "best" item from each box, as adding the scores of the best item in each group will give the best overall total. If so, you should be able to do this all in the database with a decent query or in a simple LINQ-to-objects query on the client side if desired. Since I'm not an SQL person, I'll just go with the client approach. Using the obvious definition for the Item class:
I imagine there's a clever way to make the weighted score be a calculated column in an SQL query that you can then
group by box where score = max(score)
and get the result directly from the database.我使用了优秀的 C# 库来进行排列和组合。
它为此类问题提供了有效的算法。
I have used an outstanding C# library for permutations and combinatorics.
It provides efficient algorithms for this class of problem.