Döntéstámogatási rendszer felhasználói esetek. Ez inkább a programozók számára készült a ReszveteliDemokraciaTerv melléklete, nem felhasználói példák. Hamvasg írjál a ReszveteliDemokraciaTarsadalmiFa oldalra!
Felterjesztés:
Pontosan milyen feltételeknek kell teljesülniük ahhoz, hogy egy pontozás ami egy csomópont alatt elindult, felkerüljön az egyel magasabb csomóponthoz és így szélesebb réteg is pontozhassa a kérdést?
- Pontozás még nem zárult le
- ezzel igazából itt nem kell foglalkozni. A pontozás "lezárása" csak egy javaslat, hogy meddig kéne pontozni. A pontozások listázásakor természetesen elõre kerülnek a még le nem zárt pontozások, amikre az adott illetõ még nem pontozott. Hátrébb kerülnek a lezártak, amiket még nem pontozott. Leghátra (normál esetben akár rejtve) a lezártak, amikre már pontozott.
- Pontozások átlaga nagyobb a felterjesztési küszöbszámnál
- ami eleinte 50 pont lesz. A kapott összpontszám > az adott csomópont alatti összes felhasználó * 50
- legalább a csomópontban lévő tagok fele pontozott. a legfontosabb pontozás a felterjesztés, a többi minősítés. (ami itt fontos , fönt érdektelen is lehet.) itt elég az igen nem lehetőség, egyszerű többség esetén felmegy.
- ez szerintem nem érdekes ebben a formában, mert úgyis a fenti feltétel, a felterjesztési küszöbpontszám nem a szavazatot leadókra vonatkozik, hanem az adott csomópont alatti összes felhasználó számát kell szorozni vele !
- A megbízott külön funkcióban azonnal továbbíthatja (ha ezt rosszul teszi leváltják vagy türelemmel viselik a felsőbb szinten) azért is választjuk hogy nekünk ne kelljen mindenre figyelni. Belátása vagy saját megegyezésük szerint teszi szavazásra. A többiek kivárják a szavazást vagy a megbízott fenti lehetőségét.
- Ha nem él előjogával: itt a csomópont megbízott szavazata súlyozottan eshet latba, ha valaki nem pontozott. Ha mindenki pontoz, akkor az ő szavazat ugyanannyit ér, mint a többieké.eddig rendben döntetlent a megbízott dönt el, amúgy ha a szvazás fontos érje el hogy szavazzanak. Ahányan az alá tartozó cs.pontban nem pontoztak, annyiszorosára nő az ő pontozásának a súlya. de ez maximum 2 szintedik hatványa lehet. Tehát első szinten maximum 2 az elsőn, azaz 2-szeres, de 6. szinten már 64-szeres is lehet a súlya (ha legalább ennyien nem pontoztak alatta).
- Ezt a magasabb súlyt egyelore felejtsük el.
- Tehát a megbízott felterjesztheti a csoport megkérdezése nélkül is. Természetesen azt is megteheti, hogy figyeli az aktívak pontozását és az alapján dönt. Nem egyedileg, hanem az összesítést látja. Hogy eddig mennyien pontoztak, és milyen átlag jött ki.
- A megbízott többféleképpen lehet ügyetlen: 1) minden vackot felterjeszt. 2) gyakran elõfordul, hogy nem terjeszti fel azt, amit az alatta levõk fontosnak találnak, és ezért az alul levõknek állandóan be kell avatkozni 3) nincsenek önálló javaslatai. A megbízottaktól általában elvárja a társaság, hogy ne csak alulról jövõ dolgokat bíráljon, hanem néha önálló indítványai is legyenek (amiket vehet máshonnan, a forrás megjelölésével).
- Az kerül felterjesztésre, amit vagy a csomópont alattiak kollektíve fel akarnak terjeszteni, vagy amit a megbízottjuk felterjeszt. Más nem. Pont. Nincs "alvó szint" definiálva. Nem bonyolítjuk értelmetlenül, már így is túl bonyolult. Ha valaki fontosnak tartja, egyéb ágon ill.megbízotton keresztül úgyis megpróbálja felterjeszteni (és ha arra érdemes, jó eséllyel sikerül neki).
- Természetesen egy megbízott dönthet úgy, hogy a közvetlenül alatta levõ megbízottak véleményét veszi csak figyelembe, és a sokkal alatta levõk véleményét figyelmen kívül hagyja. De nem blokkolhat le egy indítványt, ha a részfa alatt levõk felterjeszteni kívánják, akkor fel lesz terjesztve. Pont ebben tér el a képviseleti demokráciától képest. Aki képviseleti demokráciát akar építeni (ami szintén hierarchikus egyébként, pl. miniszterelnök, miniszter, államtitkár, bizottsági tag, sima képviselõ stb...), az tegye az arra való helyen.
- állandó minősítések is lehetnek, fontosság (kötelező, ajánlott, tájékoztató, szórakoztató) , kategória stb , hogy rendszerezhetők legyenek. az információk minden ágát ezen lehet áramoltatni, ami nagy és sokféle információ kezelést jelent.
A rendszer webes verziója
megtekinthető itt: http://ftfc.hu/cell/drendszer/
letölthető becsomagolt fájlok (szabad felhasználásra):
v1.2: http://ftfc.hu/cell/drendszer12.rar 2008. 12. 13
v1.1: http://ftfc.hu/cell/drendszer11.rar 2008. 11. 28
v1.0: http://ftfc.hu/cell/drendszer.rar 2008. 11. 26
legutóbbi, v1.2 változatban működik a node osztódás, és a pontozások. Tisztelettel kéretik tesztelni és hibákat, észrevételeket jelezni
(NODEOSZTÓDÁS a fuggvenyek.php-ben)
Minden táblában új rekord keletkezése egy-egy felhasználói esethez kapcsolódik. Figyelem: a Node osztódása a legfontosabb, azt kell megérteni. Semmilyen más módon nem növekedhet a szintek száma. Bár a Node osztódása bekövetkezhet felhasználó csatlakozása után, nem ismételjük meg a lépéseket, csak utalunk rá (ill. meghívjuk a függvényt).
Ha megvannak a create-ek, akkor cell csinál kipróbált INSERT-eket meg UPDATE-eket MINDEN esethez.
Új fa létrehozása - egyelõre kézzel, adatbázis insert is megteszi.
- Tree rekord
- minden fa létrehozásakor automatikusan
1. létrejön annak gyökérnodja, a node táblába új sor:
(treeid adott, parentnodeid=0, level=1, megbízott user=aki létrehozta). Azért 1 a level, mert ennek a node-nak a szinje most 1 és mindig az is marad (legfeljebb a node osztódása során kerül felé új node level=2 -vel)
2. branches táblába új sor
(userid, treeid adott, nodeid az 1. lépésben beszúrt új node nodeid-ja)
User regisztráció:
- új user rekord
- A forest (más néven branches) táblában tárolódik, hogy egy user egy adott fában melyik node alá tartozik
User csatlakozása fához (fázik ;-)
- user becsatlakozása egy node alá (mondjuk az adott fában az utoljára létrehozott level=1 node alá, ezt akár le lehet kérdezni: select max(nodeid) where level=1 and treeid=...): a node szintje level=1 kell legyen. Ez a becsatlakozás nincs egybevonva a user regisztrációval, hanem külön lépés (pl. mert több fa alá is csatlakozhat!): új Forest (vagy más néven branches) rekord. minden mezõ benne van, amit javasoltál (kivéve a branchid, ami nem is kell, szerintem).
- branches táblába új sor (userid, treeid adott, nodeid a max(nodeid) where level=1
- ha ezzel túlnõ a node (sok a user where nodeid=this), akkor a Node osztódása (külön lépés, LÁSD FELTETELESNODEOSZTODAS LENT)
a branches-ben minden user mindig level=1 szintű node-hoz tartozik (ami a legalacsonyabb szint. A gyökér a legmagasabb, pl level=7, persze annyi amennyi)
ha még nincs node a fában... ILYEN SOHA NINCS. A Fa node-al jön létre
megkeressük a fában a legkorábban létrejött olyan level=1 node-ot amely alatti userek száma kisebb, mint 15 ($maxbrother) NEM keresünk ilyet ! Vagy a select max(nodeid) where level=1 and treeid=... vagy a felhasználó megadja a nodeid-t és csak leellenõrizzük, hogy a nodeid level=1 stimmel-e.
Új pontozás leírása (scoring description):
- szöveges paraméterek kitöltése
Új aspect megadása
- szöveges paraméterek kitöltése
- lehet URI, de itt általában a szöveges paraméter elég magyarázat kell legyen. Talán az URI inkább kiegíszítés, szemléltetés, és/vagy hangosan felolvassa a szöveget
Új pontozás elindítása (scoringinit)
Annak a node-nak az idje kerül bele automatikusan, amelyik csomópont alatt ő közvetlenül áll, (5-15 társával együtt) ? Lényegében igen.
scoringinit.nodeid : az adja meg, aki inditja. Csak olyan node-ot adhat meg, amely node-nak o maga a node.user-id-ja, vagy amely node-nak közvetlen gyereke (a forest táblában).
A "felhívás pontozásra" után felvett új aspect nem számít majd abban a pontozásban.
Valami egyszeru attributumot felveszunk erre. Pl aspect-hez idobelyeg, meg a felhívás pontozásra is idobelyeg. De egyelore mindegy. Ebben a fázisban nem foglalkozunk ezekkel a speci esetekkel. Lesz még jó pár ilyen.
Pontozás (scoring)
- pont megjegyzése vagy megváltoztatása (le nem zárt pontozás esetén)
Szavazás lezárása
- ha EndDate elérkezett, vagy ha mindenki szavazott
Felterjesztés
- ha a felterjesztési pontszám megvan, akkor a szavazás lezárása elõtt is fel lehet terjeszteni
Pont kiszámítása adott pontozási esetre adott node-hoz:
- figyelembe vesszük az adott pontozásra adott node alatti összes user által leadott összes pontot (átlagoljuk)
- a figyelembe vett node (level=0) halmaz rekurzívan számítható ki, annyi lépésben, amennyi a node szintje. A halmazt növesztjük mindig az alant levõ nodeokkal: insert into nodeset select node.nodeid from node n1, nodeset n2 where n1.level=2 and n1.parentnodeid=n2.nodeid ahol a level=.. persze minden lépésben csökken.
- késõbb: a node-hoz tartozó megbízott 3x-os súllyal szerepel (ha szavazott), de maximum akkora súllyal, amennyi az alatta levõ nem szavazók száma
Pontozások listázása:
- összes nyitott pontozás
- összes lezárt vagy felterjesztéssel végzõdött pontozás
- pontosan egy adott node-hoz tartozó
- adott node feletti összes node-hoz tartozó
- mindegyik szavazást elég csak a legmagasabb szinten megjeleníteni, ameddig feljutott. Lentebbi szinteken ismételten megjeleníteni általában nem praktikus.
Fa kirajzolása (majd...) pl. jgraph-al.
Egyelõre az egy fában levõ összes usert ki kellene írni (soronként egy felhasználó) a felette található összes parent-tel:
user5 (levél) node5_user9 node13_user77 ... node0_user782
(minden sorban az utolsó természetesen a gyökérnode és az ahhoz tartozó user).
Majd ezen a listázáson finomítunk, hogy csak adott node alattiakat írja ki (a teljes fa igen nagy is lehet).
Megbízott választása
Ez a pontozás kiírására és a pontozásra hasonlít, de valamennyire speciális, mert ez folyamatosan fennálló pontozás, nem kell külön kiírni.
- Bármelyik felhasználó
- akármelyik felette elhelyezkedő node csomópontra (vagy csak úgy általánosan, ha nodeid=-1)
- bármikor leadhat új ("aktualizált") pontozást
- bármelyik, felhasználóra
- mellyel lényegében sorba rendezi a felhasználókat (hogy kit szeretne leginkább megbízottként látni)
- A rendszer csak a node alatt közvetlenül elhelyezkedő gyereknode-hoz tartozó felhasználókra leadott pontokat veszi figyelembe !!! A megbízott csak ezek közül kerülhet ki.
- más (nem közvetlenül a node alatti node-hoz tartozó) F felhasználóra azért adható le pontozás (amit a rendszer jelezhet, hogy adott csomópontra jelenleg nem kerül figyelembevételre), hogy ha F felkerül, akkor ne kelljen (feleslegesen) pontozást újra leadni. A legtöbb felhasználó nem fog csomópontonként külön pontozást megadni (bár arra lehetősége van), hanem egy (nodeid=-1 "általános") sorrendet fog felállítani. Ez jobban érthető, könnyebben magyarázható, és könnyebben leprogramozható: kevesebb a felesleges/értelmetlen megkötés. Nem nehéz mindig azt figyelembe venni, akik épp közvetlenül az adott csomópont alatt vannak.
- jelezzük, ha a "jelöltek" közül nem adott meg pontot legalább 4-hez (négyre sokszor szükség lesz a munkacsoportok miatt).
- a pontozás szintenként külön kell legyen, tehát akit megválasztottak első helyen az egy újabb szinten külön kell pontozza a már képviselői csoport tagságát (pl.:ha nem ismeri őket ne pontozzon). az érvényben lévő pontozásaim mindig láthatóak legyenek. Felhasználóként sorrendet akarok állítani, tehát első helyen benne bízom és így tovább akire nem szavazok azt számoljátok a csoportmaximummal.
- Mikor esik ki egy szintről valaki: ha alatta új embert választanak és neki az a legfölső szintje. ha az adott csoportnak ő a képviselője , tehát a szint benne bízik, akkor feljön a szintre az új bizalmi ember és az adott szinten kifejtheti hatását, (beletanul a feladatokba és kiharcolja a bizalmat magának.)
Megbízottak sorrendi pontozása
Minden megadhat N db (preferrált) jelöltet, és mindegyikhez egy valós számot (ez N különbözõ számot jelent), ami a köztük felállított sorrendet jelképezi. A sorrend az adott fára érvényes. (másik fára eltérõ sorrendet adhat meg - természetesen). A felhasználó általa kívánt számot adhat meg, de a rendszert már nem érdeklik maguk a megadott számok, csak azok sorrendjét veszi figyelembe.
Megjegyzések:
- Mivel az emberek magasabb pontszámhoz jobb teljesítményt gondolnak, a magasabb jelenti a preferráltat, az elokelobb helyet !
- azért muszáj mysql adatbázisban tárolni, mert a felhasználó tudja ezt szerkesztgetni, módosítgatni
- A felhasználó nem tud olyat megadni, hogy ugyanazon fában N1 csomóponthoz J-t preferrálja K-val szemben, N2 csomópontban pedig K-t preferrálja J-vel szemben. Más fákban persze tud.
- A megbízottakra leadott pontozásokat anonymizáljuk, és közkinccsé tesszük (nyíltan publikáljuk).
- Az anonymizálás úgy zajlik, hogy a 'ki' (aki leadta a voksot) mezot kicsereljuk hash('ki', salt) -ra. így (neki titkosan a salt megmutatásával) mindenki elott tudjuk igazolni, hogy a szavazatát beszámítottuk, de más nem tudja, hogy mire szavazott. Ezáltal a szavazás nyilvánosan auditálhatóvá válik. A mai technika mellett normálisan semmilyen szavazás és adózás nem folytatható olyan módon, ami a nyilvános auditot nem teszi lehetõvé!
- A Schulze feldolgozás és a végeredmény már nem PHP-ben készül, hanem C-ben. Mi kiszámítjuk, aláírjuk és kitesszük a végeredményt, de egyébként az anonymizált adatokon bárki maga is futtathatja a Schulze-t.
PreferredCandidates
- treeid
- userid
- candidateuserid
- double higherpreferred (a magasabb a jobban preferrált)
- salt (text, tipikusan kb 32 char, de max 120 char)
Szerintem a "salt" -ot is beletehetjük ebbe a táblába. (bár ez kis redundancia, mert alighanem egyezni fog ott, ahol a treeid, userid mezõk egyeznek. De majd ahogy kitöltjük. Javaslom az sha1 hash függvényt (nem md5-öt).
Állíthassunk fel sorrendet legalább 15 db candidateuser között. Aztán késõbb eldöntjük, kell-e több. De az adatbázist nem korlátozzuk elõre.
Sorrendi pontozás három esetet vizsgálva
I. a felhasználó nem csomópontfelelős
- az 1. szintű node id meghatározása, ami alá tartozik
- ehhez a node-hoz csatlakozott felhasználók kiírása, mellettük üres mező, ahová valós értékeket adhat meg, ezzel sorrendet állít fel
- unjumble táblába új sor userid aki épp pontoz, orderednodeid=node id, place1 mezőbe kerül a legnagyobb értéket kapott user id-je, place15-be a legkisebb
II. a felhasználó valamely csomópont megbízottja
- az x. szintű node id meghatározása, ami alá tartozik
- x+1 szintű parentnode id meghatározása
- ugyanahhoz a parentnode-hoz tartozó x. szintű brothernode-ok aktuális megbízottjainak kiírása (node táblából), sorrend megadás céljából
- unjumble táblába új sor userid aki épp pontoz, orderednodeid=parentnode id, place1 mezőbe kerül a legnagyobb értéket kapott user id-je, place15-be a legkisebb
III. a felhasználó a gyökér csomópont megbízottja
- nem állíthat fel sorrendet
Minden új sorrendfelállítás értékelést von maga után. NEM. Csak kb. heti egy anonymizálás, publikálás és kiértékelés történik.
I. 1. vagy akármilyen szintû node esetén TELJESEN FELESLEGES külön venni az 1. szintû node-ot és a magasabb szintût. Minden node-ra ki kell számítani a megbízottat. Esetleg annyit lehet tenni, hogy mindegyik node-ra külön publikáljuk az anonymizált adatokat, és a salt is szintenként más lesz, pl hash( ki, salt, level)
- unjumble táblából megkeressük a szóban forgó node-hoz megadott sorrendeket, és egy (még kidolgozandó) eljárással, megállapítjuk az új megbízott kilétét
- módosítás a node táblában, az adott node-hoz új megbízott (lehet, hogy marad a régi)
- 1. Mi lesz a kegyvesztett sorsa?
- Semmi. Tovább már nem lesz megbízott. A megbízottat nem töröljük alulról, mint levél végig megmarad (addig is, amíg megbízott). Ezért aztán semmit sem kell tenni, amikor a megbizatásának vége
- 2. Az az x-1. szintű node, ahonnan felkerült az új megbízott így megbízott nélkül marad.
- nincs semmiféle felkerülés. A node-hoz új megbízottat rendelt a banda. Pont. A megbízott továbbra is megbízott maradhat lentebb is. És mindig tag (levél) marad az alsó szinten.
FELTETELESNODEOSZTODAS: Ha a nodeid paraméterrel megadott node (aminek szintje mondjuk level=x) túlnõ, azaz a gyerekei száma meghaladja a megengedett maximumot (ami praktikusan a függvény paramétere):
- level=1 esetén select count(*) from user where nodeid=this
- level>1 esetén select count(*) from node where parentnodeid=this
akkor
- létrejön egy új "testvér" node.(level=x szintén)
- a régi node gyerekeinek fele az új testvér-node alá kerül
- level=1 esetén 8 gyerek user ide, 8 gyerek user az új testvér node alá
- level>1 esetén 8 gyerek node ide, 8 gyerek node az új testvér node alá (parentnodeid átírása). A felezés egyelõre mondjuk nodeid szerint (késõbb esetleg kézzel kiválasztható lesz)
- ha eddig gyökérben voltunk, vagyis parentnodeid=0, akkor létrehozunk új gyökér-node-ot (level=x+1) és a régi és az új node parentnodeid-je az új gyökérnode lesz.
- ha van parent node, azaz: parentnodeid==p !=0 akkor az új testvérnode is parentnodeid=p alá/értékkel jön létre (ezért testvér).
- Ezután ellenõrizni kell a p szülõ node-ot, hogy ott szükségessé vált-e az osztódás. (ugyanezt a FELTETELESNODEOSZTODAS függvényt meghívni nodeid=p-re).
Node osztódása