Come può un algoritmo iterativo essere controllato dinamicamente?

1

Supponiamo di aver bisogno di un algoritmo iterativo per l'ottimizzazione matematica. Ogni iterazione richiede un tempo lungo e casuale. Dopo ogni iterazione, viene controllata una condizione di arresto per l'iterate x , in base ad alcuni parametri predefiniti b . Un esempio è "Stop if || grad (x) || < b ", basato sul gradiente dell'obiettivo su x .

Ecco un "algoritmo" estremamente semplificato in pseudo-Scala

val f = (a: Dbl, b: Dbl) => { 
def go(x: Dbl): Dbl = if (x<b) x 
else go(bigComputation(x)) 
go(a)}

L'algoritmo attuale potrebbe essere ricorsivo o avere un ciclo while .

L'utente desidera aggiornare il parametro di arresto b mentre l'algoritmo è in esecuzione. (La ragione potrebbe essere quella di accelerare la convergenza o migliorare le soluzioni, se un buon b è sconosciuto in anticipo.) Il cambiamento viene applicato quanto prima, tanto meglio - idealmente, alla successiva iterazione.

Q: Quale sarebbe una soluzione funzionale? Se tale aggiornamento è contro FP, qual è il meno cattivo design non FP? (Un piccolo risultato in termini di prestazioni va bene, se il codice è più pulito.)

C'è una discussione su un approccio FRP a link , che non lo risolve completamente al momento della scrittura.

    
posta Tupolev._ 25.07.2018 - 16:58
fonte

2 risposte

2

Vorrei semplicemente passare un token di cancellazione nella funzione e fare in modo che verifichi se è stata richiesta l'annullamento a ogni iterazione.

Tuttavia, questo non è ovviamente un approccio funzionale in quanto l'utente richiederebbe la cancellazione e quindi inietterebbe lo stato nella funzione.

Forse se conosci i requisiti di cancellazione in anticipo puoi specificarlo come funzione stessa (tempo di esecuzione > 50.000) e tornare al paradigma funzionale

    
risposta data 25.07.2018 - 17:51
fonte
0

Ciò implicherebbe di sospendere l'algoritmo, modificare i valori, verificare la coerenza e la validità dei valori e quindi continuare. Il motivo della pausa è che il cambiamento non avviene nel mezzo dell'iterazione. La validità deve essere garantita lascia dire che il valore non può essere negativo o qualcos'altro.

    
risposta data 01.08.2018 - 10:59
fonte

Leggi altre domande sui tag