ユーザーが評価する個人の数を減らすために、インタラクティブな遺伝的アルゴリズムでApacheCommonsMathのk-means++クラスターを使用しています。
Commons Mathを使用すると、非常に使いやすくなります。ユーザーはインターフェースを実装するだけで済み
Clusterable
ます。2つの方法があります。
double distanceFrom(T p)
これは非常に明確でT centroidOf(Collection<T> p)
、ユーザーがクラスターの重心を選択できるようにします。
ユークリッド点で使用する場合、重心は非常に簡単に計算できます。しかし、染色体では、その意味が必ずしも明確ではないため、それは非常に困難です。
私の質問:問題のドメインに依存せずに、重心を選択するための効率的な一般的な方法はありますか?(たとえば、距離を使用して)
編集
さて、これが重心計算のコードです。アイデア:他のすべてのポイントまでの合計距離が最も短いポイントは、図心に最も近いポイントです。
public T centroidOf(Collection<T> c) {
double minDist = Double.MAX_VALUE;
T minP = null;
// iterate through c
final Iterator<T> it = c.iterator();
while (it.hasNext()) {
// test every point p1
final T p1 = it.next();
double totalDist = 0d;
for (final T p2 : c) {
// sum up the distance to all points p2 | p2!=p1
if (p2 != p1) {
totalDist += p1.distanceFrom(p2);
}
}
// if the current distance is lower that the min, take it as new min
if (totalDist < minDist) {
minDist = totalDist;
minP = p1;
}
}
return minP;
}