Kappale 7 List- ja Dictiornary-rakenteet Simpyssä

muokkaa

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
>>>