esemeny_moho.py
1    #-------------------------------------------------------------------------
2    # Eseménykiválasztási probléma
3    # MOHÓ ALGORITMUS
4    #
5    # Feladat:
6    # Valamely események egy közös eroforrást, például egy termet kívánnak
7    # használni. A teremben egy időben csak egy esemény folyhat.
8    # Egy esemény a kezdő és befejező indőpontja által adott (foglalas.txt).
9    # A cél a lehető legtöbb olyan eseménynek a kiválasztása,
10   # melyek nem ütik egymást!
11   #
12   #-------------------------------------------------------------------------
13   
14   fv=open('foglalas.txt','r')
15   h=[]        #ebben a listában tároljuk a kezdő és befejező időpontokat (k,b)
16   for sor in fv:
17       sor=sor.strip().split()         #a fájl egy sora --> lista
18       (k,b)=(int(sor[0]),int(sor[1])) #számpárok létrehozása
19       h.append((k,b))                 #h listába helyezése
20   fv.close()
21   
22   print('Rendezetlen eseménysorozat:\n', h)
23   
24   def befejezés_szerint(elem):
25       return elem[1]  #számpárban a második elemet jelenti
26   
27   #be kell rendezni a h listát a befejezési idők szerint
28   h=sorted(h,key=befejezés_szerint)
29   print('Rendezett eseménysorozat:\n', h)
30   
31   N=len(h)            #események száma
32   INTERVALLUMOK=[]
33   INDEX=[]
34   INDEX.append(0)     #mohó stratégia: az első esemény mehet a kiválasztások közé
35   INTERVALLUMOK.append(h[0])
36   i=0
37   for m in range(1,N):        #többi esemény ciklikus kiválasztása
38       if h[m][0]>=h[i][1]:    #ha adott esemény kezdőpontja >=már kiválasztott
39           INDEX.append(m)     #befejezési időpontjánál
40           INTERVALLUMOK.append(h[m])
41           i=m                 #m a kiválasztott esemény indexe,
42                                  #i=m miatt a következő cikluslépésben már ennek az
43                                  #eseménynek a végét nézzük
44   
45   print('Kiválasztott események indexei:\n', INDEX)
46   print('Kiválasztott események intervallumai:\n', INTERVALLUMOK)