コード例 #1
0
        public bool Step()
        {
            var prevIteration = State.Iterations.Last();

            if (prevIteration.Clusters.Count <= 1)
            {
                return(false);
            }
            if (MinClusters > 0 && prevIteration.Clusters.Count <= MinClusters)
            {
                return(false);
            }
            if (DistanceLimit > 0 && prevIteration.ClosestPair.Distance >= DistanceLimit)
            {
                return(false);
            }
            HCCluster clusterI      = prevIteration.ClosestPair.I;
            HCCluster clusterJ      = prevIteration.ClosestPair.J;
            HCCluster joinedCluster = HCCluster.Join(clusterI, clusterJ);

            List <HCCluster> newClusters = new();

            foreach (HCCluster oldCluster in prevIteration.Clusters)
            {
                if (oldCluster != clusterI && oldCluster != clusterJ)
                {
                    newClusters.Add(oldCluster);
                }
            }
            var closest = distanceMatrix.FindClosestPair(
                clusterPairs: joinedCluster.PairsWith(newClusters),
                metric: (joinedCluster, other) => distanceMatrix.LanceWillamsSingleLinkage(clusterI, clusterJ, other)
                );

            newClusters.Add(joinedCluster);

            if (closest.Distance > prevIteration.ClosestPair.Distance)
            {
                closest = distanceMatrix.FindClosestPair(
                    clusterPairs: HCCluster.AllPairs(newClusters),
                    metric: distanceMatrix.GetDistance
                    );
            }

            State.Iterations.Add(new HCIteration(
                                     clusters: newClusters,
                                     closestPair: closest
                                     ));
            return(true);
        }