Hello!
A következő feladathoz kérnék segítséget:
5x5-ös mátrix/tömb, benne számok 1<=x<=9, x egész
tudjuk soronként, oszloponként, átlónként a számok összegét, ennek függvényében kell a 25 számot meghatározni(legalább 1 megoldást)
A feladat időkorlátja sajnos 3 másodperc, ezért az egyenletrendszeres összes lehetőség előállítását nem tartom reálisnak(12 egyenlet, 25 ismeretlen; 9^(25-12) = 2541865828329 lehetőség). De talán mégis lehetne szűkíteni valahogy rajta.
Van valakinek ötlete? Részmegoldások is érdekelnek, valamilyen szintig már sikerült eljutnom.
csko
- 2129 megtekintés
Hozzászólások
csak tipp, de szerintem egy szolid backtracking belefer abba a 3 masodpercbe.
- A hozzászóláshoz be kell jelentkezni
ha SZTE-TTK algoritmusok kotprogi, akkor vsz hatizsak pakolas... akinek eddig talalkoztam a feladataval, mindenkinek az volt 8)
- A hozzászóláshoz be kell jelentkezni
azt hiszem, tudok egy megoldást.. :)
- A hozzászóláshoz be kell jelentkezni
Korlátprogramozás véges tartományon?
Szabad szoftverekkel, mint GNU Prolog vagy Alice + Gecode, vagy ha van licenc, SICStus Prologgal?
- A hozzászóláshoz be kell jelentkezni
jajmar az a szaros sicstus... ott az swi prolog a mainben mindehol.....
- A hozzászóláshoz be kell jelentkezni
Hoppá, nem is tudtam, hogy ebben is van FD constraint solver :-).
De mindig tanul az ember...
- A hozzászóláshoz be kell jelentkezni
vannak tesztadataid?
- A hozzászóláshoz be kell jelentkezni
Hm, kezdek álmos lenni.. amit a kollégák mondanak, finite-domain constraint programming, (fogalmam se volt eddig, hogy ezt így hívják) na azt kellene használni.
A lényege erre vonatkoztatva:
Egy cellára meg tudod mondani, hogy legalább és legfeljebb mekkora szám lehet ott. Soronként, oszloponként és átlónként is szűkíted a cellák lehetséges értéktartományait, majd a cellák közül kiválasztasz egy olyat, aminek a lehetséges felvehető értékeinek száma minimális az összes közül, (ha a minimális 1 darabot jelent, akkor az összes ilyet kiválasztod) éa beírod az értéket (ha mondjuk 4 és 6 között vehet fel értéket, akkor mondjuk 5-öt, de ezt most nem látom át, hogy nem mindegy-e). Majd újraszámolod az értéktartományokat, és így tovább. Ha valahol pedig ellentmondás keletkezne, akkor vissza kell lépni.
- A hozzászóláshoz be kell jelentkezni
Persze, amennyit csak akarsz.
Pl:
Sorösszegek:
1: 35
2: 31
3: 26
4: 20
5: 28
Oszlopösszegek:
1: 27
2: 16
3: 35
4: 29
5: 33
i=j átló: 26
i=4-j átló: 27
Egy esetnek több megoldása is lehet, nekem egy elég.
- A hozzászóláshoz be kell jelentkezni
mármint i=6-j, vagy pedig számozzuk 0-tól a sor- és oszlopösszegeket is :-)
- A hozzászóláshoz be kell jelentkezni
Nem tanulmányokhoz kötött feladat, hanem saját célkitűzés. Nincs megadva, hogy milyen nyelven csinálom meg.
- A hozzászóláshoz be kell jelentkezni
Üdv!
Nos, ez egy egészértékű (lineáris) programozási feladat.
javasolandó átírni 0 és 8 zárt intervallumbeli egészekre átírni a feladatot,
majd megoldani, mint egyenlőséges, nemnegatív LP megengedettségi feladatot.
mint egészértékű prog. feladat, szerintem lődd be BnB illetve CP algoritmusokra,
hogy ilyen méretre még jól működnek-e.
Illetve ha célfüggvényes LP-ként oldod meg, akkor célszerű minimalizálni a legnagyobb összegű sor és a legnagyobb összegű oszlop keresztezésében álló elemet, így kapsz rá egy alsó korlátot is rögtön.
ha ad hoc heurisztikát alkalmazol, akkor javasolt első lépésben az átlókra vonatkozó korlátozó feltételektől eltekinteni, hiszen arra van jó javítóheurisztika, ha a sor- és az oszlopösszegek stimmelnek egy megoldásnál, de az átlók még eltérnek.
Teljes esetleszámlálásnál is egy kerekített folytonos LP relaxáció megoldásából indulj ki, majd 25 egymásba ágyazott for ciklus során permutáld intelligensen a változókon végigfutó egész értékeket.
- A hozzászóláshoz be kell jelentkezni
Hello!
Kösz az ötleteket. Sajnos nem sikerült mindent felfognom, gondolom hiányosak az ismereteim ezen a téren. Az átlós dologra én is rájöttem, fel is írtam a lehetséges "mozgatásokat".
Jelenleg egy backtrack-szerű módszeren elmélkedek, valószínűleg nem lesz elég, és vegyíteni kell más technikákkal is.
csko
- A hozzászóláshoz be kell jelentkezni
Képlet folytonos esetre, elindulásképp:
a_{i,j} = (("i. sor összege" + "j. oszlop összege")/5) - ("minden elem összege"/25)
kerekíteni kell intelligensen a teljes esetleszámlálás esetén is, és ez egy jó kezdeti megoldás szolgáltat.
pl. a_{i,j} == 3,141592653589793238 esetén az alábbi sorrendben próbálkoznék:
(3;4;2;5;1;6;7;8;9)
de 3,6666 esetén már
(4;3;5;2;6;1;7;8;9)
értékekkel
- A hozzászóláshoz be kell jelentkezni
Valami hasonlóig jutottam el én is. A kezdeti felállás után a legkisebb különbségű szakasszal(sorral, oszloppal vagy átlóval) vagy a legnagyobbal kellene elindulni? Én a legkisebbre gondoltam.
Pl. sor1 összege 22, sor2 összege 20: sor1 "közelebb van" (5+45)/2=25-höz, ezért ott kezdeném a változtatásokat, persze a sor azon oszlopával, ahol a különbség az oszlopokra(esetleg átlókra) vonatkoztatva szintén minimális.
- A hozzászóláshoz be kell jelentkezni
nem szólnék bele, de logikai szita és visszalépés kombót próbáltad már?
- A hozzászóláshoz be kell jelentkezni
Még egy módszert sem próbáltam igazán, szóval nyitott vagyok bármire.
- A hozzászóláshoz be kell jelentkezni
itt elmondtak neked kb 4 algoritmust, ha nem tobbet,
mostmar probalkozza'.
- A hozzászóláshoz be kell jelentkezni
Jólvanna. Beteg voltam előző jópár napban.
- A hozzászóláshoz be kell jelentkezni
Örömmel jelentem, hogy sikerült megoldani a feladatot :)
Végül a megoldás a következőképpen nézett ki:
41 tömbbel indulok, mindegyik tartalmazza az 5..45 összeg összes lehetséges előállítást.
Tudom az 5 sor összegét, mindegyikbe berakom egyik véletlenszerű (5-jegyű) számot, ezzel teljesítem a sorok összegére vonatkozó feltételeket. Ezután megnézem, hogy mely oszlopösszegek nincsenek rendben, majd ezeket vízszintes cserékkel feloldom, már csak az átlók vannak hátra. Azokra is van módszer, lehet cserélgetni, átmozgatni.
A programom több helyen is "elakadhat", ekkor újrakezdi egészen a véletlen soroktól, de még így is sokszor 1mp alatt megvan a megoldás.
Köszönöm a segítséget.
- A hozzászóláshoz be kell jelentkezni