Получение всех перестановок для весов в соответствии с интервалом - PullRequest
0 голосов
/ 27 июля 2011

Если у меня есть определенное количество «систем»

var nbSystems = 2;

и количество «шагов»

var nbSteps = 3;

Как мне сгенерировать все следующие перестановки:

{0.00, 0.00}
{0.33, 0.00}
{0.67, 0.00}
{1.00, 0.00}
{0.00, 0.33}
{0.33, 0.33}
{0.67, 0.33}
{1.00, 0.33}
{0.00, 0.66}
{0.33, 0.66}
{0.67, 0.66}
{1.00, 0.66}
{0.00, 1.00}
{0.33, 1.00}
{0.67, 1.00}
{1.00, 1.00}

Мне нужен вес от 0 до 1 для каждой системы, и я хочу найти все перестановки.

Вы видите, что интервал, используемый для весов систем, рассчитывается по nbSteps (интервал = 1 / nbSteps).

Я хотел бы иметь функцию, которая принимает входные данные nbSystems и nbSteps (или лучше?) И которая выведет какой-то многомерный массив со всеми перестановками ...

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Это должно сделать это:

static void Main(string[] args)
{
    var nbSystems = 2;
    var nbSteps = 3;

    var steps = GetSteps(0, 1, nbSteps).Select(n => Math.Round(n, 2)).ToArray();
    foreach (var seq in GetCombinations(steps, nbSystems))
        Console.WriteLine(string.Join(", ", seq));
}

private static IEnumerable<decimal> GetSteps(decimal min, decimal max, int count)
{
    var increment = (max - min) / count;
    return Enumerable.Range(0, count + 1).Select(n => min + increment * n);
}

private static IEnumerable<IEnumerable<T>> GetCombinations<T>(
    ICollection<T> choices, int length)
{
    if (length == 0)
    {
        yield return new T[0];
        yield break;
    }

    foreach (var choice in choices)
        foreach (var suffix in GetCombinations(choices, length - 1))
            yield return Enumerable.Concat(new[] { choice }, suffix);
}

Отрегулируйте при необходимости, если вы заботитесь о порядке комбинаций.

РЕДАКТИРОВАТЬ: Ой, исправил опечатку - я перенес "макс" и "мин" в моей подписи типа.

2 голосов
/ 27 июля 2011

попробуй

double nbSteps = 3.0;

IEnumerable<double> SystemA = Enumerable.Range (0, (int)nbSteps).Select (x => x / nbSteps); 
IEnumerable<double> SystemB = Enumerable.Range (0, (int)nbSteps).Select (x => x / nbSteps); 

var Result = from a in SystemA from b in SystemB select new { a, b };
...