Simulazione di una linea di produzione

1

Sto provando a simulare una linea di produzione di DVD in Java. La cosa su cui ho un problema è il calcolo del tempo in questo tipo di simulazione e il numero di DVD all'ora.

La linea di produzione è composta da 4 macchine, ognuna delle quali trascorre un certo tempo casuale lavorando su 1 DVD. Il terzo può lavorare su più di 1 DVD contemporaneamente (massimo 100). Inoltre, il terzo accetterà sempre più DVD su cui lavorare, a patto che la capacità sia < 50%, che ho intenzione di etichettare come m3Capacity . Ma per ora, ignoriamo semplicemente la caratteristica della capacità.

Quello che ho finora è che, con un generatore di numeri casuali (dato che ogni macchina ha un tempo di elaborazione casuale del DVD ogni volta che inizia a lavorare su un nuovo DVD), ho assegnato un tempo di elaborazione casuale a ciascuna delle quattro macchine, sommato i tempi di elaborazione per il tempo totale trascorso in produzione one-go ( totalProdTime = processTime1 + processTime2 + processTime3 + processTime4 ), quindi continuo a sommare quei valori totalProdTime fino a quando il tempo totale dell'intera simulazione raggiunge la durata desiderata del simulazione specificata dall'utente ( totalProdTimeSim = totalProdTimeSim + mTotal.totalProdTime ). Più tardi ho solo verificato se totalProdTimeSim ha raggiunto l'ora desiderata e il gioco è fatto.

Ora, il problema è che, in questo modo, la produzione dei DVD attende che un'istanza di produzione finisca completamente fino alla fine della macchina 4, e quindi il lavoro inizia sul secondo DVD, ecc. Quello che voglio fare è che dopo che la macchina 1 ha terminato il lavoro, e la seconda inizia il suo lavoro, la macchina 1 inizia a lavorare su un altro DVD con il tempo appena generato. Lo stesso vale per tutte le altre macchine. Dopo che la macchina 2 ha finito di lavorare su un DVD, inizia immediatamente a lavorare su un altro DVD.

Ora, poiché tutte le macchine hanno tempi di elaborazione casuali ogni volta che iniziano a lavorare su un altro DVD, spesso accade che una macchina "voglia lavorare su un altro DVD" mentre quella precedente non ha finito il suo lavoro su quella attuale . In questo caso, la macchina inattiva "attende" che la macchina precedente abbia terminato l'elaborazione e quindi accetta il DVD dalla macchina precedente.

Quindi, nel mio esempio, abbiamo che tutte le macchine funzionano una per una, ma voglio che tutti lavorino costantemente, anche dopo aver finito di lavorare sul DVD corrente (eccetto nella prima iterazione, dove le altre macchine hanno bisogno aspettare che i precedenti li inoltrino il loro DVD su cui hanno precedentemente lavorato).

Come pensi che dovrei calcolare il tempo totale di simulazione e l'uscita del DVD? Ci stavo pensando ieri sera, ma non ho avuto idee.

Il mio schizzo su come dovrebbe funzionare può essere trovato nella foto qui sotto. Nello schizzo tutte le macchine si comportano come se avessero costantemente qualcosa su cui lavorare, ma dovrebbero aspettare dall'input della macchina precedente.

Grazie in anticipo!

    
posta Boris Jakovljevic 21.03.2015 - 17:11
fonte

2 risposte

1

Una domanda strana, e non sono proprio sicuro che si adatti qui ... Ecco un approccio a forza bruta.

Se dovessi scrivere codice per risolvere questo, creerei una classe ProductionLine che contiene un elenco di oggetti Machine, insieme a un contatore DiskOuput. La classe ProductionLine avrebbe un metodo ('timePasses') che puoi chiamare per simulare il passare del tempo, ad esempio incrementi di 1 secondo. Questo a sua volta richiamerebbe gli oggetti della Macchina che avrebbero anche un metodo timePasses. La Macchina sa quante chiamate di timePass sono necessarie prima che finisca di masterizzare un disco (la quantità casuale di secondi). Quando una Macchina finisce di scrivere un disco, l'oggetto timePasses restituirebbe un valore per indicare che un disco era finito. La macchina ripristina quindi il numero casuale di secondi necessari per scrivere un disco e ricominciare da capo. La classe ProductionLine sa che quando timePasses restituisce un valore, il contatore DiskOuput deve essere incrementato perché un disco è stato completato.

Ora hai un'applicazione in cui tutte le macchine si avviano contemporaneamente. È possibile eseguire questo con un ciclo fino a quando non passa una certa quantità di tempo o fino a quando DiskOuput raggiunge un determinato valore.

Ora, per rendere le macchine dipendenti dal primo disco ... La tua ProductionLine dovrebbe avere un elenco di macchine (il "pool" di macchine disponibili nella linea) e un elenco di RunningMachines (che stanno attualmente producendo qualcosa). Chiameresti timePass solo su macchine in esecuzione. Quando chiami timePasses su ProductionLine la prima volta che impiegherebbe una Macchina dal pool, metti su RunningMachines e chiami timePasses su di essa. Ogni volta che una chiamata a timePasses su una macchina indica che è pronto un nuovo disco, ProductionLine potrebbe verificare se sono disponibili ulteriori macchine e, in tal caso, inserirle nell'elenco RunningMachines e iniziare a utilizzarle.

    
risposta data 21.03.2015 - 19:52
fonte
0

Quello che stai cercando si chiama simulazione di eventi discreti . Ci sono più librerie che puoi utilizzare per aiutarti.

La tua situazione è quasi un esempio da manuale di questo tipo di simulazione. Ognuna delle linee è un "agente" che, quando riceve un DVD, preleva un tempo casuale necessario per elaborare e chiede al sistema di "notificarlo" (crea un evento) quando arriva quel momento. Quando il sistema notifica la linea, contrassegna il DVD corrente come elaborato, lo passa alla riga successiva e preleva il successivo. Ciascuna di queste linee (o agenti) è indipendente e si comporta quasi come un "thread" separato. Il sistema è quindi responsabile di "far progredire il tempo" selezionando il prossimo evento in coda e eseguendolo. È quindi possibile ripetere questa simulazione più volte con parametri diversi o tempi casuali diversi per ottenere alcune metriche stocastiche sul sistema.

    
risposta data 21.04.2015 - 09:36
fonte

Leggi altre domande sui tag