Zadaće na temu dostave paketa iz kolegija Uzorci dizajna
Saznajte više »
Uvod • Zadatak • Struktura rješenja • Konfiguracija • Upotreba • Korišteni alati
👦🏽 Autor | Marijan Kovač |
🧑🏽🏫 Nastavnik | Prof dr. sc. Dragutin Kermek |
📚 Kolegij | Uzorci dizajna |
🏛️ Ustanova | Sveučilište u Zagrebu Fakultet organizacije i informatike Varaždin |
📆 Godina polaganja |
2024 |
Repozitorij se sastoji od ukupno tri zadaće koje je bilo potrebno izraditi na kolegiju:
S obzirom da su se zadaće nadovezivale jedna na drugu, najreprezantetivnija zadaća je upravo ona posljednja - Zadaća 3, koja će ujedno biti i opisana u nastavku.
Tvrtka obavlja dostavu različitih vrsta paketa uz određene usluge dostave. Paket može
biti tipski koji ima predefinirane dimenzije (to su tipski paketi s oznakama A, B, C, D, E) i slobodnim
dimenzijama (oznaka X, postoji maksimalna visina, širina i dužina). Za svaki tipski paket postoji
maksimalna težina, a kod paketa X slobodnih dimenzija maksimalna težina određena je
parametrom (mt) prilikom izvršavanja programa. Usluge dostave mogu biti standardna (S), hitna
(H), plaćanje pouzećem (P), povratak paketa (R).
Tvrtka ima radno vrijeme koje je određeno parametrima (pr za početak rada i kr za kraj
rad) prilikom izvršavanja programa. Tvrtka se sastoji od ureda za prijem paketa od strane
pošiljatelja i ureda za dostavu paketa na adresu primatelja. Ured za prijem paketa evidentira za
svaki paket vrijeme prijema paketa, pošiljatelja, primatelja, vrstu paketa (kod X i ostale podatke),
vrstu usluge (iznos kod plaćanja pouzećem). Podaci za pakete na prijemu se kronološki
evidentiraju. Za svaki primljeni paket potrebno je naplatiti iznos dostave (svaki tipski paket ima
svoju cijenu dostave, a za paket X slobodnih dimenzija formula se nalazi u tablici 1), osim kod
paketa s uslugom plaćanja pouzećem. Njega naplaćuje vozilo koje odrađuje isporuku. Kod
prijema paketa sustav obavještava pošiljatelja i primatelja paketa da je paket zaprimljen.
Obavještavanje o promjeni statusa paketa mora se temeljiti na uzorku dizajna Observer. Svi
pošiljatelji i primatelji paketa na početku imaju pridruženo obavještavanje za svaki paket. Može
se komandom promijeniti.
Ured za dostavu paketa raspolaže s određenim voznim parkom (od bicikla, skutera do
automobila). Svako vozilo ima kapacitet prijevoza (težina u kg, prostor u m3). Prostor koji pokriva
ured podijeljen je u više područja. Jedno područje može pokrivati jedno mjesto/grad ili više njih.
Jeno mjesto ima jednu ili više ulica. Jedno područje može sadržavati jedno ili više mjesta pri čemu
u područje ulaze sve ulice pojedinog mjesta/grada ili samo dio njih. Npr. može biti situacija da
jedno područje pokriva jedno mjesto i samo neke njegove ulice. Ili jedno područje pokriva dva
mjesta sa svim njihovim ulicama i dio ulica trećeg mjesta. Struktura područja mora se temeljiti na
uzorku dizajna Composite.
Za svako vozilo određena su područja koja pokriva i to prema njihovom rangu. Vozila
mogu biti aktivna, neispravna ili neaktivna. Samo aktivna vozila mogu sudjelovati u ukrcavanju
paketa. Vozilo koje je ili je postalo neispravno ne može se koristiti do kraja rada programa ali
sudjeluje u ispisima koji se odnose na vozila. Vozilo koje je postalo neaktivno ne može obavljati svoju funkciju dok mu se ne promijeni status u aktivno. Rad s vozilima mora se temeljiti na uzorku
dizajna State. Rad jednog vozila temelji se na ukrcavanju paketa, isporuci paketa i povratku u
ured. To čini jednu vožnju. Vozilo može obaviti više vožnji tijekom radnog dana. Ukrcavanje
paketa može se obaviti samo unutar radnog vremena. Isporuka paketa može se obaviti i nakon
radnog vremena tako dugo dok se ne isporuče svi paketi.
Pakete koje treba dostaviti ukrcavaju se u slobodno vozilo tako da se ne prekorači njegova
dozvoljena težina i prostor. Na kraju svakog punog sata odlučuje se koji paketi se mogu ukrcati u
pojedino vozilo temeljem adrese paketa (a time i područja kojem pripada) i područja koje je
pridruženo vozilu. Adresa paketa dobije se na temelju primatelja paketa, njegovog grada, ulice i
kućnog broja. Vozilo u jednoj vožnji može prevoziti pakete samo iz jednog područja (određuje se
na temelju prvog paketa koji se ukrca). Prvo se ukrcavaju paketi koji imaju hitnu dostavu. Ako
postoje paketi s hitnom dostavom za svakog od njih traži se vozilo koje je već pridruženo za
područje tog paketa s hitnom dostavom (prethodni paket s hitnom dostavom) ili ispravno slobodno
vozilo koje je najviše rangirano za područje paketa s hitnom dostavom, uz uvjet da ima
raspoloživu težinu i prostor za paket. Ako se pronađe raspoloživo vozilo tada će ono u toj vožnji
obavljati dostavu za to područje. Ako za pojedini sat trenutno ne postoji raspoloživo vozilo za
prijevoz paketa s hitnom dostavom taj će paket pričekati do sljedećeg punog sata. Nakon što su
svi mogući paketi s hitnom dostavom pridruženi raspoloživim vozilima slijedi ukrcavanje ostalih
paketa. Za ostale pakete vrijedi slična pravila kao i za pakete s hitnom dostavom. Prvo se traži
vozilo koje je već pridruženo za područje tog paketa ili ispravno slobodno vozilo koje je najviše
rangirano za područje paketa, uz uvjet da ima raspoloživu težinu i prostor za paket. Ako za
pojedini sat trenutno ne postoji raspoloživo vozilo za prijevoz paketa taj će paket pričekati do
sljedećeg punog sata. Kod ukrcavanja paketa u vozilo sustav obavještava pošiljatelja i primatelja
paketa da je paket ukrcan u vozilo. Sada vozila kreću prema odredištima paketa.
Paketi se mogu isporučivati na dva načina (parametar isporuka):
-
Prema redoslijedu kako su ukrcani u vozilo. Za sve pakete u vozilu izračunava se udaljenosti između trenutne GPS koordinate (u prvom segmentu to je GPS ureda, parametar gps) i GPS koordinate za adresu paketa. GPS adresa paketa izračunava se interpolacijom GPS koordinata početka ulice (gps_lat_1 i gps_lon_1) i GPS koordinata kraja ulice (gps_lat_2 i gps_lon_2) te kućnog broj adrese paketa i najvećeg kućnog broja u ulici. Nakon prvog paketa njegova GPS lokacija postaje trenutna lokacija te se izračunava udaljenosti za sljedeći paket. I tako se nastavlja dok se ne obavi za zadnji paket za dostavu.
-
Određivanjem paketa s najbližom dostavom. Za svako vozilo potrebno je odrediti redoslijed isporuka njegovih paketa. Prvo se određuje koji paket ima najbližu dostavu od ureda. Za sve pakete u vozilu izračunava se udaljenosti između trenutne GPS koordinate (u prvom segmentu to je GPS ureda, parametar gps) i GPS koordinate za adrese paketa. Kada se odredi paket s najbližom dostavom onda njegova GPS lokacija postaje trenutna lokacija te se traži sljedeći paket s najbližom dostavom. I tako se nastavlja dok se ne utvrdi zadnji paket za dostavu.
Za svaki paket ukupno vrijeme za isporuku sastoji se od vremena vožnje do adrese i vremena postupka isporuke. Vrijeme vožnje izračunava se na temelju potrebnog vremena da se prođe udaljenost od trenutne pozicije do pozicije odredišta paketa uz prosječnu brzinu vozila. Vrijeme postupka isporuke određeno je parametrom (vi u minutama) prilikom izvršavanja programa. Kod isporuke paketa primatelju potrebno je evidentirati vrijeme preuzimanja paketa. Ako je paket s uslugom plaćanja pouzećem potrebno je kod vozila ažurirati prikupljeni novac s iznosom pouzeća. Nakon preuzimanja paketa sustav obavještava pošiljatelja i primatelja paketa da je paket preuzet. Kada se isporuči zadnji paket iz jednog vozila potrebno je vozilo vratiti u ured za što se izračunava vrijeme koje je potrebno da vozilo prođe udaljenost od trenutne pozicije do pozicije ureda uz prosječnu brzinu vozila.
Datoteka | Primjer | Dodatne informacije |
---|---|---|
Podaci vrsta paketa | DZ_3_vrste.csv | Oznaka, opis, visina, širina, dužina,
maksimalna težina, cijena, cijena hitno,
cijenaP, cijenaT. CijenaP i cijenaT ne
koriste se kod tipskih paketa (imaju 0,0).
Visina, širina, dužina su u m. Maksimalna
težina je u kg.
Kod vrste X visina, širina i dužina
predstavljaju maksimalne vrijednosti, a
maksimalna težina je 0,0 jer se drugačije
određuje. Kod vrste X cijena se izračunava
na bazi osnovne cijene te joj se pribrajaju: 1. umnožak cijenaP i volumena prostora u m3 2. umnožak cijenaT i težine u kg. |
Popis vozila | DZ_3_vozila.csv | Registracija, opis, kapacitet težine u kg, kapacitet prostora u m3, redoslijed, prosječna brzina, područja po rangu, status |
Popis prijema paketa | DZ_3_paketi.csv | Oznaka, vrijeme prijema, pošiljatelj, primatelj, vrsta paketa (ako je tipski onda se za sljedeća 3 podatka ne unose vrijednosti tj. imaju 0,0), visina, širina, dužina, težina, usluga dostave, iznos pouzeća (ako je ta usluga, inače 0). Visina, širina, dužina su u m. Težina je u kg. Paketi se upisuju prema vremenu prijema (kronološki). |
Popis ulica | DZ_3_ulice.csv | Id, naziv, gps_lat_1, gps_lon_1 (GPS koordinate početka ulice), gps_lat_2, gps_lon_2 (GPS koordinate kraja ulice), najveći kućni broj |
Popis mjesta | DZ_3_mjesta.csv | Id, naziv, ulica, ulica, ulica, ... |
Popis osoba | DZ_3_osobe.csv | Osoba, grad, ulica, kbr Rade se o primateljima paketa, a oni mogu biti osobe i tvrtke. Mogu biti uključeni i pošiljatelji paketa, odnosno neki mogu biti i pošiljatelji i primatelji paketa. |
Popis područja | DZ_3_podrucja.csv | Id, grad:ulica, grad:ulica, grad:* (sve ulice grada), ... |
Datoteka parametara sadrži parametre u obliku para ključ=vrijednost:
vp=DZ_3_vrste.csv #datoteka vrsta paketa
pv=DZ_3_vozila.csv #datoteka vozila
pp=DZ_3_paketi.csv #datoteka paketa
po=DZ_3_osobe.csv #datoteka osoba
pm=DZ_3_mjesta.csv #datoteka mjesta
pu=DZ_3_ulice.csv #datoteka ulica
pmu=DZ_3_podrucja.csv #datoteka podrucja
mt=100 #maksimalna težina
vi=5 #vrijeme isporuke
vs=21.11.2023. 06:00:00 #virtualni sat
ms=600 #množitelj sekunde
pr=07:00 #početak rada
kr=19:00 #kraj rada
gps= 46.305433, 16.336646 #gps koordinate ureda
isporuka=2 #strategija isporuke (1 ili 2)
Detaljnije upute možete pročitati ovdje.
Na slici možete vidjeti dijagram klasa s naglašenim uzorcima dizajna koji su korišteni. Za detaljnije informacije o rješenju kliknite ovdje.
Za pokretanje rješenja bit će vam potrebno slijedeće:
-
Operativni sustav Linux (preporuka)
Za izradu rješenja korišten je Linux Mint na Oracle VirtualBox VM.
-
Java 17 ili veća:
- smjestite se u željeni direktorij za preuzimanja, npr:
cd /opt/alati/
- preuzmite Java OpenJDK 17.0.2:
curl https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz -O
- smjestite se u slijedeći direktorij (preporuka):
cd /usr/lib/jvm
- izdvojite arhivu:
sudo tar -xvf /opt/alati/openjdk-17.0.2_linux-x64_bin.tar.gz -C .
- podesite varijablu okruženja:
Otvorite datoteku
/etc/profile.d/jdk.sh
i promijenite/dodajte slijedeću liniju:
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.2
-
restartirajte sustav (preporuka)
-
provjerite ispravnost instalacije:
java -version
Ako je sve bilo u redu, trebali biste dobiti rezultat sličan ovome:
openjdk version "17.0.2" 2022-01-18 OpenJDK Runtime Environment (build 17.0.2+8-86) OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)
-
Maven:
- ažurirajte repozitorij:
sudo apt update
- instalirajte Maven:
sudo apt install maven
- provjerite ispravnost instalacije:
mvn -version
Ako je sve bilo u redu, trebali biste dobiti rezultat sličan ovome:
Apache Maven 3.6.3 Maven home: /usr/share/maven Java version: 17.0.2, vendor: Oracle Corporation, runtime: /usr/lib/jvm/jdk-17.0.2 Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "5.15.0-69-generic", arch: "amd64", family: "unix"
-
Eclipse IDE (opcionalno)
Preuzmite i instalirajte Eclipse IDE. Konfigurirajte Eclipse IDE za Java 17 prema potrebi.
- Klonirajte ovaj repozitorij:
https://github.com/mkovac700/uzdiz.git
-
smjestite se u direktorij
mkovac_zadaca_3
-
izvršite kompiliranje (potrebno samo prvi put):
mvn clean package
- izvršite program na slijedeći način (primjer):
java -jar /home/NWTiS_2/uzdiz/mkovac_zadaca_3/target/mkovac_zadaca_3-1.0.0.jar DZ_3_parametri.txt
Korisniku se daje mogućnost izvršavanja sljedećih komandi:
-
Izvršavanje programa određeni broj sati virtualnog vremena
-
sintaksa
VR hh
-
primjer
VR 4
-
opis
Virtualni sat programa radi prema korigiranom broju sekundi. Npr. ako je
--ms 600
znači da se u jednoj sekundi stvarnog vremena izvrši 600 sekundi virtualnog sata. To znači da se odradi jedna sekunda spavanja u stvarnom vremenu, korigirati virtualni sat, ispisati vrijeme virtualnog sata na ekran, provjeriti da li je stigao novi paket ili više njih u uredu za prijem. Primljeni paketi se ukrcavaju u vozilo (na kraju svakog punog sata prema gornjem opisu ukrcavanja paketa). Na ekran se ispisuje svaki paket koji je ukrcan u vozilo (i virtualno vrijeme). Kada dođe vrijeme za određeno vozilo ono može krenuti s dostavom kod primatelja. Na ekran se ispisuje kada vozilo krene na dostavu paketa. Na ekran se ispisuje svaki paket koji je isporučen primatelju (i virtualno vrijeme). Tako se izvršava virtualno vrijeme dok ne istekne zadano vrijeme izvršavanja ili dođe do kraja radnog vremena. Na ekran se ispisuje zašto je došlo do kraja rada. Može se više puta izvršiti komanda.
-
-
Pregled statusa paketa u trenutku virtualnog vremena
-
sintaksa
IP
-
primjer
IP
-
opis
Ispis tablice s primljenim i dostavljenim paketima (vrijeme prijema, vrsta paketa, vrsta usluge, status isporuke, vrijeme preuzimanja, iznos dostave, iznos pouzeća) u trenutno vrijeme virtualnog sata. Ispis primljenog paketa provjerava da li je vrijeme prijema manje od virtualnog vremena. Paket je dostavljen ako je vrijeme preuzimanja manje od virtualnog vremena.
-
-
Pregled podataka za vozila u trenutku virtualnog vremena
-
sintaksa
SV
-
primjer
SV
-
opis
Ispis tablice s podacima o svim vozilima (status, ukupno odvoženi km, broj paketa u vozilu (hitnih, običnih, isporučenih), trenutni % zauzeća (prostora i težine), broj vožnji. Ispis podataka mora se temeljiti na uzorku dizajna Visitor.
-
-
Pregled podataka za vožnje vozila tijekom dana
-
sintaksa
VV vozilo
-
primjer
VV VŽ100PK
-
opis
Ispis tablice s podacima o pojedinim vožnjama odabranog vozila (vrijeme početka, vrijeme povratka, trajanje, ukupno odvoženo km, broj paketa u vozilu (hitnih, običnih, isporučenih), % zauzeća (prostora i težine) na početku vožnje). Ispis podataka mora se temeljiti na uzorku dizajna Visitor.
-
-
Pregled podataka za segmente vožnje vozila tijekom dana
-
sintaksa
VS vozilo n
-
primjer
VS VŽ100PK 1
-
opis
Ispis tablice s podacima o segmentima 1. vožnje odabranog vozila (vrijeme početka, vrijeme kraja, trajanje, odvoženo km, paket (ako nije povratak u ured)). Ispis podataka mora se temeljiti na uzorku dizajna Visitor.
-
-
Pregled područja s hijerarhijskim prikazom mjesta koja uključuje, a mjesta koje ulice. Svaka nova razina ima uvlaku od 4 praznine.
-
sintaksa
PP
-
primjer
PP
-
opis
Ispis tablice s podacima o područjima, njihovim mjestima i ulicama mjesta koje ulaze u područje.
-
-
Promjena statusa vozila u trenutku virtualnog vremena
-
sintaksa
PS vozilo [A | NI | NA]
A – aktivno ● NI – nije ispravno ● NA nije aktivno
-
primjer
PS VŽ100PK NI
-
opis
Vozilu VŽ100PK se postavlja status da nije ispravno.
-
-
Promjena statusa slanja obavijest za pošiljatelja ili primatelja paketa
-
sintaksa
PO 'primatelja/pošiljatelja' paket [D | N]
D – šalju se obavijesti ● N – ne šalju se obavijesti
-
primjer
PO 'Pero Kos' CROVŽ0001 N
-
opis
Pošiljatelj Pero Kos ne želi primati obavijesti za paket CROVŽ0001.
-
-
Prekid rada programa
- sintaksa
Q
- sintaksa