Qual è l'algoritmo migliore per implementare un sistema con un percorso di esecuzione complesso?

1

Attualmente sto lavorando a un'implementazione basata su un insieme di configurazioni utente che dovrebbe emettere una decisione definitiva. Le configurazioni multiple vengono valutate più volte in diverse fasi dell'esecuzione.

Esempio: diciamo che sto costruendo un sistema che pianifica la vacanza perfetta per un utente. L'oggetto Utente è l'input del sistema e ogni utente ha diverse proprietà, come sesso, posizione, altezza, età, ecc. Viene valutata una serie iniziale di proprietà dell'utente. Ad esempio, voglio inviare un utente in una vacanza distante almeno 100 miglia da dove vive. Dopo che questa condizione è stata valutata, introduco la variabile age e restringo l'insieme dei possibili risultati e così via ...

In questo momento, il sistema è un insieme sequenziale di condizioni molto semplice da comprendere e eseguire il debug, ma il sistema sta crescendo e così anche il numero di condizioni. Mi piacerebbe refactoring rendendolo più testabile e più facile aggiungere condizioni extra senza introdurre regressioni.

Ho esaminato diversi modi per raggiungere questo obiettivo, in particolare, se risolverlo utilizzando una struttura decisionale o una macchina a stati, ma non sono ancora convinto che una di queste sia la soluzione migliore.

Che cosa consiglieresti in questo caso?

    
posta MC. 05.08.2018 - 20:14
fonte

2 risposte

1

La domanda è molto ampia, ma da quello che ho capito, sembra che tu stia creando un motore basato su regole , dove ogni regola ha delle condizioni che attivano alcune decisioni / azioni / detrazioni. Quindi ecco alcune idee per iniziare.

Un modo per farlo è implementarlo con un insieme di regole e inoltro concatenamento . Ogni regola utilizza il schema dell'interprete per valutare la condizione IF; se è vero, attiverebbe la parte THEN, eseguendo un elenco di azioni (ad esempio utilizzando il schema di comando ) o definendo alcuni valori o costruendo un filtro applicando alcuni decoratori successivi. Dovresti quindi ripetere il set di regole, finché un'iterazione non attiva alcuna nuova regola.

Un altro modo per farlo è costruire un grafico, rappresentando le regole. Ogni variabile di input di condizioni sarebbe quindi un nodo inizializzato con i fatti noti. Ogni nodo è collegato ad alcuni operatori che combinano i nodi di input ai nodi di output di attivazione (che possono essere nuovamente i nodi di input). L'algoritmo quindi eseguirà l'iterazione attraverso il grafico, propagando i valori fino a quando non si verificherà più alcun cambiamento di stato su alcun nodo di output.

Ma questa è una semplificazione. Perché affronterai anche regole contraddittorie, regole sovrapposte o regole ciclistiche. Avresti quindi bisogno di un meccanismo di mantenimento della verità per ordinare il caos.

Se limita la tua domanda, fornendo maggiori dettagli, potrebbe essere fornita una risposta più precisa.

    
risposta data 06.08.2018 - 02:02
fonte
1

Ti consiglierei di rendere ogni condizione una funzione pura (che dovrebbe essere facile, poiché sembra che tu lo stia già facendo). E idealmente, ognuno dovrebbe prendere alcuni candidati non selezionati e alcuni dati di filtro costanti (le informazioni dell'utente) mentre restituisce alcuni candidati non selezionati.

Fare in modo che ogni funzione funzioni esclusivamente su input senza effetti collaterali (o stati) significa che sono molto facili da testare. Significa anche che possono essere banalmente parellelizzati. E supponendo che gli input e gli output siano gli stessi - riordinati banalmente. Parallelizzazione ti consente di avere opzioni per ridimensionare le cose. Il riordino può fornire molti vantaggi consentendo di fare filtri lenti più lunghi (quindi vengono eseguiti con meno candidati) o filtri più efficaci (in modo da escludere i candidati prima nella pipeline).

L'algoritmo in sé è semplicemente semplice - concatenamento di funzioni (o composizione, a seconda della tua prospettiva). Questo è uno di quei casi anche se l'implementazione avrà un ruolo chiave nella tua flessibilità e la sintonizzazione sul tuo particolare problema conta molto.

    
risposta data 06.08.2018 - 03:18
fonte

Leggi altre domande sui tag