我有一套必须安排的产品.有P个产品,每个产品从1到P索引.每个产品可以安排到0到T的时间段.我需要构建满足以下约束的产品计划的所有排列:
If p1.Index > p2.Index then p1.Schedule >= p2.Schedule.
Run Code Online (Sandbox Code Playgroud)
我正在努力构建迭代器.当产品数量是已知常量时,我知道如何通过LINQ执行此操作,但是当产品数量是输入参数时,我不确定如何生成此查询.
理想情况下,我想使用yield语法来构造此迭代器.
public class PotentialSchedule()
{
public PotentialSchedule(int[] schedulePermutation)
{
_schedulePermutation = schedulePermutation;
}
private readonly int[] _schedulePermutation;
}
private int _numberProducts = ...;
public IEnumerator<PotentialSchedule> GetEnumerator()
{
int[] permutation = new int[_numberProducts];
//Generate all permutation combinations here -- how?
yield return new PotentialSchedule(permutation);
}
Run Code Online (Sandbox Code Playgroud)
编辑:_numberProducts = 2时的示例
public IEnumerable<PotentialSchedule> GetEnumerator()
{
var query = from p1 in Enumerable.Range(0,T)
from p2 in Enumerable.Range(p2,T)
select new { P1 = p1, P2 = …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一种算法来从一组数字中选择n个值的所有组合.
例如,给定集合: 1, 2, 3, 7, 8, 9
该组中2个值的所有组合为:
(1,2),(1,3),(1,7),(1,8),(1,9),(2,3),(2,7),(2,8),(2) ,9),(3,7),(3,8),(3,9),(7,8),(7,9),(8,9)
3是:
(1,2,3),(1,2,7),(1,2,8),(1,2,9),(1,3,7),(1,3,8),(1) ,3,9),(1,7,8),(1,7,9),(1,8,9),(2,3,7),(2,3,8),(2,3) ,9),(2,7,8),(2,7,9),(2,8,9),(3,7,8),(3,7,9),(3,8,9) ),(7,8,9)
等等!
我目前正在使用方法来产生2,3和4值组合的返回集,但在我看来,这可以在LINQ查询中推广.
谢谢你的帮助!
我非常喜欢这个6行解决方案,并试图在C#中复制它.基本上,它会置换数组的元素:
def permute(xs, pre=[]):
if len(xs) == 0:
yield pre
for i, x in enumerate(xs):
for y in permute(xs[:i] + xs[i+1:], pre + [x]):
yield y
Run Code Online (Sandbox Code Playgroud) 我需要从另一个包含每种可能组合的列表中创建一个列表.在研究可能的解决方案时,我发现了许多有趣的方法,但所有方法似乎都根据提供的记录数生成结果.我需要组合增加到最大阈值.
即考虑以下数组
1,2,3,4,5
我需要看起来类似的结果(在这个例子中阈值是3)
1
1,2
1,2,3
1,2,4
1,2,5
1,3,4
2,3,5... etc
Run Code Online (Sandbox Code Playgroud)
实际上,数据将是IEnumerable.我用一个简单的int []来说明所需的结果.