У меня есть три набора очков.Мне нужны все комбинации, имеющие не более одной точки на набор.
Из рисунка выше результат должен быть:
- 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; }
}
Заранее спасибо