Attualmente sto lavorando su un piccolo problema (parte di un sistema di controllo del flusso di materiale più grande) e mi chiedo se la mia soluzione pianificata per una delle connessioni tra due padiglioni sia buona o ci siano approcci chiaramente migliori. Una piccola illustrazione del problema:
- Verde: Dispositivi
- Arancione: Posizioni
- Vuoto: corsie da cui prendere una scatola o mettere una scatola.
Il problema riguarda il controllo dei due dispositivi verdi che possono trasportare le scatole in alcune corsie. Possono muoversi individualmente e non sono collegati insieme. Il dispositivo 1 può assumere la posizione 1, 2, 3, 4. Il dispositivo 2 può assumere le posizioni 2, 3, 4, 5. I dispositivi possono essere prelevati, rilasciati o spostati mentre sono vuoti (dispositivi 1 in posizione 1, dispositivi 2 in posizione 5).
I rettangoli vuoti in basso e in alto sono le corsie in cui i dispositivi verdi possono prelevare scatole da o trascinare caselle. Voglio solo prendere scatole sui miei dispositivi se posso lasciarli a destinazione. E ovviamente voglio massimizzare i trasporti, ridurre al minimo i movimenti vuoti e naturalmente i dispositivi non possono passare l'un l'altro (controllo della collisione).
Le corsie sono dentro o fuori. Non ci possono essere deadlock, che viene gestito in anticipo. Le scatole hanno i loro trasporti molto prima che arrivino nelle corsie. Quindi se una casella arriva sulla corsia 1 e ha un trasporto verso la corsia 4 non ci possono essere caselle alla corsia 4 che vogliono la corsia 1. Le corsie sono molto più grandi e le scatole in attesa in coda, ho aggiunto solo due posti per corsia questi due sono importanti se entrambi i dispositivi scelgono qualcosa che lasceranno cadere lì. Può succedere che la corsia non venga ricaricata o il trasporto su un nodo prima delle fermate affinché le caselle possano entrare nella corsia viceversa.
I trasporti possibili sono:
- dalla corsia 1 alla 4 o 5
- dalla corsia 2 e 3 alla corsia 1
- dalla corsia 4 e 5 alla corsia 3
- e per scopi di rotazione corsia 4 a 5 e viceversa
Ci sono centinaia di combinazioni possibili naturalmente dipende se hanno una casella su di esse, se c'è spazio libero per far cadere una o anche due caselle in una corsia, se ci sono caselle da raccogliere e se c'è solo uno o due.
Per farla breve, per quanto sto lavorando su un database, il mio attuale approccio è un cross join, la costruzione di un prodotto cartesiano ordinato dal minimo movimento per i dispositivi, dal momento in cui le scatole sono arrivate ecc. e basta tornare / continuare se una combinazione non funziona.
Esistono approcci migliori per risolvere problemi come questo? C'è un termine o una parola chiave che dovrei esaminare per risolvere problemi del genere?
Modifica
L'ho capito lavorando con il mio approccio che elenca tutte le azioni possibili per ogni dispositivo, ad esempio:
- dispositivo 1, selezione azione, posizione 3
- dispositivo 1, azione rilasciata, posizione 4
e così via per entrambi i dispositivi. Un CROSS JOIN di quei due mi ha lasciato con circa 120 combinazioni. Quasi la metà potrebbe essere eliminata da device_1.X < device_2.X . In questo cursore SQL ho passato alcune variabili (dispositivo disponibile, casella già presente sul dispositivo) in modo da poter eliminare il selettore o il calo per dispositivo che mi ha lasciato circa 20 combinazioni. Poi ho lasciato il mio vero trasporto che mi ha lasciato con circa 10 combinazioni durante i miei test che erano tutte valide mosse possibili.
All'interno di un ciclo di dati ho poi valutato se il primo posto all'interno della corsia è vuoto se la mia azione è stata scelta o se la corsia di destinazione ha caselle che vengono nella mia direzione e devono essere gestite per prime. Se entrambi i dispositivi stanno per scegliere qualcosa che andrà nella stessa corsia, ovviamente controllerò i primi due posti vuoti.
Questo mi ha lasciato con circa 5 combinazioni. Che doveva essere ordinato per evitare movimenti inutili, priorità movimenti utili per entrambi i dispositivi invece per un dispositivo e ridurre al minimo il viaggio sull'asse x.
Devo controllare se quella priorità funzionerà o mi lascerà con alcune corsie che non vengono trasportate affatto, forse ci deve essere qualche ordine che è basato sul tempo / sequenza come se la casella fosse in attesa per 3 minuti ha priorità priorità predefinita.
Durante i prossimi giorni farò molti test per scoprire se ci sono ancora problemi. Sono abbastanza contento che abbia funzionato in quel modo ancora mi chiedo se questo sia l'approccio giusto o ci siano chiaramente modi / tecniche migliori per problemi del genere. O è questo l'approccio comune?