Комбинации с несколькими наборами в С#

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

введите здесь описание изображения

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

  • 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 в

Аккорд.Математика

по всем точкам из всех наборов и после этого удаляю комбинации, содержащие больше точек из одного набора. Вместо того, чтобы вычислять комбинации, я хотел бы рассчитать все возможные пути от 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; }
   }

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


person Martina    schedule 30.05.2018    source источник


Ответы (1)


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

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

person MBo    schedule 01.06.2018