Simpy - List
Kappale 7 List- ja Dictiornary-rakenteet Simpyssä
[muokkaa | muokkaa wikitekstiä]Tehtävä Laajenna kappaleessa 5 laadittu ohjelmaa niin, saamme tietää, kuinka paljon päivän (yhden simuloinnin) aikana saimme kerättyä myyntikatetta. Tavaran tuotantohinta vaihtelee 1-3 rahan välillä ja myyntihinta taas 3-6 rahan välillä (tappiota emme suostu ottamaan). Kuinka paljon saamme päivän aikana tuotettu myyntikatetta?
Palataanpa kappalevarasto tehtävään ja katsotaan, kuinka saamme otettua simuloinnistamme talteen tietoa, jota voimme simuloinnin loputtua käyttää hyväksi.
Simpyssä ei voida käyttää globaaleja muuttujia, joilla tietoa voitaisiin kerätä prosessien eri vaiheista. Keinoksi tiedonkeruuseen voidaan käyttää Pythonin List- ja Dictionary-tietorakenteita, jotka ovat sellaisenaan käytettävissä kaikissa prosesseissa, ilman että niitä täytyy kuljettaa prosessin parametreinä. Osittain tästä syytä kannattaa simuloinnissa ”tietoa kantava asia” määritellä olioksi (object), johon prosessin aikana luotua tietoa voi tallentaa ja joka sitten voidaan edelleen tallentaa esim. List-muuttujaan.
Määritellään aluksi List-muttuja, johon myydyt tavara-oliot voidaan tallentaan myynti- ja tuotantohinnat simuloinnin aikana.
myyntitiedot = []
Lisätään sitten Tavara-luokkaan tarvittavat tietoelementit eli hankintahinta ja myyntihinta sekä niille tarvittavat get- ja set-metodit:
class Tavara: def __init__(self, sarjanumero): self.__sarjanumero = sarjanumero self.__tuotantohinta = 0 self.__myyntihinta= 0 def get_sarjanumero(self): return self.__sarjanumero def get_tuotantohinta(self): return self.__tuotantohinta def get_myyntihinta(self): return self.__myyntihinta def set_tuotantohinta(self, tuotantohinta): self.__tuotantohinta=tuotantohinta def set_myyntihinta(self, myyntihinta): self.__myyntihinta = myyntihinta
Itse tuotantoprosessiin meidän ei tarvitse koskea, mutta tuotantohinta meidän pitää generoida satunnaisnaisesti 1-3 välitä ja tallentaa se sitten tavara-olion tietoihin.
tavara = Tavara(i) tuotantohinta = random.randint(1,3) tavara.set_tuotantohinta(tuotantohinta) varasto.put(tavara) print(env.now, 'Tuotanto toimitti tuotteen, sarjanumero',i,'varastoon. Tuotantohinta', tuotantohinta)
Vastaavat toimenpiteet tulee tehdä myyntiprosessissa nyt myyntihinnalle ja sen lisäksi olio tulee tallentaa myyntitiedot – list-muuttujaan myyntitiedot.append(tavara) -metodilla:
myyntihinta= random.randint(3,6) print(env.now,'Myynti myi', myyntimaara,' tuotetta hinnalla', myyntihinta) for i in range(myyntimaara): tavara = yield varasto.get() tavara.set_myyntihinta(myyntihinta) myyntitiedot.append(tavara print(env.now, 'Toimitettiin tavara, sarjanumero',tavara.get_sarjanumero(), myyntihinta', tavara.get_myyntihinta()
Simuloinnin lopussa pystymme käyttämään List-muuttujaan tallennettuja tavra-olioiden tietoja esimerkiksi seuraavasti:
env=simpy.Environment() varasto=simpy.Store(env) env.process(tuotanto(env,varasto)) env.process(myynti(env,varasto)) env.run(until=50) summa_myynti=0 summa_tuotanto=0 summa_ei_myyty=0 for i in range(0,len(myyntitiedot)): tavara=myyntitiedot[i] if tavara.get_myyntihinta() > 0: summa_myynti = summa_myynti+tavara.get_myyntihinta() summa_tuotanto = summa_tuotanto+tavara.get_tuotantohinta() myyntikate = summa_myynti - summa_tuotanto print('Päivän myynti oli', summa_myynti, 'rahaa ja myyntikate', myyntikate,'rahaa')
Päivitetyn ohjelman tuloste voisi olla sitten vaikka seuraavanlainen:
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> ========= RESTART: C:\Users\Simulointi\varasto-2.py ========= 5 Tuotanto toimitti tuotteen, sarjanumero 0 varastoon. Tuotantohinta 1 Varastossa 1 tavaraa 10 Tuotanto toimitti tuotteen, sarjanumero 1 varastoon. Tuotantohinta 3 Varastossa 2 tavaraa 15 Tuotanto toimitti tuotteen, sarjanumero 2 varastoon. Tuotantohinta 3 Varastossa 3 tavaraa 20 Tuotanto toimitti tuotteen, sarjanumero 3 varastoon. Tuotantohinta 3 Varastossa 4 tavaraa 25 Tuotanto toimitti tuotteen, sarjanumero 4 varastoon. Tuotantohinta 1 Varastossa 5 tavaraa 29 Myynti myi 5 tuotetta hinnalla 6 29 Toimitettiin tavara, sarjanumero 0 myyntihinta 6 29 Toimitettiin tavara, sarjanumero 1 myyntihinta 6 29 Toimitettiin tavara, sarjanumero 2 myyntihinta 6 29 Toimitettiin tavara, sarjanumero 3 myyntihinta 6 29 Toimitettiin tavara, sarjanumero 4 myyntihinta 6 Kaikki tavarat toimitettu asiakkalle Varastossa 0 tavaraa 30 Tuotanto toimitti tuotteen, sarjanumero 5 varastoon. Tuotantohinta 3 Varastossa 1 tavaraa 35 Tuotanto toimitti tuotteen, sarjanumero 6 varastoon. Tuotantohinta 3 Varastossa 2 tavaraa 40 Tuotanto toimitti tuotteen, sarjanumero 7 varastoon. Tuotantohinta 2 Varastossa 3 tavaraa 45 Tuotanto toimitti tuotteen, sarjanumero 8 varastoon. Tuotantohinta 1 Varastossa 4 tavaraa Päivän myynti oli 30 rahaa ja myyntikate 19 rahaa >>>