public void MakeCentroid() { Shoots members = new Shoots(); members.AddRange(allShoots); int clsLen = members.Count / clusters.Length; //エルボー法評価のため double distSumAllShoots = 0; string distSumAllShootsOutput = "distSumAllShoots.csv"; foreach (Cluster c in clusters) { c.centroid.DBAacc = (Vec3[])members[0].acc.Clone(); c.members.Add(members[0]); for (int i = 1; i < clsLen; ++i) { double minDist = double.MaxValue; Shoot minS = null; foreach (Shoot s in members) { DBA.CostPath cp; cp = DBA.DpMatching(s.acc, c.centroid.DBAacc); //to callback in DBA-DBA distance //myDBShoots.Add(new DBAShoot()); //最終コストが距離 double dist = cp.cost[cp.cost.Length - 1][cp.cost[cp.cost.Length - 1].Length - 1]; s.distFromCentroid = dist; //エルボー法評価のため全ての距離の和を求める distSumAllShoots += dist; if (dist < minDist) { minDist = dist; minS = s; } } members.Remove(minS); c.members.Add(minS); } } File.WriteAllText(distSumAllShootsOutput, distSumAllShoots.ToString()); }
public void UpdateMember() { //クラスタの更新 foreach (Cluster c in clusters) { c.prevMembers.Clear(); c.prevMembers.AddRange(c.members); c.members.Clear(); } foreach (Shoot s in allShoots) { double minDist = double.MaxValue; Cluster minCluster = null; foreach (Cluster c in clusters) { double[][] cost = DBA.DpMatching(s.acc, c.centroid.DBAacc).cost; double dist = cost[cost.Length - 1][cost[cost.Length - 1].Length - 1]; if (dist < minDist) { minDist = dist; minCluster = c; } } minCluster.members.Add(s); } //クラスタが更新されない場合 clusteringFinished = true; foreach (Cluster c in clusters) { //積集合が一致しないとき => クラスタ更新は続ける IEnumerable <Shoot> intersect = c.members.Intersect(c.prevMembers); if (intersect.Count() != c.members.Count()) { clusteringFinished = false; } } }