Merge branch 'main' into net-creation
This commit is contained in:
48
README.md
48
README.md
@@ -5,10 +5,13 @@ Il simulatore è iniziato con il lavoro trovato sul libro di testo [Discrete-Eve
|
||||
|
||||
Il risultato è la creazione in una libreria per la simulazione di eventi discreti nella quale si può scegliera la topologia e la quantità di nodi nella rete da simulare.
|
||||
|
||||
Questa libreria è stata confrontata con il tool [JMT](https://jmt.sourceforge.net/Download.html) e le reti usate per fare il confronto si possono trovare sotto [le risorse del main](https://github.com/Berack96/upo-valpre/tree/main/src/main/resources).
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Il JAR risultante che si trova nelle [Releases](https://github.com/Berack96/upo-valpre/releases).\
|
||||
> La versione di Java usata è la 23 (precisamente la [23.0.1](https://www.oracle.com/java/technologies/javase/jdk23-archive-downloads.html)).
|
||||
|
||||
---
|
||||
### Comandi Jar
|
||||
|
||||
Il JAR viene invocato tramite il classico comando java: `java -jar upo-valpre.jar` al quale si aggiungono vari argomenti successivi in base a cosa si vuole fare:
|
||||
@@ -21,29 +24,64 @@ Usato per avviare una simulazione della rete. Nel caso la rete non abbia eventua
|
||||
Esistono vari tipi di argomenti per scegliere come fare la simulazione:
|
||||
* `-runs <N>` per fare la simulazione N volte
|
||||
* `-seed <value>` per dare un seed iniziale scelto
|
||||
* `-i <confidences>` per scegliere gli indici di terminazione delle run di simulazione quando l'intervallo di confidenza associato è raggiunto. Viene ignorato il comando -p se questa opzione è attiva. Il formato da usare è\
|
||||
**\[nodo:statistica=confidenza:errore%\];\[..\]**
|
||||
* `-csv <file>` per salvare i risultati delle run in un file csv
|
||||
* `-p` per fare le simulazioni in parallelo (ovvero su più thread)
|
||||
* `-end <criteria>` per scegliere quando la simulazione finisce nel caso non ci siano dei source limitati nella creazione di arrivi. La tipologia di fine simulazione la si può trovare dentro `EndCriteria` (ovvero MaxArrivals, MaxDepartures, MaxTime) e la formattazione da usare per passare il parametro è la seguente:\
|
||||
**\[Tipo1:param1,..,paramN\];\[..\];\[TipoN:param1,..,paramN\]**
|
||||
**\[tipo:param1,..,paramN\];\[..\]**
|
||||
* `java -jar upo-valpre.jar plot -csv <file>`\
|
||||
Mostra (con un ambiente grafico) una finestra nella quale si può scegliere quale nodo vedere e ogni statistica associata ad esso. Di seguito un'immagine di esempio:\
|
||||

|
||||
|
||||
---
|
||||
### Classi Interne
|
||||
|
||||
Esistono molteplici classi interne che vengono usate per supportare la simulazione e/o mostrare i risultati. In generale le classi dentro il percorso [net.berack.upo.valpre](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre) sono usate per l'utilizzo del jar e quindi non sono essenziali per la simulazione.
|
||||
Esistono molteplici classi interne che vengono usate per supportare la simulazione e/o mostrare i risultati. In generale le classi dentro il percorso [net.berack.upo.valpre](src/main/java/net/berack/upo/valpre) sono usate per l'utilizzo del jar e quindi non sono essenziali per la simulazione.
|
||||
I percorsi che invece sono direttamente responsabili per la simulazione sono:
|
||||
- [net.berack.upo.valpre.rand](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre/rand) All'interno del quale si possono trovare:
|
||||
- [net.berack.upo.valpre.rand](src/main/java/net/berack/upo/valpre/rand) All'interno del quale si possono trovare:
|
||||
- **Rng** che viene usato per il calcolo di numeri pseudo-casuali tramite un seed iniziale e la generazione di molteplici stream di generazione di numeri casuali
|
||||
- **Distribution** interfaccia usata per la generazione di un numero casuale di una distribuzione. In questo file esistono molteplici classi interne che implementano l'interfaccia; per esempio: Exponential, Normal, Uniform
|
||||
- [net.berack.upo.valpre.sim](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre/sim) Package che contiene tutte le parti utili alla simulazione; per esempio la creazione della rete o la simulazione si più thread:
|
||||
- [net.berack.upo.valpre.sim](src/main/java/net/berack/upo/valpre/sim) Package che contiene tutte le parti utili alla simulazione; per esempio la creazione della rete o la simulazione si più thread:
|
||||
- **Net** che viene usato per rappresentare una rete da simulare.
|
||||
- **ServerNode** che viene usato per rappresentare un singolo nodo della rete.
|
||||
- **Event** che viene usato per rappresentare un evento della simulazione.
|
||||
- **EndCriteria** interfaccia che viene implementata dalle classi interne usata per controllare se e quando la simulazione debba finire.
|
||||
- **Simulation** e **SimulationMultiple** che vengono usate per far partire la simulazione; la versione multiple serve ad organizzare molteplici simulazioni su più thread o su un singolo core.
|
||||
- [net.berack.upo.valpre.sim.stats](https://github.com/Berack96/upo-valpre/tree/main/src/main/java/net/berack/upo/valpre/sim/stats) Package che contiene tutte le classi utili per la raccolta e l'analisi statistica dei vari valori generati dalla simulazione:
|
||||
- [net.berack.upo.valpre.sim.stats](src/main/java/net/berack/upo/valpre/sim/stats) Package che contiene tutte le classi utili per la raccolta e l'analisi statistica dei vari valori generati dalla simulazione:
|
||||
- **Result** il risultato di una run e la sua classe interna **Result.Summary** che contiene molteplici risultati di run già analizzati.
|
||||
- **NodeStats** contiene indici statistici di un nodo e la sua classe interna **NodeStats.Summary** che contiene molteplici indici statistici già analizzati.
|
||||
- **ConsoleTable** utile per mostrare i risultati in console sottoforma di tabella
|
||||
- **CsvResult** utile per la lettura/scrittura dei risultati in formato csv
|
||||
|
||||
---
|
||||
### Esempi
|
||||
|
||||
Nel jar sono presenti già 2 reti per fare degli esperimenti e/o testare se il tool funziona correttamente. Per poter vedere una run usando questi esempi basta far partire il tool in modalità interattiva e scegliere di caricare gli esempi.\
|
||||
`java -jar upo-valpre.jar interactive`
|
||||
|
||||
##### Primo esempio
|
||||
\
|
||||
Il primo è `example1`; è una rete composta da una fonte di clienti (Source) che arrivano con tasso esponenziale (λ=0.222 e quindi media 4.5) e un centro di servizio (Queue) con tasso di servizio distribuito come una normale (μ=3.2, σ=0.6).\
|
||||
Se si effettua una simulazione si vedranno i risultati sulla console in questo modo:
|
||||

|
||||
|
||||
Il tool JMT con la stessa rete produce i seguenti risultati che sono molto simili a quelli prodotti dalla libreria:\
|
||||
Queue Response Time = 7.3022 con un range [7.1456, 7.4589]\
|
||||
Queue Throughput = 0.2226 con un range [0.2182, 0.2271]\
|
||||
Queue Utilization = 0.7111 con un range [0.6959, 0.7262]
|
||||
|
||||
##### Secondo esempio
|
||||
\
|
||||
Il secondo esempio è `example2`; è una rete composta da una fonte di clienti (Source) che arrivano con tasso esponenziale (λ=1.5 e quindi media 0.666), un centro di servizio (Service1) con tasso di servizio distribuito come una esponenziale (λ=2.0 e quindi media 0.5) e un altro centro di servizio (Service2) con tasso di servizio distribuito come una esponenziale (λ=3.5 e quindi media 0.2857) e con un tempo di indisponibilità che viene attivato con probabilità 10% e distribuito con una eseponenziale (λ=10.0 e quindi media 0.1)\
|
||||
Se si effettua una simulazione si vedranno i risultati sulla console in questo modo:
|
||||

|
||||
|
||||
Il tool JMT con la stessa rete produce i seguenti risultati che sono molto simili a quelli prodotti dalla libreria:\
|
||||
Service1 Response Time ~ 1.9866\
|
||||
Busy2 Response Time ~ 0.2825\
|
||||
Queue2 Response Time ~ 0.2279\
|
||||
Service1 Utilization ~ 0.7488\
|
||||
Calibration Number of Customers ~ 0.0150\
|
||||
Busy2 Number of Customers ~ 0.4279\
|
||||
Throughput ~ 1.5000
|
||||
|
||||
BIN
image/README/1741860064265.png
Normal file
BIN
image/README/1741860064265.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
BIN
image/README/1741862185715.png
Normal file
BIN
image/README/1741862185715.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
BIN
image/README/1741862486547.png
Normal file
BIN
image/README/1741862486547.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
BIN
image/README/1741862746304.png
Normal file
BIN
image/README/1741862746304.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 902 B |
BIN
image/README/1741863043733.png
Normal file
BIN
image/README/1741863043733.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
146
src/main/resources/example1.jsimg
Normal file
146
src/main/resources/example1.jsimg
Normal file
@@ -0,0 +1,146 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
|
||||
<archive xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="example1.jsimg" timestamp="Thu Mar 13 11:14:34 CET 2025" xsi:noNamespaceSchemaLocation="Archive.xsd">
|
||||
<sim disableStatisticStop="false" logDecimalSeparator="," logDelimiter=";" logPath="C:\Users\giaco\JMT\" logReplaceMode="0" maxEvents="-1" maxSamples="1000000" name="example1.jsimg" polling="1.0" xsi:noNamespaceSchemaLocation="SIMmodeldefinition.xsd">
|
||||
<userClass name="Class1" priority="0" referenceSource="Source " softDeadline="0.0" type="open"/>
|
||||
<node name="Source ">
|
||||
<section className="RandomSource">
|
||||
<parameter array="true" classPath="jmt.engine.NetStrategies.ServiceStrategy" name="ServiceStrategy">
|
||||
<refClass>Class1</refClass>
|
||||
<subParameter classPath="jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy" name="ServiceTimeStrategy">
|
||||
<subParameter classPath="jmt.engine.random.Exponential" name="Exponential"/>
|
||||
<subParameter classPath="jmt.engine.random.ExponentialPar" name="distrPar">
|
||||
<subParameter classPath="java.lang.Double" name="lambda">
|
||||
<value>0.2222222222222222</value>
|
||||
</subParameter>
|
||||
</subParameter>
|
||||
</subParameter>
|
||||
</parameter>
|
||||
</section>
|
||||
<section className="ServiceTunnel"/>
|
||||
<section className="Router">
|
||||
<parameter array="true" classPath="jmt.engine.NetStrategies.RoutingStrategy" name="RoutingStrategy">
|
||||
<refClass>Class1</refClass>
|
||||
<subParameter classPath="jmt.engine.NetStrategies.RoutingStrategies.RandomStrategy" name="Random"/>
|
||||
</parameter>
|
||||
</section>
|
||||
</node>
|
||||
<node name="Sink">
|
||||
<section className="JobSink"/>
|
||||
</node>
|
||||
<node name="Queue">
|
||||
<classSoftDeadlines>
|
||||
<softDeadline>0.0</softDeadline>
|
||||
</classSoftDeadlines>
|
||||
<quantumSize>
|
||||
<quantaSize>0.0</quantaSize>
|
||||
</quantumSize>
|
||||
<quantumSwitchoverTime>
|
||||
<quantumSwitchoverTime>0.0</quantumSwitchoverTime>
|
||||
</quantumSwitchoverTime>
|
||||
<section className="Queue">
|
||||
<parameter classPath="java.lang.Integer" name="size">
|
||||
<value>-1</value>
|
||||
</parameter>
|
||||
<parameter array="true" classPath="java.lang.String" name="dropStrategies">
|
||||
<refClass>Class1</refClass>
|
||||
<subParameter classPath="java.lang.String" name="dropStrategy">
|
||||
<value>drop</value>
|
||||
</subParameter>
|
||||
</parameter>
|
||||
<parameter classPath="jmt.engine.NetStrategies.QueueGetStrategies.FCFSstrategy" name="FCFSstrategy"/>
|
||||
<parameter array="true" classPath="jmt.engine.NetStrategies.QueuePutStrategy" name="QueuePutStrategy">
|
||||
<refClass>Class1</refClass>
|
||||
<subParameter classPath="jmt.engine.NetStrategies.QueuePutStrategies.TailStrategy" name="TailStrategy"/>
|
||||
</parameter>
|
||||
</section>
|
||||
<section className="Server">
|
||||
<parameter classPath="java.lang.Integer" name="maxJobs">
|
||||
<value>1</value>
|
||||
</parameter>
|
||||
<parameter array="true" classPath="java.lang.Integer" name="numberOfVisits">
|
||||
<refClass>Class1</refClass>
|
||||
<subParameter classPath="java.lang.Integer" name="numberOfVisits">
|
||||
<value>1</value>
|
||||
</subParameter>
|
||||
</parameter>
|
||||
<parameter array="true" classPath="jmt.engine.NetStrategies.ServiceStrategy" name="ServiceStrategy">
|
||||
<refClass>Class1</refClass>
|
||||
<subParameter classPath="jmt.engine.NetStrategies.ServiceStrategies.ServiceTimeStrategy" name="ServiceTimeStrategy">
|
||||
<subParameter classPath="jmt.engine.random.Normal" name="Normal"/>
|
||||
<subParameter classPath="jmt.engine.random.NormalPar" name="distrPar">
|
||||
<subParameter classPath="java.lang.Double" name="mean">
|
||||
<value>3.2</value>
|
||||
</subParameter>
|
||||
<subParameter classPath="java.lang.Double" name="standardDeviation">
|
||||
<value>0.6000000000000001</value>
|
||||
</subParameter>
|
||||
</subParameter>
|
||||
</subParameter>
|
||||
</parameter>
|
||||
<parameter array="true" classPath="java.lang.Integer" name="classParallelism">
|
||||
<refClass>Class1</refClass>
|
||||
<subParameter classPath="java.lang.Integer" name="serverParallelism">
|
||||
<value>1</value>
|
||||
</subParameter>
|
||||
</parameter>
|
||||
<parameter array="true" classPath="java.lang.String" name="serverNames">
|
||||
<subParameter classPath="java.lang.String" name="serverTypesNames">
|
||||
<value>Queue - Server Type 1</value>
|
||||
</subParameter>
|
||||
</parameter>
|
||||
<parameter array="true" classPath="java.lang.Integer" name="serversPerServerType">
|
||||
<subParameter classPath="java.lang.Integer" name="serverTypesNumOfServers">
|
||||
<value>1</value>
|
||||
</subParameter>
|
||||
</parameter>
|
||||
<parameter array="true" classPath="java.lang.Object" name="serverCompatibilities">
|
||||
<subParameter array="true" classPath="java.lang.Boolean" name="serverTypesCompatibilities">
|
||||
<subParameter classPath="java.lang.Boolean" name="compatibilities">
|
||||
<value>true</value>
|
||||
</subParameter>
|
||||
</subParameter>
|
||||
</parameter>
|
||||
<parameter classPath="java.lang.String" name="schedulingPolicy">
|
||||
<value>ALIS (Assign Longest Idle Server)</value>
|
||||
</parameter>
|
||||
</section>
|
||||
<section className="Router">
|
||||
<parameter array="true" classPath="jmt.engine.NetStrategies.RoutingStrategy" name="RoutingStrategy">
|
||||
<refClass>Class1</refClass>
|
||||
<subParameter classPath="jmt.engine.NetStrategies.RoutingStrategies.RandomStrategy" name="Random"/>
|
||||
</parameter>
|
||||
</section>
|
||||
</node>
|
||||
<measure alpha="0.01" name="Queue_Class1_Response Time" nodeType="station" precision="0.03" referenceNode="Queue" referenceUserClass="Class1" type="Response Time" verbose="false"/>
|
||||
<measure alpha="0.01" name="Queue_Class1_Utilization" nodeType="station" precision="0.03" referenceNode="Queue" referenceUserClass="Class1" type="Utilization" verbose="false"/>
|
||||
<measure alpha="0.01" name="Queue_Class1_Throughput" nodeType="station" precision="0.03" referenceNode="Queue" referenceUserClass="Class1" type="Throughput" verbose="false"/>
|
||||
<connection source="Source " target="Queue"/>
|
||||
<connection source="Queue" target="Sink"/>
|
||||
</sim>
|
||||
<jmodel xsi:noNamespaceSchemaLocation="JModelGUI.xsd">
|
||||
<userClass color="#FF0000FF" name="Class1"/>
|
||||
<station name="Source ">
|
||||
<position angle="0.0" rotate="false" x="73.0" y="139.0"/>
|
||||
</station>
|
||||
<station name="Sink">
|
||||
<position angle="0.0" rotate="false" x="354.0" y="139.0"/>
|
||||
</station>
|
||||
<station name="Queue">
|
||||
<position angle="0.0" rotate="false" x="191.0" y="136.0"/>
|
||||
</station>
|
||||
</jmodel>
|
||||
<results elapsedTime="932" logDecimalSeparator="," logDelimiter=";" pollingInterval="1.0" xsi:noNamespaceSchemaLocation="Results.xsd">
|
||||
<measure alpha="0.99" analyzedSamples="245760" discardedSamples="390" finalValue="7.30224421202774" name="Queue_Class1_Response Time" nodeType="station" precision="0.03" referenceClass="Class1" referenceStation="Queue" state="1" type="2">
|
||||
<sample lastIntervalAvgValue="7.171346385053164" lowerBound="6.925342616994286" meanValue="7.2654952908722095" simulationTime="349360.1710046531" upperBound="7.6056479647501325"/>
|
||||
<sample lastIntervalAvgValue="7.340886944129393" lowerBound="7.145587638668616" meanValue="7.30224421202774" simulationTime="1105542.162869484" upperBound="7.458900785386865"/>
|
||||
</measure>
|
||||
<measure alpha="0.99" analyzedSamples="56320" discardedSamples="1755" finalValue="0.7110892727677632" name="Queue_Class1_Utilization" nodeType="station" precision="0.03" referenceClass="Class1" referenceStation="Queue" state="1" type="6">
|
||||
<sample lastIntervalAvgValue="0.7121434625959978" lowerBound="0.6959357730746889" meanValue="0.7110892727677632" simulationTime="202809.54195132584" upperBound="0.7262427724608376"/>
|
||||
<sample lastIntervalAvgValue="0.7121434625959978" lowerBound="0.6959357730746889" meanValue="0.7110892727677632" simulationTime="202809.54195132584" upperBound="0.7262427724608376"/>
|
||||
</measure>
|
||||
<measure alpha="0.99" analyzedSamples="51200" discardedSamples="180" finalValue="0.22256617058473832" name="Queue_Class1_Throughput" nodeType="station" precision="0.03" referenceClass="Class1" referenceStation="Queue" state="1" type="5">
|
||||
<sample lastIntervalAvgValue="0.22277397312289457" lowerBound="0.21822871906729738" meanValue="0.22256617058473832" simulationTime="230637.3553415772" upperBound="0.22707953845333897"/>
|
||||
<sample lastIntervalAvgValue="0.22277397312289457" lowerBound="0.21822871906729738" meanValue="0.22256617058473832" simulationTime="230637.3553415772" upperBound="0.22707953845333897"/>
|
||||
</measure>
|
||||
</results>
|
||||
</archive>
|
||||
1000
src/main/resources/example3.jsimg
Normal file
1000
src/main/resources/example3.jsimg
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user