Simpy - Store
Kappale 5 – Store
muokkaaTehtävä
Tee ohjelma, joka simuloi tuotanto-varasto-myynti – ketjua. Tuotanto toimittaa tasaiseen tahtiin, joka 5. minuutti tuotteen varastoon. Myynti myy satunnaiseen tahtiin (10-40 minuutin välein) 1-5 tuotetta varastosta asiakkaalle. Ohjelman tulee kertoa myös kuinka paljon tuotteita on myös varastossa.
Simpy tarjoaa hyvät keinot simuloida yksinkertaisia varastointiprosesseja. Varasto-ajattelu voidaan käyttää moninaisissa mallinnuksissa, mutta aloitetaan ihan tavallisesta varastomallista: meillä on tuotanto, joka tuottaa yhdenlaista tavaraa varastoon omaan tahtiinsa ja myynti, joka sitten onnistuu myymään tuotteita satunnaiseen tahtiin. Helpotetaan asiaa vielä niin, että tuotetut tavarat ovat kappaletavaraa, joilla jokaisella on yksilöllinen sarjanumero.
Tarvitsemme siis kolme peruselementtiä simuloinnissa:
- tuontoprosessin, joka tuottaa tavaraa tasaiseen tahtiin varastoon
- varaston johon tavarat säilötään
- myyntiprosessin, joka ottaa tavarat varastosta.
Varasto toimii luonnollisesti FIFO-periaatteella (first in - first out).
Varaston luominen Simpy-ympäristöön on yksinkertaista: luonti tapahtuu
nimi = simpy.Store(env,capacity=n)
jossa nimi on varaston yksilöivä nimi, n on varaston kapasiteetti. Jos kapasiteetia ei määritetä, niin kapasiteettia on rajattomasti. Kun varastoon laitetaan jotain, sen tapahtuu
nimi.put(tuote) – metodilla
ja
nimi.get() –metodilla
saadaan seuraava otettavissa oleva tavara varastosta pois. Lisäksi käyttökelpoinen metodi on varastossa olevien tavaroiden lista, joka saada
nimi.items -metodilla.
Varastossa olevien tuotteiden määrä saadan siten
len(nimi.items) – funktiolla.
sitten voidaankin jo aloittaa koodaaminen.
Tuotettava tavara on yksinkertainen olio, jolla on vain sarjanumero. Luokkakuvauksen lisäksi tarvitaan vain metodi, jolla tavaran sarjanumero saadaan selville.
class Tavara: def __init__(self, sarjanumero): self.__sarjanumero = sarjanumero def get_sarjanumero(self): return self.__sarjanumero
Tuotanto on myös varsin selkeä prosessi. Jälleen kerran itse tuotanto on vain ajankuluttamista (esim. uusi tuote joka 5. ajanhetki) , minkä perään luodaan tavara luokkamäärrittelyn mukaisesti ja viedään tehty tavara varastoon. Kerrotaan vielä lopussa kuinka monta tavaraa varatossa on.
def tuotanto(env, varasto): i = 1 while True: tuotantoaika = 5 yield env.timeout(tuotantoaika) tavara = Tavara(i) varasto.put(tavara) print(env.now, 'Tuotanto toimitti tuotteen, sarjanumero',i,'varastoon') varastossa = len(varasto.items) print('Varastossa',varastossa,'yhteensä tavaraa') i=i+1
Myyti-prosessi on myös yksinkertainen. Satunnaiseen tahtiin (10-40) myynti myy satunnaisen määrän (1-5) tuotteita. Itse toimittaminen on tavaran noutamista varastosta:
tavara = yield varasto.get() – menetelmällä.
Tavara-muuttuja on nyt olio, josta luokkakuvauksen mukaan saamme tavara.get_sarjanumero() metodilla tietoon varastosta saadun tavaran sarjanumeron. Yield’iä tulee nyt käyttää, koska asiakkalle pitää toimittaa tavara, vaikka sitä ei varastossa juuri sillä hetkellä olisikaan. Yield’illä saadaan myyntiprosessi odottamaan, että tuotanto saa puuttuvat tavarat toimitettua varastoon.
def myynti(env, varasto): while True: myyntitahti = random.randint(10,40) myyntimaara = random.randint(1,5) yield env.timeout(myyntitahti) print(env.now,'Myynti myi', myyntimaara,' tuotetta') for i in range(myyntimaara): tavara = yield varasto.get() print(env.now, 'Toimitettiin tavara, sarjanumero',tavara.get_sarjanumero()) print('Kaikki tavarat toimitettu asiakkalle') varastossa = len(varasto.items) print('Varastossa',varastossa,'yhteensä tavaraa')
Lopuksi taas tutut asiat, sekä varaston luominen varasto=simpy.Store(env). Koska env.Store()'ssa ei ole käytetty capacity-parametria, varaston kapasiteetti on rajoittamaton. Mikäli kapasiteetti olisi rajattu ja tuotanto yrittäisi työntää täyteen varastoon tavaraa, ohjelma kyllä jatkaisi toimintaa, mutta ylimääräiset tavarat eivät jäisi varastoon, vaan ”valusivat” pois. Jos sen sijaan käyttäisimme varastoon panossa yield varasto.put(tavara) , niin tuotantoprosessi jäisi odottamaan, kunnes varastoon tulee tilaa ja siirtää tavaran vasta sitten varastoon.
env=simpy.Environment() varasto=simpy.Store(env) env.process(tuotanto(env,varasto) env.process(myynti(env,varasto)) env.run(until=50)
Koodi kokonaisuudessaan tässä:
import simpy import random class Tavara: def __init__(self, sarjanumero): self.__sarjanumero = sarjanumero def get_sarjanumero(self): return self.__sarjanumero def tuotanto(env, varasto): i = 1 while True: tuotantoaika = 5 yield env.timeout(tuotantoaika) tavara = Tavara(i) varasto.put(tavara) print(env.now, 'Tuotanto toimitti tuotteen, sarjanumero',i,'varastoon') varastossa = len(varasto.items) print('Varastossa',varastossa,'yhteensä tavaraa') i=i+1 def myynti(env, varasto): while True: myyntitahti = random.randint(10,40) myyntimaara = random.randint(1,5) yield env.timeout(myyntitahti) print(env.now,'Myynti myi', myyntimaara,' tuotetta') for i in range(myyntimaara): tavara = yield varasto.get() print(env.now, 'Toimitettiin tavara, sarjanumero',tavara.get_sarjanumero()) print('Kaikki tavarat toimitettu asiakkalle') varastossa = len(varasto.items) print('Varastossa',varastossa,'yhteensä tavaraa') env=simpy.Environment() varasto=simpy.Store(env) env.process(tuotanto(env,varasto)) env.process(myynti(env,varasto)) env.run(until=50)
Tulostus oli tällä kertaa tällainen:
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.py ========== 5 Tuotanto toimitti tuotteen, sarjanumero 1 varastoon Varastossa 1 yhteensä tavaraa 10 Tuotanto toimitti tuotteen, sarjanumero 2 varastoon Varastossa 2 yhteensä tavaraa 15 Tuotanto toimitti tuotteen, sarjanumero 3 varastoon Varastossa 3 yhteensä tavaraa 19 Myynti myi 2 tuotetta 19 Toimitettiin tavara, sarjanumero 1 19 Toimitettiin tavara, sarjanumero 2 Kaikki tavarat toimitettu asiakkalle Varastossa 1 yhteensä tavaraa 20 Tuotanto toimitti tuotteen, sarjanumero 4 varastoon Varastossa 2 yhteensä tavaraa 25 Tuotanto toimitti tuotteen, sarjanumero 5 varastoon Varastossa 3 yhteensä tavaraa 30 Tuotanto toimitti tuotteen, sarjanumero 6 varastoon Varastossa 4 yhteensä tavaraa 35 Tuotanto toimitti tuotteen, sarjanumero 7 varastoon Varastossa 5 yhteensä tavaraa 39 Myynti myi 2 tuotetta 39 Toimitettiin tavara, sarjanumero 3 39 Toimitettiin tavara, sarjanumero 4 Kaikki tavarat toimitettu asiakkalle Varastossa 3 yhteensä tavaraa 40 Tuotanto toimitti tuotteen, sarjanumero 8 varastoon Varastossa 4 yhteensä tavaraa 45 Tuotanto toimitti tuotteen, sarjanumero 9 varastoon Varastossa 5 yhteensä tavaraa
>>>