私が取り組んでいる遺伝的アルゴリズムに対して異なる選択方法を作成しようとしていますが、すべての選択方法で遭遇する1つの問題は、各ノードの適合度が異なる必要があることです。私のフィットネス計算機は非常に基本的であり、いくつかの同一のフィットネスが得られるため、これは私にとって問題です
public static Map<String, Double> calculateRouletteSelection(Map<String, Double> population) {
String[] keys = new String[population.size()];
Double[] values = new Double[population.size()];
Double[] unsortedValues = new Double[population.size()];
int index = 0;
for(Map.Entry<String, Double> mapEntry : population.entrySet()) {
keys[index] = mapEntry.getKey();
values[index] = mapEntry.getValue();
unsortedValues[index] = mapEntry.getValue();
index++;
}
Arrays.sort(values);
ArrayList<Integer> numbers = new ArrayList<>();
while(numbers.size() < values.length/2) {
int random = rnd.nextInt(values.length);
if (!numbers.contains(random)) {
numbers.add(random);
}
}
HashMap<String, Double> finalHashMap = new HashMap<>();
for(int i = 0; i<numbers.size(); i++) {
for(int j = 0; j<values.length; j++) {
if(values[numbers.get(i)] == unsortedValues[j]) {
finalHashMap.put(keys[j], unsortedValues[j]);
}
}
}
return finalHashMap;
}
私のすべての異なる選択方法の90%は同じなので、1つで解決できるかどうかは、すべての問題を解決できると確信しています。私が間違っていることに何か助けていただければ幸いです
編集:私は起こっていることの一般的な振る舞いを投稿するつもりであることがわかったので、基本的にメソッドはHashMap <>を受け取り、値に基づいて値をソートし、半分ソートされた値をランダムに選択して、これらを新しいHashMap <>に追加しますそれらの対応する染色体。
コレクションクラスを使用する方がはるかに良いでしょう。
List<Map.Entry<String, Double>> sorted = new ArrayList<>(population.entrySet());
// sort by fitness
Collections.sort(sorted, Comparator.comparing(Map.Entry::getValue));
Set<Integer> usedIndices = new HashSet<>(); // keep track of used indices
Map<String, Double> result = new HashMap<>();
while (result.size() < sorted.size()/2) {
int index = rnd.nextInt(sorted.size());
if (!usedIndices.add(index)) {
continue; // was already used
}
Map.Entry<String,Double> survivor = sorted.get(index);
result.put(survivor.getKey(), survivor.getValue());
}
return result;
しかし、Sergeyが述べたように、これがアルゴリズムに必要なものだとは思いません。あなたはより高いフィットネスを持つ個人を支持する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加