EDITAR: Wow, muchas grandes respuestas. Sí, estoy usando esto como una función de aptitud para juzgar la calidad de un tipo realizado por un algoritmo genético. Por lo tanto el costo de la evaluación es importante (es decir, tiene que ser rápido, preferiblemente O(n)
.)Algoritmo para la calificación de la monotonía de una matriz (es decir, juzgar la "sortedness" de una matriz)
Como parte de la solicitud AI estoy jugando con, me gustaría ser capaz de evaluar un candidato una matriz de enteros basada en su monotonicidad, también conocida como "ordenada". Por el momento, estoy usando una heurística que calcula la pista más larga ordenados, y luego divide el resultado por la longitud de la matriz:
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;
}
Este es un buen comienzo, pero no tiene en cuenta la posibilidad que puede haber "grupos" de subsecuencias clasificadas. Por ejemplo:
{ 4, 5, 6, 0, 1, 2, 3, 7, 8, 9}
Esta matriz está dividida en tres subsecuencias ordenadas. Mi algoritmo lo calificará como solo el 40% ordenado, pero intuitivamente, debería obtener una puntuación más alta que eso. ¿Hay un algoritmo estándar para este tipo de cosas?
Aunque esto se encuentra en un contexto de programación, es posible que desee preguntar esto en mathoverflow.com ... podrían ser más adecuados para proporcionar una respuesta que sea útil. –
Ayudaría si nos da más detalles sobre qué tipo de decisiones tomará su aplicación de inteligencia artificial en función de la "clasificación" –
@Michael Bray: es en realidad http://mathoverflow.net/. Extrañamente, mathoverflow.com resuelve la misma IP, pero no está funcionando aquí. –