Portál AbcLinuxu, 8. května 2025 06:48
potřebuji napsat program, který mi rozhází semináře do skupin (kvůli rozvrhu), tak, aby si co nejvíc lidí mohlo zapsat všechno, jak potřebují, tzn, aby v jedné skupině nebyly dva semináře, které má někdo zapsané zároveň. Data mám v jako seznam seznamů (v pythonu zapsáno [[1,4,5,6],[9,8,5,6]]
, kde vnitřní seznamy představují data zapsaná jednotlivými uživateli). Neporadí někdo nějaký algoritmus, příp. hotové řešení či nápad, kde to hledat?
:- use_module(library(clpfd)). rozvrhni(Seminare, Zapsano, PocetSkupin) :- length(Seminare, PocetSeminaru), Seminare ins 1..PocetSeminaru, PocetSkupin in 0..PocetSeminaru, indomain(PocetSkupin), % pocet skupin postupne zvysujeme maplist(#>=(PocetSkupin), Seminare), % pocet skupin nebude prekrocen maplist(all_distinct, Zapsano), % nikdo nebude mit dva seminare % ve stejne skupine label(Seminare).Ve vašem konkrétním příkladě se predikát volá takto:
rozvrhni([X1, X4, X5, X6, X8, X9], [[X1,X4,X5,X6],[X9,X8,X5,X6]], PocetSkupin).
, kde první seznam obsahuje všechny semináře a druhý seznam jsou semináře jednotlivých uživatelů. První řešení vypadá takto:
X1 = 1, X4 = 2, X5 = 3, X6 = 4, X8 = 1, X9 = 2, PocetSkupin = 4Seminář X1 dáme do skupiny 1, X4 do skupiny 2, … a celkový počet skupin není vyšší než 4.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.