Guest User

Untitled

a guest
Feb 17th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.95 KB | None | 0 0
  1. #All rights reserved by Nicolas Menet
  2. #Before use please ask kindly
  3.  
  4. from enum import Enum
  5.  
  6. class Fachart(Enum):
  7. Nichts = 0
  8. Anwendung_der_MathematikA = 1
  9. Anwendung_der_MathematikC = 2
  10. InformatikA = 3
  11. InformatikC = 4
  12. PhysikA = 5
  13. PhysikC = 6
  14. ChemieA = 7
  15. ChemieC = 8
  16. BiologieA = 9
  17. BiologieC = 10
  18. EnglischB = 11
  19. FranzoesischB = 12
  20. DeutschB = 13
  21. LateinB = 14
  22. SpanischB = 15
  23.  
  24.  
  25.  
  26. class Schueler:
  27.  
  28. def __init__(self, name, pkas: list, pkbs: list, pkcs: list):#Three object lists for the different PK(Fachart)
  29. self.name = name
  30. self.pksoptions = []
  31. self.pksoptions.append(pkas)
  32. self.pksoptions.append(pkbs)
  33. self.pksoptions.append(pkcs)
  34. self.pks = []
  35. self.pks.append(Fachart.Nichts)#PKA
  36. self.pks.append(Fachart.Nichts)#PKB
  37. self.pks.append(Fachart.Nichts)#PKC
  38.  
  39.  
  40. class Fach:
  41.  
  42. def __init__(self, fachart:Fachart, mindest_zahl:int, maximal_zahl:int):
  43. self.name = str(fachart.value)
  44. self.art = fachart
  45. self.mindest_zahl = mindest_zahl
  46. self.maximal_zahl = maximal_zahl
  47. self.zahl = 0
  48.  
  49. class Stundenplan:
  50.  
  51. def get_Fach_by_Fachart(self,fachart):
  52. for fach in self.faecher:
  53. if fach.art == fachart:
  54. return fach
  55. raise 'Fach mit dieser Fachart existiert nicht'
  56.  
  57. def __init__(self):
  58. self.faecher = []
  59. self.schueler = []
  60. self.problem_faecher_zuviel = []
  61. self.problem_faecher_zuwenig = []
  62. self.problem_schueler_zuviel = []
  63.  
  64.  
  65. def add_Fach(self, fachart:Fachart, mindest_zahl:int, maximal_zahl:int):
  66. self.faecher.append(Fach(fachart,mindest_zahl,maximal_zahl))
  67.  
  68. def add_Schueler(self, name, pka: list, pkb: list, pkc: list):
  69. self.schueler.append(Schueler(name,pka,pkb,pkc))
  70.  
  71.  
  72. def fuege_schueler_fach_hinzu(self,schueler,fachart,pkabc):#pkabc: 0-> PKA, 1-> PKB, 2-> PKC
  73. for fach in self.faecher:
  74.  
  75.  
  76. if fach.art == fachart:
  77. pk_fach = fach
  78. if pk_fach.maximal_zahl > pk_fach.zahl:
  79. pk_fach.zahl += 1
  80. schueler.pks[pkabc] = fachart
  81. return True
  82. else:
  83. return False
  84. return False #Falls Fach schon entfernt wurde
  85.  
  86. #PKA
  87. def schueler_umverteilen(self,schueler,methode,pkabc): #Methode 0:Unterfüllte 2. Wahl, Methode 1: 2. Wahl, Methode 2: Untefüllte 3. Wahl, Methode 3: 3. Wahl
  88. if methode == 0:
  89. for pfzw in self.problem_faecher_zuwenig:
  90. if schueler.pksoptions[pkabc][1] == pfzw:#Student, welcher im Überfüllten Fach ist, jedoch ein unterfülltes Fach auffüllen könnte (2. Wahl)
  91. self.fuege_schueler_fach_hinzu(schueler,pfzw,pkabc)
  92. return pfzw
  93.  
  94. if methode == 1:
  95. if self.fuege_schueler_fach_hinzu(schueler,schueler.pksoptions[pkabc][1],pkabc):#Student, welcher im Überfüllten Fach ist, jedoch die 2. Wahl noch frei ist
  96. return schueler.pksoptions[pkabc][1]
  97.  
  98. if methode == 2:
  99. for pfzw in self.problem_faecher_zuwenig:#Student, welcher im Überfüllten Fach ist und sein zweites Fach auch überfüllt ist, jedoch die 3. Wahl
  100. if schueler.pksoptions[pkabc][2] == pfzw:
  101. self.fuege_schueler_fach_hinzu(schueler,pfzw,pkabc)
  102. return pfzw
  103. if methode == 3:
  104. if self.fuege_schueler_fach_hinzu(schueler,schueler.pksoptions[pkabc][2],pkabc):
  105. return schueler.pksoptions[pkabc][2]
  106.  
  107. return Fachart.Nichts
  108.  
  109. def optimiere_pk(self,pkabc):
  110. #Optimiere PKA/PKB/PKC
  111. for schueler in self.schueler:
  112. if not self.fuege_schueler_fach_hinzu(schueler,schueler.pksoptions[pkabc][0],pkabc):
  113. self.problem_faecher_zuviel.append(schueler.pksoptions[pkabc][0])
  114. self.problem_schueler_zuviel.append(schueler)
  115. #Welche Fächer sind problematisch
  116. for fach in self.faecher:
  117. if fach.mindest_zahl > fach.zahl:
  118. self.problem_faecher_zuwenig.append(fach)
  119.  
  120. #Fülle Fächer mit 1. Methode
  121. for schueler in self.problem_schueler_zuviel:
  122. fach = self.schueler_umverteilen(schueler,0,pkabc)
  123. if fach != Fachart.Nichts:
  124. fach = self.get_Fach_by_Fachart(fach)
  125. self.problem_schueler_zuviel.remove(schueler)
  126. if fach.mindest_zahl <= fach.zahl:
  127. self.problem_faecher_zuwenig.remove(fach)
  128. #Fülle Fächer mit 2. Methode
  129. for schueler in self.problem_schueler_zuviel:
  130. fach = self.schueler_umverteilen(schueler,1,pkabc)
  131. if fach != Fachart.Nichts:
  132. fach = self.get_Fach_by_Fachart(fach)
  133. self.problem_schueler_zuviel.remove(schueler)
  134. if fach.mindest_zahl <= fach.zahl:
  135. self.problem_faecher_zuwenig.remove(fach)
  136. #Fülle Fächer mit 3. Methode
  137. for schueler in self.problem_schueler_zuviel:
  138. fach = self.schueler_umverteilen(schueler,2,pkabc)
  139. if fach != Fachart.Nichts:
  140. fach = self.get_Fach_by_Fachart(fach)
  141. self.problem_schueler_zuviel.remove(schueler)
  142. if fach.mindest_zahl <= fach.zahl:
  143. self.problem_faecher_zuwenig.remove(fach)
  144. #Fülle Fächer mit 4. Methode
  145. for schueler in self.problem_schueler_zuviel:
  146. fach = self.schueler_umverteilen(schueler,3,pkabc)
  147. if fach != Fachart.Nichts:
  148. fach = self.get_Fach_by_Fachart(fach)
  149. self.problem_schueler_zuviel.remove(schueler)
  150. if fach.mindest_zahl <= fach.zahl:
  151. self.problem_faecher_zuwenig.remove(fach)
  152.  
  153. def optimiere(self):
  154. #Probiere alle ins Lieblingsfach
  155. print([fach.name for fach in self.faecher])
  156. self.optimiere_pk(0)#PKA
  157. self.optimiere_pk(1)#PKB
  158. self.optimiere_pk(2)#PKC
  159. for fach in self.faecher:
  160. if fach.mindest_zahl > fach.zahl:
  161. self.faecher.remove(fach)
  162. print('Fachart ' + fach.name + ' kann nicht durchgeführt werden, leider haben sich zu wenige Schüler dafür angemeldet')
  163. #Entferne Schüler von Fächer -> Neu initialisierung
  164. for fach in self.faecher:
  165. fach.zahl = 0
  166. self.optimiere()#Neue Optimierung
  167.  
  168. stpln = Stundenplan()
  169.  
  170. stpln.add_Fach(Fachart.Anwendung_der_MathematikA,10,20)
  171. stpln.add_Fach(Fachart.Anwendung_der_MathematikC,10,20)
  172. stpln.add_Fach(Fachart.InformatikA,10,20)
  173. stpln.add_Fach(Fachart.InformatikC,10,20)
  174. stpln.add_Fach(Fachart.PhysikA,10,20)
  175. stpln.add_Fach(Fachart.PhysikC,10,20)
  176. stpln.add_Fach(Fachart.ChemieA,10,20)
  177. stpln.add_Fach(Fachart.ChemieC,10,20)
  178. stpln.add_Fach(Fachart.BiologieA,10,20)
  179. stpln.add_Fach(Fachart.BiologieC,10,20)
  180. stpln.add_Fach(Fachart.EnglischB,10,20)
  181. stpln.add_Fach(Fachart.FranzoesischB,10,20)
  182. stpln.add_Fach(Fachart.DeutschB,10,20)
  183. stpln.add_Fach(Fachart.LateinB,10,20)
  184. stpln.add_Fach(Fachart.SpanischB,10,20)
  185.  
  186. stpln.add_Schueler('Nicolas Menet',[Fachart.Anwendung_der_MathematikA,Fachart.InformatikA,Fachart.PhysikA],[Fachart.DeutschB,Fachart.EnglischB,Fachart.LateinB],[Fachart.Anwendung_der_MathematikC,Fachart.BiologieC,Fachart.ChemieC])
  187.  
  188.  
  189.  
  190.  
  191. stpln.optimiere()
Add Comment
Please, Sign In to add comment