EDIT: Wow, molte risposte grande. Sì, sto usando questo come funzione di fitness per giudicare la qualità di un tipo eseguito da un algoritmo genetico. Così costo della valutazione è importante (ad esempio, deve essere veloce, preferibilmente O(n)
.)Algoritmo per aver valutato la monotonia di una matrice (cioè giudicare la "sortedness" di un array)
Come parte di un programma AI sto accarezzando, mi piacerebbe essere in grado di votare un candidato array di interi in base alla sua monotonicità, ovvero la sua "ordinata". Al momento, sto usando un euristica che calcola la più lunga ordinato, e poi divide che entro la lunghezza dell'array:
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;
}
Questo è un buon inizio, ma non riesce a prendere in considerazione la possibilità di che potrebbero esserci "raggruppamenti" di sottosequenze ordinate. Es .:
{ 4, 5, 6, 0, 1, 2, 3, 7, 8, 9}
Questo array è suddiviso in tre sottosequenze ordinate. Il mio algoritmo valuterà come solo il 40% ordinato, ma intuitivamente, dovrebbe ottenere un punteggio più alto di quello. Esiste un algoritmo standard per questo genere di cose?
Anche se questo è in un contesto di programmazione, si potrebbe desiderare di chiedere questo su mathoverflow.com ... potrebbero essere più adatti a fornire una risposta che è utile. –
Sarebbe di grande aiuto se ci fornissi qualche dettaglio in più sul tipo di decisioni che la tua applicazione AI farà in base alla "ordinatezza" –
@ Michael Bray: in realtà è http://mathoverflow.net/. Stranamente, mathoverflow.com risolve lo stesso IP, ma non funziona qui. –