編集:うわー、多くの素晴らしい応答。はい、私はこれを遺伝的アルゴリズムによって実行される種類の品質を判断するための適応度関数として使用しています。したがって、評価のコストは重要です(つまり、高速である必要があります。できればO(n)
)。
私がいじっているAIアプリケーションの一部として、整数の候補配列をその単調性、別名「ソート性」に基づいて評価できるようにしたいと思います。現在、ソートされた最長の実行を計算し、それを配列の長さで割るヒューリスティックを使用しています。
public double monotonicity(int[] array) {
if (array.length == 0) return 1d;
int longestRun = longestSortedRun(array);
return (double) longestRun / (double) array.length;
}
public int longestSortedRun(int[] array) {
if (array.length == 0) return 0;
int longestRun = 1;
int currentRun = 1;
for (int i = 1; i < array.length; i++) {
if (array[i] >= array[i - 1]) {
currentRun++;
} else {
currentRun = 1;
}
if (currentRun > longestRun) longestRun = currentRun;
}
return longestRun;
}
これは良いスタートですが、ソートされたサブシーケンスの「塊」が存在する可能性を考慮に入れていません。例えば:
{ 4, 5, 6, 0, 1, 2, 3, 7, 8, 9}
この配列は、3つのソートされたサブシーケンスに分割されます。私のアルゴリズムでは、40%しかソートされていないと評価されますが、直感的には、それよりも高いスコアが得られるはずです。この種のもののための標準的なアルゴリズムはありますか?