Simpy - Store

Wikikirjastosta

Kappale 5 – Store[muokkaa | muokkaa wikitekstiä]

Tehtä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:

  1. tuontoprosessin, joka tuottaa tavaraa tasaiseen tahtiin varastoon
  2. varaston johon tavarat säilötään
  3. 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

>>>