phpDocumentor koliportal
[ class tree: koliportal ] [ index: koliportal ] [ all elements ]

Source for file lib.assign.php

Documentation is available at lib.assign.php

  1. <?php
  2. /** Komplex, szobabeosztást végző függvények
  3. * @package koliportal
  4. * @author Karakó Miklós <palacsint_X_freemail.hu>
  5. * @copyright Copyright &copy; 2005, Karakó Miklós
  6. */
  7.  
  8. /** függvények behúzása */
  9. (dirname(__FILE__) . "/../admin/inc_tabla_func.php");
  10. /** csoportkezelő-függvények behúzása */
  11. (dirname(__FILE__) . "/../lib/lib.groups.php");
  12. set_time_limit(3600);
  13. debug_clean_tables();
  14. /* FIXME: ha törlünk egy felhasználót, akkor a wishes táblában minden
  15. rá vonatkozó rekordot törölni kell */
  16. /*
  17. a $rooms -ban lévő szobákba megpróbálja bepakolni a $sid_list -ben
  18. lévő hallgatókat
  19. ha nincs $sid_list, akkor minden diákot bepakol
  20. */
  21. /** Hallgatók hozzárendelése a szobálhoz
  22. *
  23. * 1. lekérdezi a hallgatók kívánságait
  24. * 2. meghatározza a szobák férőhelyének maximumát és minimumát
  25. * 3. kiszűri a nem köcslönös kapcsolatokat a kívánságmátirxból
  26. * 4. kétfős csoportokat hoz létre,
  27. * 5. kiszűri az azonos csoportokat és sorrendez is
  28. * 6. nagyobb csoportokat is megpróbál létrehozni
  29. * 7. kiszűri az 1-1-et nem teljesítő csoportokat
  30. * 1-1-es jelölés: két diák egymást jelölte meg első helyen a kívánságlistájukban.
  31. * @see strip_not11_groups
  32. * 8. ismét törli a többszörösen jelenlévő csoportokat és sorrendez
  33. * 9. kiszámítja minden csoport pontszámát
  34. * 10. önellenőrzés
  35. * 11. a legnagyobb létszámú és legkisebb pontértékú csoportokat beosztja a szobákba
  36. *
  37. * @param array $rooms Szobalista tömbként
  38. * @param array $sid_list A bepakolandó hallgatói azonosítók listája,
  39. * vagy false ha mindenkire vonatkozik.
  40. */
  41. function assign_students_to_rooms($rooms, $sid_list = false, $stype)
  42. {
  43. show_log("Kívánságmátrix létrehozása");
  44. $table_full = $tw = get_wishes($sid_list);
  45. /* $table_full: a teljes kivánság-csúcsmátrixot fogja tartalmazni
  46. * $tw: ezen dolgozik a program
  47. */
  48. $students = $stl = get_students_from_wishlist($table_full);
  49. /* információk a szobákról */
  50. //$rooms = get_roomlist($room_list);
  51. $spacemax = get_rooms_spacemax($rooms);
  52. $spacemin = get_rooms_spacemin($rooms);
  53. show_log("Információgyűjtés a szobákról, spacemin: $spacemin, spacemax: $spacemax");
  54. /* QQQ: van ennek értelme? Ha minimum négy ágyas szobánk van, abban még
  55. vígan el lesz két ember. Nincs is sehol használva talán. */
  56. $n = debug_show_table("kezdetben...", $table_full, $students);
  57. /* csak a kölcsönös éleket hagyjuk meg */
  58. show_log("Nem kölcsönös kívánságok eldobása");
  59. $tw = drop_single_wishes($tw, $students);
  60. //debug_runtime("Csak kölcsönös élek meghagyása");
  61. $n = debug_show_table("Csak kölcsönös élekkel v2.0", $tw, $students);
  62. //echo "<p><br /><br />ret: $n</p>";
  63. /* kétfős csoportok létrehozása */
  64. show_log("Kétfős csoportok létrehozása");
  65. $groups = make_2groups($tw, $students, $stype);
  66. show_log(sprintf("Kétfős csoportok száma: %d", count($groups)));
  67. //debug_runtime("Kétfős csoportok létrehozva");
  68. //debug_echo("Kétfős csoportok száma: " . count($groups));
  69. show_log("Csoportok sorrendezése (névsor szerint)");
  70. $groups = sort_groups($groups);
  71. $groups = uniq_groups($groups);
  72.  
  73. //debug_runtime("Kétfős UNIQ csoportok létrehozva");
  74. //debug_echo("Kétfős UNIQcsoportok száma: " . count($groups));
  75. //debug_show_groups($groups, false);
  76. /* többfős csoportok létrehozása */
  77. show_log("Többfős csoportok létrehozása");
  78. $groups = make_ngroups($groups, $table_full, $students, $spacemax);
  79. show_log(sprintf("Összes csoportok száma: %d db", count($groups)));
  80. //debug_runtime("Többfős csoportok létrehozva");
  81. $groups = sort_groups($groups);
  82. $groups = uniq_groups($groups);
  83. show_log(sprintf("Egyedi csoportok száma: %d db", count($groups)));
  84.  
  85. //debug_echo("Összes csoport száma: " . count($groups));
  86. //debug_runtime("Csoportok sorrendezése");
  87. //debug_show_groups($groups);
  88. /* 1-1-et nem teljesítő csoportok kiszűrése */
  89. $groups = strip_not11_groups($groups, $table_full, $students, $stype);
  90. show_log(sprintf("1-1 feltételt is teljesítő csoportok száma: %d", count($groups)));
  91. //debug_runtime("Nem 11 csoportok kiszűrése");
  92. //debug_echo("Összes csoport száma: " . count($groups));
  93. //debug_show_groups($groups);
  94. // most jön az, hogy kitöröljük a többszörösen jelenlévő csoportokat
  95. // de előbb
  96. // sorbarendezzük a meglévők usereit
  97. // ezt sajna nem csinálja meg helyettünk az array_unique()
  98. $groups = sort_groups($groups);
  99. /* többször jelenlévő csoportok kiszűrése */
  100. $groups = uniq_groups($groups);
  101. //debug_runtime("uniq csoportok meghagyása");
  102. //debug_echo("Unique csoportok száma: " . count($groups));
  103. show_log(sprintf("Összes egyedi csoport száma: %d db", count($groups)));
  104. /* pontszámok számítása a csoportokhoz */
  105. $groups = calc_points($groups, $table_full);
  106. show_log("Ponszámok számítása, prioritási sor készítése");
  107. debug_show_groups($groups, false);
  108. //debug_echo("Megmaradt csoportok: " . count($groups));
  109. //debug_runtime("Pontok számítása");
  110. // leellenőrizzük, hogy jó-e a program...
  111. show_log("Önellenőrzés");
  112. debug_groups_selftest($groups, $table_full);
  113.  
  114. /* a nagy csoportok bepakolásával kezdünk, fogjuk meg a könnyebb végén*/
  115. for ($i = $spacemax; $i >= 2; $i--)
  116. {
  117. //debug_echo("$i fős csoportok");
  118. show_log("$i fős csoportok beosztása szobákba");
  119. /* $spacemax -nál nagyobb csoportokkal nincs értelme foglalkozni,
  120. ezeket úgysem tudjuk berakni egy szobába sem - de elvileg
  121. ilyen csoportunk nem is létezik */
  122. $tg = groups_filter($groups, $i);
  123. show_log(sprintf("%d fős csoportok száma: %d", $i, count($tg)));
  124. $tr = room_filter_by_minspace($rooms, $i);
  125. //debug_echo(sprintf("tg: %s, tr: %s", count($tg), count($tr)));
  126. show_log(sprintf("%d szabad helyes szobák száma: %d", $i, count($tr)));
  127. /* FIXME: ha csak két fős csoportokat alakítok, de 4 fős szobák
  128. vannak, akkor baj van, ahhoz át kell alakítani ezt a kódrészletet
  129. get_next_room($space, $stype) !
  130. */
  131. while ((count($tg) > 0) && (count($tr) > 0))
  132. {
  133. reset($tg);
  134. list($tg_i, $tg_data) = each($tg);
  135. reset($tr);
  136. do {
  137. $ea = each($tr);
  138. if ($ea === false)
  139. {
  140. debug_echo("FIXME!");
  141. break 2;
  142. /* FIXME!! ilyenkor folytatni kellene a következő csoporttal
  143. ha töröljük ezt a csoportot, akkor nem vesztünk semmit,
  144. mert a következő (kisebb) csoportokban benne lehetnek ugyanazok
  145. a hallgatók, helyet viszont úgysem fogunk találni nekik eszerint
  146. a csoport szerint. A másik ok az, hogy ha kisebb csoportokban
  147. sincsenek benne, akkor sem kell nagyon aggódni, max a végén
  148. egyesével bepakoljuk őket valahova */
  149. }
  150. list($room_i, $room_data) = $ea;
  151. /* ha kevesebb hely, mint amennyire a csoport beleférne,
  152. akkor új szobát keresünk */
  153. } while (room_freespace($room_data["roomid"]) < count($tg_data["users"]));
  154. group_to_room($tg_data, $room_data);
  155.  
  156. if ($room_data["space"] - count($tg_data) == 0)
  157. {
  158. unset($tr[$room_i]);
  159. unset($rooms[$room_i]);
  160. }
  161. if ($room_data["space"] - count($tg_data) < 0)
  162. { /* ez itt teljsen felesleges! FIXME */
  163. myerr("room_data['space'] - count(tg_data) < 0");
  164. }
  165. $groups = drop_groupslike($groups, $tg_data["users"]);
  166. $tg = drop_groupslike($tg, $tg_data["users"]);
  167. }
  168. }
  169.  
  170. }
  171. /** Kívánságok nélkül maradt diákok beosztása szobákba
  172. *
  173. * @param array $rooms Szobalista
  174. * @param array $sid_list Hallgatói azonosítók listája
  175. */
  176. function assign_unassigned_students_to_rooms($rooms, $sid_list)
  177. {
  178. sort($sid_list);
  179. reset($sid_list);
  180. reset($rooms);
  181. while ((list($room_i, $room_data) = each($rooms)) && (count($sid_list) > 0))
  182. {
  183. $room_id = $room_data["roomid"];
  184. while ((room_freespace($room_id) > 0) && (count($sid_list) > 0))
  185. {
  186. list($sidx, $sid) = each($sid_list);
  187. // őket is berakjuk a maradék helyekre
  188. szobaba_tesz($room_id, $sid);
  189. unset($sid_list[$sidx]);
  190. reset($sid_list);
  191. }
  192. }
  193. }
  194.  
  195. ?>

Documentation generated on Wed, 18 May 2005 19:24:33 +0200 by phpDocumentor 1.3.0RC3