Algoritmo para encontrar los extremos de una función unimodal
Un algoritmo de búsqueda ternaria [1] es una técnica en informática para encontrar el mínimo o máximo de una función unimodal .
La función
Supongamos que buscamos un máximo de y que sabemos que el máximo se encuentra en algún punto entre y . Para que el algoritmo sea aplicable, debe haber algún valor tal que
- para todos con , tenemos , y
- Para todos con , tenemos .
Algoritmo
Sea una función unimodal en un intervalo . Tome dos puntos cualesquiera y en este segmento: . Entonces hay tres posibilidades:
- Si , entonces el máximo requerido no puede ubicarse en el lado izquierdo – . Significa que el máximo adicional tiene sentido buscarlo solo en el intervalo
- Si , la situación es similar a la anterior, salvo simetría. Ahora, el máximo requerido no puede estar en el lado derecho – , entonces pasa al segmento
- Si , entonces la búsqueda debe realizarse en , pero este caso puede atribuirse a cualquiera de los dos anteriores (para simplificar el código). Tarde o temprano, la longitud del segmento será un poco menor que una constante predeterminada y el proceso puede detenerse.
puntos de elección y :
- Orden de tiempo de ejecución
Algoritmo recursivo
def ternary_search ( f , left , right , absolute_precision ) -> float : """Izquierda y derecha son los límites actuales; el máximo está entre ellos. """ if abs ( right - left ) < absolute_precision : return ( left + right ) / 2 tercio_izquierdo = ( 2 * izquierda + derecha ) / 3 tercio_derecho = ( izquierda + 2 * derecha ) / 3 si f ( tercio_izquierdo ) < f ( tercio_derecho ): devuelve búsqueda_ternaria ( f , tercio_izquierdo , derecho , precisión_absoluta ) de lo contrario : devuelve búsqueda_ternaria ( f , tercio_izquierdo , derecho , precisión_absoluta )
Algoritmo iterativo
def ternary_search ( f , left , right , absolute_precision ) -> float : """Encuentre el máximo de la función unimodal f() dentro de [left, right]. Para encontrar el mínimo, invierta la declaración if/else o invierta la comparación. """ while abs ( right - left ) >= absolute_precision : left_third = left + ( right - left ) / 3 right_third = right - ( right - left ) / 3 si f ( tercio_izquierdo ) < f ( tercio_derecho ): izquierda = tercio_izquierdo de lo contrario : derecha = tercio_derecho # Izquierda y derecha son los límites actuales; el máximo está entre ellos return ( izquierda + derecha ) / 2
Véase también
Referencias
- ^ "Búsqueda ternaria". cp-algorithms.com . Consultado el 21 de agosto de 2023 .