Комбинации с несколькими наборами в C # - PullRequest
0 голосов
/ 30 мая 2018

У меня есть три набора очков.Мне нужны все комбинации, имеющие не более одной точки на набор.

enter image description here

Из рисунка выше результат должен быть:

  • p1, p3, p6
  • p1, p3, p7
  • p1, p4, p6
  • p1, p4, p7
  • p1, p5,p6
  • p1, p5, p7
  • p2, p3, p6
  • p2, p3, p7
  • p2, p4, p6
  • p2, p4, p7
  • p2, p5, p6
  • p2, p5, p7
  • p1, p3
  • p1, p4
  • p1, p5
  • ...
  • ...
  • p4, p6
  • ...
  • p1
  • p2
  • ...

Я использую метод Combinations in

Accord.Math

на всех точках из всех наборов, и после этого я удаляю комбинации, содержащие больше точек из того же набора.Вместо того, чтобы вычислять комбинации, я хотел бы рассчитать все возможные пути от Set1 до Set3 (проходя также для Set2), потому что комбинации требуют слишком много времени для большого набора точек.Как я могу изменить свой код?

  var result1 = new Dictionary<int, List<List<ClusterInPath>>>();      
  foreach (KeyValuePair<int, List<ClusterInPath>> currentClustersInImage in allClustersInVertebra)
  {
    var allPaths = currentClustersInImage.Value.ToArray().Combinations().Select(el => el.ToList()).ToList();
    var filterPaths = new List<List<ClusterInPath>>();
    foreach (List<ClusterInPath> path in allPaths)
    {
      if(PathContainsMoreClustersOnSameImage(path)) continue;
       filterPaths.Add(path);
    }       
    result1.Add(currentClustersInVertebra.Key, filterPaths);
  }

Класс ClusterInPath определен ниже:

  public class ClusterInPath
  {
    public ClusterInPath(int imageIndex, int clusterIndex)
    {
      ImageIndex = imageIndex;
      ClusterIndex = clusterIndex;
    }

    public int ImageIndex { get; set; }
    public int ClusterIndex { get; set; }
   }

Заранее спасибо

1 Ответ

0 голосов
/ 01 июня 2018

Добавьте фиктивный (ноль, пустой и т. Д.) Элемент в каждый набор и получите декартово произведение наборов.Игнорируйте или удаляйте эти элементы во время вывода.

Пример вычисления декартового произведения с помощью LINQ

...