Interessante domanda, non ho mai sentito parlare di questo problema, probabilmente perché non ho molto background in questo argomento, né molta esperienza con NetworkX. Tuttavia, ho un'idea per un algoritmo. Questo potrebbe essere il modo più ingenuo per farlo e sarei lieto di apprendere un algoritmo più intelligente.
L'idea è che è possibile utilizzare le regole di restrizione per trasformare il grafico in un nuovo grafico in cui tutti i bordi sono validi, utilizzando il seguente algoritmo.
La limitazione di percorso (1,2,3) può essere diviso in due regole:
- caso in cui siate sopra (1,2) e rimuovere (2,3)
- Se si lascia oltre (2,3) quindi rimuovere (1,2)
Per inserire questo nel grafico è possibile inserire copie del nodo 2 per ciascun caso. Chiamerò i nuovi nodi 1_2 e 2_3 dopo il margine valido nel rispettivo caso. Per entrambi i nodi, si copiano tutti i bordi in entrata e in uscita meno il margine limitato.
Ad esempio:
Nodes = [1,2,3,4]
Edges = [(1,2),(2,3),(4,2)]
Il percorso valido deve essere solo 4-> 2-> 3 non 1-> 2-> 3. Quindi espandiamo il grafico:
Nodes = [1,1_2,2_3,3,4] # insert the two states of 2
Edges = [ # first case: no (1_2,3) because of the restriction
(1,1_2), (4, 1_2)
# 2nd case, no (1,2_3)
(2_3,3), (4,2_3)]
L'unico percorso valido in questo grafico è 4-> 2_3-> 3. Questo semplicemente mappa su 4-> 2-> 3 nel grafico originale.
Spero che questa risposta possa almeno aiutarti se non trovi alcuna soluzione esistente. Regole di restrizione più lunghe farebbero esplodere il grafico con un numero in crescita esponenziale di nodi di stato, quindi o questo algoritmo è troppo semplice, o il problema è difficile ;-)
Non so se questo può essere fatto all'interno di NetworkX, ma un approccio (concettualmente) semplice sarebbe quello di guardare il nodo 1 e se viene utilizzato, eliminare completamente il nodo 3. – Wilduck