- <?php
- /** Komplex, szobabeosztást végző függvények
- * @package koliportal
- * @author Karakó Miklós <palacsint_X_freemail.hu>
- * @copyright Copyright © 2005, Karakó Miklós
- */
-
- /** függvények behúzása */
- (dirname(__FILE__) . "/../admin/inc_tabla_func.php");
- /** csoportkezelő-függvények behúzása */
- (dirname(__FILE__) . "/../lib/lib.groups.php");
-
- set_time_limit(3600);
-
- debug_clean_tables();
-
- /* FIXME: ha törlünk egy felhasználót, akkor a wishes táblában minden
- rá vonatkozó rekordot törölni kell */
-
- /*
- a $rooms -ban lévő szobákba megpróbálja bepakolni a $sid_list -ben
- lévő hallgatókat
- ha nincs $sid_list, akkor minden diákot bepakol
- */
- /** Hallgatók hozzárendelése a szobálhoz
- *
- * 1. lekérdezi a hallgatók kívánságait
- * 2. meghatározza a szobák férőhelyének maximumát és minimumát
- * 3. kiszűri a nem köcslönös kapcsolatokat a kívánságmátirxból
- * 4. kétfős csoportokat hoz létre,
- * 5. kiszűri az azonos csoportokat és sorrendez is
- * 6. nagyobb csoportokat is megpróbál létrehozni
- * 7. kiszűri az 1-1-et nem teljesítő csoportokat
- * 1-1-es jelölés: két diák egymást jelölte meg első helyen a kívánságlistájukban.
- * @see strip_not11_groups
- * 8. ismét törli a többszörösen jelenlévő csoportokat és sorrendez
- * 9. kiszámítja minden csoport pontszámát
- * 10. önellenőrzés
- * 11. a legnagyobb létszámú és legkisebb pontértékú csoportokat beosztja a szobákba
- *
- * @param array $rooms Szobalista tömbként
- * @param array $sid_list A bepakolandó hallgatói azonosítók listája,
- * vagy false ha mindenkire vonatkozik.
- */
- function assign_students_to_rooms($rooms, $sid_list = false, $stype)
- {
- show_log("Kívánságmátrix létrehozása");
- $table_full = $tw = get_wishes($sid_list);
- /* $table_full: a teljes kivánság-csúcsmátrixot fogja tartalmazni
- * $tw: ezen dolgozik a program
- */
-
- $students = $stl = get_students_from_wishlist($table_full);
-
- /* információk a szobákról */
- //$rooms = get_roomlist($room_list);
- $spacemax = get_rooms_spacemax($rooms);
- $spacemin = get_rooms_spacemin($rooms);
- show_log("Információgyűjtés a szobákról, spacemin: $spacemin, spacemax: $spacemax");
- /* QQQ: van ennek értelme? Ha minimum négy ágyas szobánk van, abban még
- vígan el lesz két ember. Nincs is sehol használva talán. */
-
- $n = debug_show_table("kezdetben...", $table_full, $students);
-
- /* csak a kölcsönös éleket hagyjuk meg */
-
- show_log("Nem kölcsönös kívánságok eldobása");
- $tw = drop_single_wishes($tw, $students);
-
- //debug_runtime("Csak kölcsönös élek meghagyása");
- $n = debug_show_table("Csak kölcsönös élekkel v2.0", $tw, $students);
- //echo "<p><br /><br />ret: $n</p>";
-
- /* kétfős csoportok létrehozása */
- show_log("Kétfős csoportok létrehozása");
- $groups = make_2groups($tw, $students, $stype);
- show_log(sprintf("Kétfős csoportok száma: %d", count($groups)));
-
- //debug_runtime("Kétfős csoportok létrehozva");
- //debug_echo("Kétfős csoportok száma: " . count($groups));
-
- show_log("Csoportok sorrendezése (névsor szerint)");
- $groups = sort_groups($groups);
- $groups = uniq_groups($groups);
-
- //debug_runtime("Kétfős UNIQ csoportok létrehozva");
- //debug_echo("Kétfős UNIQcsoportok száma: " . count($groups));
- //debug_show_groups($groups, false);
-
- /* többfős csoportok létrehozása */
- show_log("Többfős csoportok létrehozása");
- $groups = make_ngroups($groups, $table_full, $students, $spacemax);
- show_log(sprintf("Összes csoportok száma: %d db", count($groups)));
-
- //debug_runtime("Többfős csoportok létrehozva");
-
- $groups = sort_groups($groups);
- $groups = uniq_groups($groups);
- show_log(sprintf("Egyedi csoportok száma: %d db", count($groups)));
-
- //debug_echo("Összes csoport száma: " . count($groups));
- //debug_runtime("Csoportok sorrendezése");
- //debug_show_groups($groups);
-
- /* 1-1-et nem teljesítő csoportok kiszűrése */
- $groups = strip_not11_groups($groups, $table_full, $students, $stype);
- show_log(sprintf("1-1 feltételt is teljesítő csoportok száma: %d", count($groups)));
-
- //debug_runtime("Nem 11 csoportok kiszűrése");
- //debug_echo("Összes csoport száma: " . count($groups));
- //debug_show_groups($groups);
-
-
- // most jön az, hogy kitöröljük a többszörösen jelenlévő csoportokat
- // de előbb
- // sorbarendezzük a meglévők usereit
- // ezt sajna nem csinálja meg helyettünk az array_unique()
-
- $groups = sort_groups($groups);
- /* többször jelenlévő csoportok kiszűrése */
- $groups = uniq_groups($groups);
-
- //debug_runtime("uniq csoportok meghagyása");
- //debug_echo("Unique csoportok száma: " . count($groups));
- show_log(sprintf("Összes egyedi csoport száma: %d db", count($groups)));
-
-
- /* pontszámok számítása a csoportokhoz */
- $groups = calc_points($groups, $table_full);
- show_log("Ponszámok számítása, prioritási sor készítése");
-
- debug_show_groups($groups, false);
- //debug_echo("Megmaradt csoportok: " . count($groups));
- //debug_runtime("Pontok számítása");
- // leellenőrizzük, hogy jó-e a program...
- show_log("Önellenőrzés");
- debug_groups_selftest($groups, $table_full);
-
-
- /* a nagy csoportok bepakolásával kezdünk, fogjuk meg a könnyebb végén*/
- for ($i = $spacemax; $i >= 2; $i--)
- {
- //debug_echo("$i fős csoportok");
- show_log("$i fős csoportok beosztása szobákba");
- /* $spacemax -nál nagyobb csoportokkal nincs értelme foglalkozni,
- ezeket úgysem tudjuk berakni egy szobába sem - de elvileg
- ilyen csoportunk nem is létezik */
- $tg = groups_filter($groups, $i);
- show_log(sprintf("%d fős csoportok száma: %d", $i, count($tg)));
- $tr = room_filter_by_minspace($rooms, $i);
- //debug_echo(sprintf("tg: %s, tr: %s", count($tg), count($tr)));
- show_log(sprintf("%d szabad helyes szobák száma: %d", $i, count($tr)));
- /* FIXME: ha csak két fős csoportokat alakítok, de 4 fős szobák
- vannak, akkor baj van, ahhoz át kell alakítani ezt a kódrészletet
- get_next_room($space, $stype) !
- */
- while ((count($tg) > 0) && (count($tr) > 0))
- {
- reset($tg);
- list($tg_i, $tg_data) = each($tg);
-
- reset($tr);
- do {
- $ea = each($tr);
- if ($ea === false)
- {
- debug_echo("FIXME!");
- break 2;
- /* FIXME!! ilyenkor folytatni kellene a következő csoporttal
- ha töröljük ezt a csoportot, akkor nem vesztünk semmit,
- mert a következő (kisebb) csoportokban benne lehetnek ugyanazok
- a hallgatók, helyet viszont úgysem fogunk találni nekik eszerint
- a csoport szerint. A másik ok az, hogy ha kisebb csoportokban
- sincsenek benne, akkor sem kell nagyon aggódni, max a végén
- egyesével bepakoljuk őket valahova */
- }
- list($room_i, $room_data) = $ea;
- /* ha kevesebb hely, mint amennyire a csoport beleférne,
- akkor új szobát keresünk */
- } while (room_freespace($room_data["roomid"]) < count($tg_data["users"]));
-
- group_to_room($tg_data, $room_data);
-
- if ($room_data["space"] - count($tg_data) == 0)
- {
- unset($tr[$room_i]);
- unset($rooms[$room_i]);
- }
-
- if ($room_data["space"] - count($tg_data) < 0)
- { /* ez itt teljsen felesleges! FIXME */
- myerr("room_data['space'] - count(tg_data) < 0");
- }
-
- $groups = drop_groupslike($groups, $tg_data["users"]);
- $tg = drop_groupslike($tg, $tg_data["users"]);
- }
- }
-
-
- }
-
- /** Kívánságok nélkül maradt diákok beosztása szobákba
- *
- * @param array $rooms Szobalista
- * @param array $sid_list Hallgatói azonosítók listája
- */
- function assign_unassigned_students_to_rooms($rooms, $sid_list)
- {
- sort($sid_list);
- reset($sid_list);
-
- reset($rooms);
- while ((list($room_i, $room_data) = each($rooms)) && (count($sid_list) > 0))
- {
- $room_id = $room_data["roomid"];
- while ((room_freespace($room_id) > 0) && (count($sid_list) > 0))
- {
- list($sidx, $sid) = each($sid_list);
- // őket is berakjuk a maradék helyekre
- szobaba_tesz($room_id, $sid);
- unset($sid_list[$sidx]);
- reset($sid_list);
- }
- }
- }
-
- ?>