Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
SVEUČILIŠTE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
V A R A Ž D I N Lovro Predovan Automatizirano pregovaranje o rasporedu
u višeagentnoj okolini
ZAVRŠNI RAD
Varaždin, 2014.
SVEUČILIŠTE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
V A R A Ž D I N
Lovro Predovan Matični broj: 40075/11–R
Studij: Informacijski sustavi
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini
ZAVRŠNI RAD
Mentor:
Doc.dr.sc. Markus Schatten
Varaždin, rujan 2014.
I
Sadržaj 1. Uvod ...................................................................................................................................... 1 2. Teorijska razrada ................................................................................................................... 4
2.1. Višeagentni pristup problemu ......................................................................................... 4 2.2. Pregovaranje i postizanje dogovora ................................................................................ 6
3. Automatizirano pregovaranje i postizanje dogovora ............................................................. 7 3.1. Komunikacijski protokol ................................................................................................ 7 3.2. Strategija pregovaranja ................................................................................................... 8
3.2.1. Formalna definicija problema organiziranja sastanka automatiziranim pregovaranjem .................................................................................................................. 10 3.2.2. Strategija ponuda ................................................................................................... 11 3.2.3. Strategija vremenske opredijeljenosti ................................................................... 12
4. Implementacija višeagentnog sustava ................................................................................. 13 4.1. SPADE platforma ......................................................................................................... 13 4.2. Google Kalendar usluga .............................................................................................. 14 4.3. Agent organizator i agenti klijenti ................................................................................ 17
4.3.1. Agent organizator .................................................................................................. 17 Unos vremena za održavanje sastanka ......................................................................... 17 Slanje prijedloga o terminu sastanka klijentima .......................................................... 18 Pronalazak najboljeg termina za sastanak .................................................................... 19
4.3.2. Agenti klijenti ........................................................................................................ 20 Inicijalizacija agenata klijenata .................................................................................... 20 Evaluacija slobodnih termina iz Google Kalendara klijenta ........................................ 21
5. Primjer korištenja ................................................................................................................ 24 6. Osvrt .................................................................................................................................... 28 7. Zaključak ............................................................................................................................. 29 9. Prilog 1. - Programski kod aplikacije .................................................................................. 32
9.1. Agent organizator ......................................................................................................... 32 9.2. Agent klijent ................................................................................................................. 36 9.3. Komunikacija s Google Calendar API-em ................................................................... 41
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
1
1. Uvod Namjera i ideja koje stoje iza ovog završnog rada je osmisliti te izraditi višeagentni sustav
koji će se temeljiti na međusobnoj komunikaciji agenata i koji će uz pomoć prikupljenih
podataka iz rasporeda donositi odluke. Naglasak biti na komunikaciji čiji bi rezultat trebao
biti postizanje dogovora oko zajedničkog termina sastanka između agenata koji bi u realnom
svijetu trebali zastupati stvarne osobe.
U vrijeme istraživanja za ova rad u svijetu postoje popularni slični sustavi za
dogovaranje sastanka ali oni se uglavnom temelje na činjenicama da korisnik sam mora
zaključiti i donijeti odluku kad mu sastanak odgovara a aplikacije mu u tome pomažu jedino s
grafičkim prikazom slobodnih termina što u nekim prilikama može biti sasvim u redu no ne
ukoliko želimo to automatizirati i podići na višu razinu. Za sad svi potencijalno korisni alati
koji se bave ovom tematikom su još uvijek u razvoju u akademskoj zajednici.
Pri samoj izradi namjera je stvoriti simuliranu okolinu od pet agenata koji će međusobno moći
komunicirati te na temelju algoritama donositi odluku o prihvaćanju ili odbijanju termina
nekog sastanka. Postojat će jedan agent kojeg se može okarakterizirati kao glavni agent,
inicijator sastanka to jest (tj.) agent organizator te ostali agenti koji su sudionici sastanka tj.
klijenti. Osnovne zamisli i postavke sustava su da sustav bude dinamičan odnosno da svaki
agent bude autonoman, samostalan i da donosi odluku za sebe te potom glavnom agentu koji
pokreće cijelu temu, u ovom slučaju sastanak, objavi svoju odluku.
Glavna motivacija za ovakav pristup problemu je članak ( Macho, Torrens, Faltings
2001) gdje je ukazana mogućnost sličnog principa planiranja s drugom tehnologijom i
primjenom programskog jezika JAVA i JCL biblioteke i njenih algoritama čiju će ulogu ovom
radu preuzeti Python i SPADE-a. U tom radu predstavljena je osnovna arhitektura
višeagentnog sustava koja će biti prilagođena potrebama i idejama koje će biti iznesene
kasnije u radu. Arhitektura se može vidjeti na slici 1.
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
2
Slika 1: Arhitektura višeagentnog sustava s 3 vrste agenata Izvor: (Macho ,Torrens ,Faltings
2001) str 4.
Iz arhitekture se može vidjeti da postoji više vrsta agenata, odnosno agent organizator i
agenti koji pregovaraju s njim , tj. agenti klijenti, te agenti koji prikupljaju podatke od API-
a(engl. Application Programming Interface) . Metoda koja je predstavljena u članku koristi
otvorene API-e za dohvaćanje slobodnog smještaja i avionskih letova. Znanstvenici su svom
radu nastojali postići zadovoljenja ograničenja te su donosili odluku temeljem kombinacije
uvjeta slobodnog vremena u kalendaru, dostupnih letova, vremena sastanka i niza drugih
parametara te su se pojavljivale tri situacije odnosno da postoji jedno, niti jedno ili više
mogućih rješenja ovisno o razni odstupanja koju postavili kao parametar. No njihovo rješenje
ovog sustava koliko god se činilo idealnim nije bilo dinamično, odnosno radili su s
ograničenim skupom podataka te je radilo relativno sporo jer je agentu klijentu dugo trebalo
da sam donese odluku.
Također kao inspiracija pri odabiru pravog algoritma i protokola izmjene poruka među
agentima je korišten rad (Crawford, Veloso 2004) u kojem je napravljena usporedba tri
najučestalije strategije pri pregovaranju agenata oko rasporeda te dan osvrt na nedostatke i
prednosti pojedinih pristupa. Iz tog rada zaključeno je da je najbolje prilikom implementacije
koristiti pristup otvorenog pregovarača a u ovom radu će biti korištena jednostavnija varijanta
tog pristupa.
Ti radovi su poslužili kao polazna točka u istraživanju i primjeni koncepata
automatiziranog pregovaranja u višeagentnoj okolini. U radu će biti predstavljena i
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
3
jednostavna implementacija višeagentnog pregovaranja. Agent organizator će predlagati
granice vremenskih intervala i trajanje događaja, a agenti klijenti će provjeravati svoj
raspored, preferencije i na temelju tih slati povratne informacije odnosno može li taj agent
prisustvovati tom događaju.
Ukratko, kroz rad će biti predstavljena teorijska pozadina problema uz usporedbu s
osnovnim postavkama višeagentnih sustava, bit će razrađena domena problema i model
rješenja te implementacija u programskim jezicima Python1 uz pomoć programskog modula
SPADE2 te API-a Google Kalendar usluge .
1 Preuzeto sa : http://www.python.org , 05.08.2014 2 Smart Python multi-Agent Development Environment peuzeto sa : https://pypi.python.org/pypi/SPADE , 05.08.2014
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
4
2. Teorijska razrada
Ideja koja stoji iza ovog višeagentnog sustava je izrada okoline u kojoj će više agenata moći
pregovarati i na temelju svojih personaliziranih rasporeda prihvaćati ponuđene termine
sastanka ili ih odbijati. Sama problematika, odnosno dogovaranje sastanka nije trivijalna tema
zbog činjenice da postoji cijeli niz faktora koji mogu utjecati na donošenje konačne odluke .
Niz faktora, odnosno uvjeta se može dodatno zakomplicirati ukoliko dodamo korisničke želje,
preferencije i afinitete zbog čega ćemo u samom početku morati postaviti niz pretpostavki
ukoliko želimo da konačni rezultat bude protumačen kako treba. (Sindhu, Wahid, Purohit
2011)
U ovom poglavlju naglasak će biti stavljen na samu teoriju agenata i višeagentnih
sustava kako bi smo u drugom dijelu razrade mogli bolje definirati pojam postizanje dogovora
o rasporedu, definirati varijable, ograničenja i domene koji oblikuju naš problem i uklopiti ga
u višeagentni pristup.
2.1. Višeagentni pristup problemu
Višeagentni pristup bilo kojem problemu nije trivijalan zbog same činjenice da su agenti još
uvijek apstraktan pojam te se na njihovo postojanje i djelovanje može gledati s različitih
stajališta i područja znanosti poput umjetne inteligencije, ekonomije, teorije sustava, teorije
igara, sociologije, psihologije i mnogih drugih. (Schatten 2013)
Sama definicija agenta kao osnovne jedinice svakog višeagentnog sustava prema (Wooldridge
2002) glasi :
Agent je računalni sustav koji je smješten u neku okolinu te je sposoban autonomno obavljati
zadatke u okolini kako bi ispunio svoju svrhu
Agenti funkcioniraju u ne-determinističkoj okolini te trebaju pokrivati široki spektar
mogućnosti, imati sposobnost odlučivanja i rješavanja problema. Također agenti predstavljaju
razinu apstrakcije više od dosad poznatih koncepata u programiranju poput klasa i mogu im se
pripisati neka svojstva koja nisu svojstvena računalima. Primjerice pojedinog agenta možemo
opisati i kroz skup njegovih želja i težnja što ih čini još kompleksnijim za implementirati. U
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
5
ovom radu želje i težnje su predstavljene kao blokirana ili rezervirana vremena odnosno
vremena u kojima agent ne želi da ga se ometa jer primjerice odmara, čita novine, bavi se
sportom, zabavlja se i slične akcije koje su dio svakodnevice jednog agenta.
Naspram pojedinog agenta, višeagentni sustavi (engl. Multi-agent system - MAS) su
sustavi koji se sastoje od niza agenata u međusobnoj interakciji koji se ponašaju u skladu s
ciljevima i motivima korisnika koje zastupaju. Za uspješno funkcioniranje višeagentne
okoline treba razmotriti i riješiti probleme poput suradnje, koordinacije, pregovaranja agenata
te mnogih drugih socioloških fenomena. U stanju su utjecati na okolinu u kojem se nalaze,
imaju različite sfere utjecaja i povezani su kroz organizacijske ili društvene mreže (Schatten
2013.)
Višeagentni sustavi se još i spominju kao samoorganizirajući sustavi koji imaju težnju
pronalaska najboljeg mogućeg rješenja, odnosno udruživanja kako bi se mogli lakše riješiti
problemi koji nisu trivijalni te ih je samostalno gotovo nemoguće riješiti. (Jakelić 2013)
Pri izradi višeagentnog sustava za pregovaranje (engl. Multi-agent meeting scheduling
problem - MAMS prema (Crawford,Veloso 2004)) i donošenje odluke o sastanku trebat će
svaki od ovih aspekata uzeti u obzir i razmotriti njegovu ulogu u arhitekturi budućeg sustav.
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
6
2.2. Pregovaranje i postizanje dogovora
Pregovaranje i postizanje dogovora načelno su dva veoma različita pojma, postizanje
dogovora uključuje pregovaranje ali pregovaranje ne mora uključivati i postizanje dogovora.
Prema (The negotiation experts 2014) pregovaranje je:
Interaktivni proces između dvije ili više stranaka koje traže zajednički interes o nekom pitanju
ili pitanjima od zajedničkog interesa ili spora kako bi pronašli uzajamno prihvatljiv sporazum
koji će biti poštovan od strane svih uključenih sudionika.
Postizanje dogovora prema (The negotiation experts 2014) prema definiciji znači :
Organizirati događaje prema utvrđenom redu ili poziciji.
Pregovaranje samo po sebi nema puno smisla bez postizanja dogovora premda je i takav
ishod moguć. Ipak takve situacije u kojima je dogovor nemoguć se ubrajaju u ekstremne
situacije te je u većini slučajeva moguće pronaći dogovor na obostranu korist. Svako
pregovaranje u višeagentnim sustavima mora imati zadovoljene sljedeće kriterije. Prilikom
interakcije mora postojat protokol kojeg će se agenti držati i koji će određivati i redoslijed
razmjene poruka i strategiju samog agenta. Svaka interakcija pregovaranja ima četiri osnovne
komponente :
1. Skup mogućih ponuda agenta moderatora drugim agentima
2. Protokol , odnosno pravila redoslijeda razmjene poruka i formata
3. Strategije pregovaranja, svaki agent može imati implementiranu sebi svojstvenu
strategiju pregovaranja
4. Pravilo dogovora, definira pod kojim uvjetima se može smatrati da je dogovor
postignut
Svaki agent reagira na ponude pomoću odabrane strategije, algoritama te zadovoljenja
nekih specifičnih uvjeta, odnosno ograničenja. Ta ograničenja su uzrok različitim
taktikama pregovaranja koje se mogu dijeliti na vremenski uvjetovane ili uvjetovane
resursima, dok je u slučaju pregovaranja oko rasporeda vrijeme resurs s kojim
raspolažemo stoga se radi o taktici uvjetovanoj resursima. (Agnetis 2011)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
7
3. Automatizirano pregovaranje i postizanje dogovora
3.1. Komunikacijski protokol Okolina koja je stvorena za svrhe ovog rada se sastoji od skupa agenata koji imaju isti
protokol za međusobnu komunikaciju i evaluaciju sadržaja poruka dok agent organizator
jedini ima drukčiju strukturu. Prilikom izrade protokola trebalo je voditi brigu o tome da ga
prilagodimo što većem skupu mogućih stanja i situacija no da u isto vrijeme rutina bude dobro
definirana i razumljiva (Wainer, Ferreira, Constantino 2007) .
Protokol ima tri osnovna koraka i korak potvrde uspješnosti te iako ne pruža neke
sofisticirane principe i okolnosti pod kojima ljudi mogu djelovati ipak omogućava izradu
fleksibilnog algoritma za dogovaranje sastanaka. Omogućava postojanje središnjeg elementa,
odnosno organizatora dok sami klijenti imaju određen utjecaj na cijeli proces nuđenjem
ponuda termina ili obznanjivanjem organizatoru da nisu slobodni unutar nekog termina.
Agenti nisu u potpunosti spremni za suradnju te nekad iako imaju slobodan raspored
mogu odbiti prijedlog za sastanak. Protokol koji agenti slijede izgleda ovako :
1. Agent organizator predlaže granice intervala za termin sastanka i trajanje sastanka te
šalje poruku agentima klijentima. Sam raspored klijenta organizatora nam nije
dostupan no pretpostavit ćemo da ukoliko predlaže neki vremenski termin da je
svjestan svojih obaveza te da smatra da će ga moći pohoditi.
2. Agenti klijenti primaju poruku te traže sva lokalna rješenje odnosno kontaktiraju
Google Kalendar uslugu. U zadanom vremenskom rasponu kreira se pomični
vremenski raspon duljine trajanja sastanka te iterira kroz zadane granice intervala
sastanka. Provjerava se postoji li presjek između vremenskih termina koje pojedini
agent korisnik ne preferira i predloženog termina. Preferencije su vremenski okviri koje
korisnik ne želi staviti na raspolaganje i za svakog agenta su različito raspoređene u
drugi vremenski okvir ovisno o samom rasporedu agenta. Ako presjek postoji termin se
označava kao blokiran odnosno rezerviran. U suprotnom, kontaktira se Google
kalendar i provjerava da li je termin slobodan te ukoliko je upisuje se u listu rješenja,
odnosno slobodnih termina koja će biti vraćena agentu organizatoru. Nakon što agent
nađe najbliži vremenski okvir koji mu odgovara šalje poruku agentu organizatoru.
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
8
Također moguća je i situacija u kojoj agent u svom dnevnom rasporedu ne može
pronaći dovoljno velik slobodan vremenski okvir i u tom slučaju javlja agentu
organizatoru da danas nije slobodan odnosno vraća praznu listu.
3. Agent organizator prima poruke statusu ponude termina. Pokreće se evaluacija termina
odnosno broji se kojem terminu odgovara koliki broj agenata te čim taj broj dosegne
maksimalan broj agenata proces se prekida te se dobiva rješenje odnosno najraniji
termin u kojem mogu prisustvovati svi agenti. Nakon potvrde se upisuje termin
sastanka u raspored te se dodaju ostali agenti kao posjetitelji tom događaju u Google
kalendaru. Na ovaj način Google kalendar svih korisnika se automatski ažurira i nema
potrebe da svaki korisnik posebno kreira isti događaj. Nakon uspješno izvršenog
upisivanja u kalendar i slanja pozivnica šalje se poruka o gašenju ostalim agentima.
Ukoliko evaluacija nije dala rješenje, ponavlja se točka pod brojem 1
4. Agenti klijenti primaju poruke o gašenju i gase se
Algoritam se ponavlja sve dok zadovoljavajuće rješenje nije postignuto ili dok nije
prepoznato da se sastanak ne može održati u predloženom danu u tom slučaju od korisnika se
očekuje da predloži novi termin ili završi rad s aplikacijom .
3.2. Strategija pregovaranja
Sam odabir strategije pregovaranja je veoma osjetljiv posao jer postoji mnogo načina na koje
se može pregovarati i postići cilj odnosno dogovor. Pitanje odabira strategije je ključno
pitanje koje stoji iza svakog rada u području pregovaranja agenata te kod opisivanja strategije
pregovaranja treba u obzir uzeti parametre kao što su : (Marinova 2002)
1. Vrijeme koje je u kontekstu ove aplikacije vrijeme postizanje dogovora je ograničeno
na 10 krugova pregovora. Agenti tada u zadanom vremenskom rasponu u istom
predloženom danu traže moguća rješenja. Ne želimo da agenti predugo traže moguća
rješenja jer bi to moglo izazvati devijacije u rasporedima pojedinih agenata i tako
utjecati na konačno rješenje i stabilnost implementacije.
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
9
2. Efikasnost znači da u idealnim uvjetima implementacija uvijek daje rješenje ili
obavijest da rješenje ne može biti pronađeno
3. Jednostavnost podrazumijeva da se algoritam temelji na jednostavnom modelu u
kojem agent organizator predlaže rješenje a agent klijent mu odgovara s povratnom
informacijom. Jednostavnim rješenjem se smatra ono prema kojem možemo naučiti
agenta da se po njemu ponaša i da daje rješenje u razumnom vremenskom okviru.
4. Stabilnost , stabilnim rješenjem se smatra ono koje je implementirano u sve agente i
koji prateći protokol dovode do najboljeg rješenja za sve agente.
Prije nego se razradi strategija pregovaranja valja napomenuti da strategija opisuje
definirani protokol te da se prilikom usklađivanja vremena i komunikacije agenata može javiti
neočekivani problem jer agenti se možda u nekom slučaju ne nalaze u istoj vremenskoj zoni.
U ovom radu naglasak neće biti na takve situacije te će svi agenti koristit isto vrijeme i
pretpostavit ćemo da se nalaze svi na istoj zemljopisnoj širini i dužini a kao vrijeme ćemo
uzeti GMT odnosno vrijeme na 0. meridijanu bez uzimanja ljetnog vremena u razmatranje.
Također vrijeme će biti oblikovano u RFC 3339 3vremenski format.
U ovom radu korištena je Heuristička strategija (Sen, Durfree 1998). Kao dio te
strategije mogu se izdvojiti još tri manje strategije.
Strategija objavljivanja rasporeda određuje kako će sastanak biti najavljen, uključuje
prijedlog vremenskog okvira. Razmatramo opcije koje smatramo najboljima, odnosno
najboljima iz perspektive organizatora rangiranih prema nekakvoj heuristici poput onoj koji je
vremenski okvir najraniji te promatramo koje opcije su dobre odnosno vremena koja preferira
sam organizator iz nekog razloga. U ovom radu zbog jednostavnosti implementacije sama
procjena i prijedlog vremena će biti ručno upisivan od strane korisnika kojeg zastupa agent
organizator. Strategija ponuda određuje koje će informacije klijenti slati natrag organizatoru na temelju
početne poruke organizatora. Razmatramo inicijalne opcije temeljene na preferencijama
klijenata i njihovih slobodnih vremena. Ova strategija će biti detaljnije objašnjena u poglavlju
3.2.2 .
3 više na https://www.ietf.org/rfc/rfc3339.txt
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
10
Strategija opredijeljenosti definira da kada se sastanak dogovori ili ako je kalendar već
popunjen u traženom vremenskom okviru, tada na njegovo mjesto ne može doći novi
sastanak. Također suprotno tome slobodni vremenski intervali nisu zaključani odnosno
opredijeljeni te na njihovo mjesto može doći novi sastanak odnosno događaj.
3.2.1. Formalna definicija problema organiziranja sastanka automatiziranim pregovaranjem
Raspored sastanaka se sastoji od skupine sastanaka za grupu osoba , odnosno agenata koji
prisustvuju sastanku. Možemo postaviti da imamo skup od 𝑛 sastanaka i 𝑘 sudionika, i
problem dogovaranja sastanka je izražen s 𝑆 = (𝐴,𝑀) gdje je 𝐴 = {1,2. . . 𝑘} skup sudionika i
𝑀 = {𝑚!,𝑚!, . . . ,𝑚!} odnosno skup sastanaka koji će biti dogovoreni.
Vremenski odsječak je predstavljen s datumom i satom kao parom < 𝐷,𝐻 > . Skup
povezanih vremenskih odsječaka se naziva vremenski interval. Sastanak 𝑖 je definiran
skupom: (Sen,Durfree 1998)
𝑚! = (𝐴! , ℎ! , 𝑙! , 𝑆! ,𝑎! ,𝑑! , 𝑓! , 𝑡!)
gdje je :
𝐴! ⊆ 𝐴 skup sudionika na sastanku;
ℎ! ⊆ 𝐴! sudionik koji organizira sastanak odnosno organizator;
𝑙! duljina sastanka u satima;
𝑆! sadrži skup mogućih vremena u kalendaru slobodnih za sastanak
𝑎! vrijeme u kojem ℎ! postaje svjestan potrebe za organizirati sastanak 𝑚!
𝑑! vremenski rok do kojega organizator ℎ! treba dogovoriti sastanak
𝑓! vrijeme u kojem je donesena konačna odluka može li se sastanak održati i ako može kada
će biti održan
t je vremenski interval u kojem je sastanak 𝑚! dogovoren i definiran skupom
{< 𝐷! ,𝐻! >,< 𝐷! ,𝐻! + 1 >, . . . ,< 𝐷! ,𝐻! + 𝑙! − 1 >}
gdje je 𝐷! datum a 𝐻! defnira sat za koji je sastanak 𝑚! dogovoren ako je to moguće a u
suprotnom iznosi ∅
Bilo koji algoritam koji rješava problem višeagentnog pregovaranja mora zadovoljiti svaki od
definiranih parametara te pri rješavanju trošiti resurse odnosno vrijeme i snositi
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
11
komunikacijske troškove stoga vrijeme provedeno računajući moguće vrijeme sastanka
možemo promatrati kao utrošeno.
3.2.2. Strategija ponuda Ukoliko postavimo da je 𝑡!! interval koji je predložio organizator za sastanak 𝑖 ostalim
klijentima i 𝑡!!" interval koji će biti vraćen od klijenata 𝑗 kao odgovor na prijedlog klijenta.
Neka 𝑡!"!"# = 𝑚𝑎𝑥(𝑡!!"),∀ 𝑗, 𝑗 ∈ (𝐴,−{ℎ}), opisuje najudaljenije vrijeme od predloženog
vremena koje je vratio klijent. Pretpostavljeno je da klijenti odgovaraju s najbližim intervalom
na koji mogu stići. Tako da najraniji interval koji bi organizator trebao predložiti je 𝑡!"!"# .
Ukoliko razmatramo strategiju potvrdnih i negativnih odgovora u kojem klijent odgovara
potvrdno ili ne potvrdno na predložena vremena u istom scenariju organizator ne zna kada
pozvanici imaju slobodna vremena u kalendarima stoga treba sekvencijalno propitivati
rasporede svih korisnika. Kako ovaj postupak baš i nije učinkovit, stoga postoji alternativa
koju možemo predočiti kao broj ušteđenih iteracija 𝐼! je jednak broju slobodnih intervala
duljine 𝑙! u kalendaru ℎ! u intervalu 𝐼! = [ 𝑡!!(1), 𝑡!!!"#(1)] , gdje 𝑡!(𝑖) prikazuje 𝑖 -ti
vremenski odsječak u intervalu 𝑡!. (Sen,Durfree 1998)
Neka 𝑛!! bude broj određenog vremenskog intervala duljine 𝑙! koji može biti smješten u
kalendar u intervalu 𝐼! . Neka 𝐼! bude nasumična varijable koja predstavlja sačuvane iteracije.
Tada vjerojatnost koja alternira strategiju će sačuvati 𝑗 iteracija u suprotnosti od obične da i ne
strategije i njena jednadžba je dana s izrazom :
𝑃!!(𝑗) = 𝑛!!,!"𝑗 𝑝!!,!!
! (1− 𝑝!!,!!) !!!,!" !!
Ova vjerojatnost slijedi binomnu distribuciju i ukupna ušteda iteracija bi na kraju se mogla
izraziti formulom. 𝐸[𝐼!] = 𝑛!!,!"𝑝!!,!!
Dakle što je manje događaja u kalendaru sudionika to je veća ušteda.
Ako računamo 𝑡!!" iz 𝑡!! neka 𝑆!!" bude nasumična varijabla koja predstavlja broj intervala
koji razmatra klijent 𝑗 kao odgovor na predloženo vrijeme 𝑡!! prije nego što je slobodan
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
12
interval i pronađen. Vjerojatnost da x intervala je pregledano prije nego je slobodan interval
pronađen je :
𝑃!!"#(𝑥) = 𝑝!!,!(1− 𝑃!!,!)!!!
3.2.3. Strategija vremenske opredijeljenosti Korisnici odnosno klijenti u rasporedima mogu imati tri različita stanja nekog vremenskog
okvira slobodno, zauzeto i rezervirano. Za procese 𝑀!" ,𝑀!" , 𝑥 ≠ 𝑦 u kojima sudjeluje 𝑗:
(Sen,Durfree 1998)
Mogući vremenski intervali :
∀𝑋,𝑌,𝑋 ∈ 𝑝!" , (∃𝑦,𝑌 ∈ 𝑝!") ,𝑋 ∩ 𝑌 ≠ 0
Ukoliko se su predloženi vremenski intervali koji se preklapaju za različite sastanke, tada
postoji vjerojatnost da će oba sastanka biti dogovorena u tim vremenskim intervalima i u tom
slučaju će jedan od ta dva procesa biti neuspješan, odnosno nije moguće dogovoriti dva
sastanka u istom vremenskom okviru.
Stvarni vremenski intervali :
∀𝑋,∃𝑌,𝑋 ∈ 𝑣!" , (∃𝑦,𝑌 ∈ 𝑟!") ,𝑋 ∩ 𝑌 ≠ 0
Ovaj scenarij odgovara slučaju u kojem zahtjev za sastankom 𝑚! dolazi u trenutku u kojem
sva vremena u kojima se sastanak može ili želi održati odgovaraju s već rezerviranim
vremenima u kalendaru, odnosno sva moguća vremena su zauzeta drugim sastancima 𝑚!. U
ovakvom slučaju procesi 𝑀!" i 𝑀!" se natječu za vremenski interval te to rezultira da
sastanak 𝑚! se ne može održati.
Prvenstvo vremenskog intervala :
∀𝑋,𝑌,𝑍,𝑋 ∈ 𝑣!" , (∃𝑦,𝑌 ∈ 𝑏!" ,𝑋 ∩ 𝑌 ≠ 0) ∧¬(∃𝑧,𝑍 ∈ 𝑟!" ,𝑋 ∩ 𝑌 ≠ 0 )
Ovaj scenarij odgovara slučaju u kojem zahtjev za sastankom 𝑚! dolazi u trenutku kada
postoji barem jedan mogući vremenski okvir s blokiranim vremenskim intervalom za neki
sastanak 𝑚! ali ne preklapa se s niti jednim zauzetim vremenom u kalendaru.
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
13
Ako je pak ∀𝑋,∃𝑌,𝑍,𝑋 ∈ 𝑣!" , (∃𝑦,𝑌 ∈ 𝑏!" ,𝑋 ∩ 𝑌 ≠ 0) ∧¬(∃𝑧,𝑍 ∈ 𝑟!" ,𝑋 ∩ 𝑌 ≠ 0 )
tada nije moguće ugovoriti sastanak 𝑚!, što utječe na postotak uspješnosti same strategije
dogovaranja sastanka. (Sen,Durfree 1998)
4. Implementacija višeagentnog sustava Višeagentni sustav se sastoji od pet agenata od kojih je jedan glavni agent organizator i ostali
su pomoćni odnosno agenti klijenti koji su u međusobnoj interakciji i razmjenjuju poruke te
zajedno čine arhitekturu višeagentnog sustava za pregovaranje i postizanje dogovora.
Implementacija se može u potpunosti pronaći i preuzeti na :
https://github.com/lpredova/Automated-multiagent-schedule-negotiation
4.1. SPADE platforma SPADE je platforma za izradu višeagentnih i organizacijskih sustava temeljena na
XMPP/Jabber tehnologiji trenutačne komunikacije i izrađena je u programskom jeziku
Python.
Priložena tehnologija sadrži skup klasa i metoda odnosno ponašanja (engl. Behaviour)
koja olakšava izradu višeagentnih sustava, u smislu da pruža gotovu radnu okolinu s
rješenjima za komunikaciju i izmjenu poruka među agentima dok je njihovo djelovanje u
potpunosti fleksibilno i prilagodljivo konačnim potrebama korisnika. (Jakelić 2013)
SPADE platforma je korištena zbog toga što postavlja temelje potrebne za izradu i
primjenu metode definirane u ovom radu. Na korištenje pruža potpunu podršku za izradu
agenata koji sadržavaju potrebne funkcionalnosti za uspješno izvođenje ovog rada. Također
pruža mogućnost korištenja Jabber protokola koji uvelike olakšava komunikaciju među
agentima.
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
14
4.2. Google Kalendar usluga
Google Kalendar besplatna usluga za uređivanje rasporeda i organizaciju vremena.
Zahvaljujući svom otvorenom API-u i metodama za dohvat podataka u ovom radu će biti
korištena kao izvor podataka iz rasporeda pojedinog korisnika.
Neka od pogodnih svojstava Google Kalendar usluge zbog kojih se ona koristi u ovom
radu su mogućnost manipulacije rasporedom preko API-a te mogućnost pozivanja ostalih
agenata da sudjeluju u nekom događaju. To znači da nije potrebno kreirati zasebni događaj za
svakog agenta već da je dovoljno kreirati jedan događaj i pozvati ostale agente a njihovi
rasporedi će se sami sinkronizirati i ažurirati u skladu s rezultatima implementacije.
Kako bi korisnik imao pristup Google kalendar usluzi potrebno je imati Google račun
odnosno imati svoj Google mail tj. Gmail. Za potrebe ovog završnog rada izrađena su četiri
agenta klijenta s sljedećim mail adresama:
Svakom od tih agenata je dodijeljen zaseban raspored koji je za svakog korisnika
jedinstven. Također svakom od korisnika su dodijeljeni neki parametri koji ga razlikuju od
drugih agenata poput identifikacijskih podataka za Google servise i Oauth2 autentifikaciju te
ne preferirani vremenski odsječci odnosno blokirana vremena u rasporedu koja agent želi
ostaviti slobodna za sebe. Inicijalni rasporedi agenata se mogu vidjeti na slikama 2,3,4 i 5.
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
15
Slika 2: Primjer rasporeda za agenta broj 1 s mail adresom [email protected] (Izvor: vlastita izrada)
Slika 3: Primjer rasporeda za agenta broj 2 s mail adresom [email protected] (Izvor: vlastita izrada)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
16
Slika 4: Primjer rasporeda za agenta broj 2 s mail adresom [email protected] (Izvor: vlastita izrada)
Slika 5: Primjer rasporeda za agenta broj 3 s mail adresom [email protected] (Izvor: vlastita izrada)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
17
4.3. Agent organizator i agenti klijenti U višeagentnom sustavu koji je izrađen za potrebe ovog rada razlikujemo dva tipa agenata,
odnosno agente klijente i agenta organizatora koji grade arhitekturu od ukupnog broja od pet
agenata. U nastavku ovog poglavlja bit će detaljnije opisani ključni dijelovi programskog
koda kojima je realiziran neki dio funkcionalnosti neke od naznačenih tipova agenata.
4.3.1. Agent organizator
Unos vremena za održavanje sastanka
Funkcionalnost kojom korisnik aplikacije postavlja vremenska ograničenja svom agentu koji
ga zastupa odnosno agentu organizatoru.
Korisnik zadaje početni trenutak i završni trenutak koji ograničavaju neki vremenski interval.
Također potrebno je unijeti i naziv i lokaciju sastanka odnosno događaja i najbitnije, samo
trajanje događaja te se svi ti podaci nakon oblikovanja u RFC33394 format vraćaju metodi
koja je pozvala metodu odrediVrijemeSastanka. Najbolje rezultate daju vremenski intervali
ograničeni unutar jednog dana sa što kraćim trajanjem.
def odrediVrijemeSastanka(self): self.lokacija = raw_input("\nUnesite lokaciju sastanka:") self.naziv = raw_input("Naziv sastanka sastanka:") print "Unesi pocetno vrijeme intervala..." godina_pocetak = raw_input("pocetna godina (yyyy) : ") mjesec_pocetak = raw_input("pocetni mjesec (mm) :") dan_pocetak = raw_input("pocetni dan (dd) :") sat_pocetak = raw_input("pocetni sat (hh) : ") minute_pocetak = raw_input("pocetne minute (mm) : ") print "\nUnesi zavrsno vrijeme intervala...\n" godina_kraj = raw_input("zavrsna godina (yyyy) : ") mjesec_kraj = raw_input("zavrsni mjesec (mm) :") dan_kraj = raw_input("zavrsni dan (dd) : ") sat_kraj = raw_input("zavrsni sat (hh) : ") minute_kraj = raw_input("zavrsne minute (mm) : ") self.trajanje_dogadjaja = raw_input("\ntrajanje događaja (min): ") self.pocetno_vrijeme = godina_pocetak + "-‐" + mjesec_pocetak + "-‐" + dan_pocetak + "T" + sat_pocetak + ":" + minute_pocetak + ":00.000Z" self.zavrsno_vrijeme = godina_kraj + "-‐" + mjesec_kraj + "-‐" + dan_kraj + "T" + sat_kraj + ":" + minute_kraj + ":00.000Z" vremena_sastanka[self.pocetno_vrijeme,self.zavrsno_vrijeme,self.trajanje_dogadjaja] return vremena_sastanka
4 https://www.ietf.org/rfc/rfc3339.txt
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
18
Slanje prijedloga o terminu sastanka klijentima
Metoda posaljiPorukuAgentima je primjer korištenja SPADE platforme pri kreiranju poruka
koje će pojedini agent slati. Nužno je navesti adresu i ontologiju, odnosno predložak koji
omogućuje primanje poruke samo specifičnim agentima i u željenom kontektstu. Nakon što je
objekt poruke izgrađen tada agent pomoću ugrađene metode iz SPADE-a odašilje poruku.
def posaljiPorukuAgentima(self, poruka): i = 1 while i < 5: time.sleep(0.3) i += 1 klijent = "agent_klijent%[email protected]" %i adresa = "xmpp://" + klijent primatelj = spade.AID.aid(name=klijent, addresses=[adresa]) self.msg = ACLMessage() self.msg.setPerformative("inform") self.msg.setOntology("termin_sastanka") self.msg.setLanguage("Hrvatski") self.msg.addReceiver(primatelj) self.msg.setContent(poruka) self.myAgent.send(self.msg) print "\nposlao sam poruku agentu klijentu " + klijent + " !"
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
19
Pronalazak najboljeg termina za sastanak
Nakon što agent organizator primi povratnu poruku od agenata klijenata, odnosno primi niz
odgovarajućih termina tada u metodi nadjiNajboljiTermin iteriramo kroz niz termina i brojimo
pojave određenih termina.
Dakle u ovom odsječku programskog koda uspoređujemo svaki element sa svakim i
brojimo pojave uz iznimke da preskačemo vrijednosti koje označavaju da je termin rezerviran,
odnosno blokiran. Treba naglasiti da ovaj algoritam nije idealan i da ima još mnogo prostora
za napredak u smislu efikasnije usporedbe termina.
def nadjiNajboljiTermin(self): rjesenje = False for x in range(0, 4): element = self.odgovori[x] if element == "[]": return "" redak = element.translate(None, '[]').split(",") for l in range(0, len(redak)): if "Termin je blokiran" in redak[l]: continue pojava = 0 for y in range(0, 4): el = self.odgovori[y] red = el.translate(None, '[]').split(",") for k in range(0, len(red)): if redak[l] == red[k]: pojava += 1 if pojava == 4: return redak[l] if not rjesenje: return ""
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
20
4.3.2. Agenti klijenti
Inicijalizacija agenata klijenata
Metoda koja služi za inicijalizaciju agenata klijenata s njihovim pripadajućim Google
Kalendar API informacijama. Sadrži niz s podacima koji će biti dodijeljeni svakom agentu
zasebno koji se sastoji od korisničkih podataka, pridružene mail adrese te vremena u kojima
ne želimo uznemiravati agente, odnosno rezervirana vremena u kojima se agenti ne žele
sastajati s drugim agentima. Za potrebe ovog završnog rada ti termini za svakog agenta su
definirani u večernjim satima.
google_korisnici = { "2": ["466301455600-‐rull43ikdhd7d691dtcitufhnlab9nfu.apps.googleusercontent.com", "g7S6psNxN9tw7PmpILxIsxzw", "[email protected]", ["00:00", "08:00"]], "3": ["969348362348-‐nfs15alf9velcc7dr5312cebijs66cp4.apps.googleusercontent.com", "8Zt_4PsA_JpGGnmFO1PDETj3", "[email protected]", ["00:00", "06:00"]], "4": ["111267856009-‐qj1ravtgqptrlpb9nl83at347vhkgkpd.apps.googleusercontent.com", "8Zt_4PsA_JpGGnmFO1PDETj3", "[email protected]", ["22:00", "05:50"]], "5": ["485027726364-‐fgf7ng6oa671uti4lhv0ugsccilgln97.apps.googleusercontent.com", "d4UqsL3DF0sPZy2fxspKuvr_", "[email protected]", ["19:00", "23:00"]]} id = google_korisnici["%i" % (i)][0] secret = google_korisnici["%i" % (i)][1] user = google_korisnici["%i" % (i)][2] termini = google_korisnici["%i" % (i)][3] ip = "agent_klijent%[email protected]" % (i) korisnik = "klijent_0%i" % (i) k = KlijentAgent(ip, korisnik) k.start() k.setGoogleAccountPodatke(id, secret, user, termini)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
21
Evaluacija slobodnih termina iz Google Kalendara klijenta
Metoda u kojoj se procjenjuje zauzetost termina je središnja metoda cijelog višeagentnog
sustava za automatizirano pregovaranje. Nakon što klijent primi poruku od organizatora, iz
njegove poruke se popunjavaju podaci o početnim i završnim trenutcima događaja.
Također definiramo 4 pivot elementa, odnosno početni pivot element za sate i pivot za
početne minute koji će označavati prednji kraj i završni pivot element za minute i sate koji
označavaju zadnji kraj vremenskog intervala koji promatramo. Provjera preklapanja
rezerviranih termina se obavlja prije provjere samog Google Kalendara kako bi smo uštedjeli
pri komunikaciji i kontaktiranju Google API-a .
Prvo se obavljaju 3 jednostavne provjere u kojima provjeravamo preklapa li se
vremenski okvir koji se trenutačno promatramo sa vremenskim okvirom koji zahvaćamo s
pivot elementima.
while fiksni_zavrsni_sat -‐ 1 >= pivot_intervala_sati_pr dnji \ and fiksne_zavrsne_min <= pivot_intervala_minute_prednji: pivot_intervala_sati_zadnji = pivot_intervala_sati_prednji pivot_intervala_minute_zadnji = pivot_intervala_minute_prednji if ne_preferirani_pocetak_sati == pivot_intervala_sati_prednji and ne_preferirani_pocetak_minute <=pivot_intervala_minute_prednji: slobodni_termini.append("Termin je blokiran !") pivot_intervala_minute_prednji += trajanje_intervala if pivot_intervala_minute_prednji >= 60: pivot_intervala_sati_prednji += 1 pivot_intervala_minute_prednji = 0 continue if ne_preferirani_zavrsetak_sati == pivot_intervala_sati_prednji \ and ne_preferirani_zavrsetak_minute >= pivot_intervala_minute_prednji: slobodni_termini.append("Termin je blokiran !") pivot_intervala_minute_prednji += trajanje_intervala if pivot_intervala_minute_prednji >= 60: pivot_intervala_sati_prednji += 1 pivot_intervala_minute_prednji = 0 continue
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
22
if ne_preferirani_pocetak_sati < pivot_intervala_sati_zadnji \ and ne_preferirani_zavrsetak_sati > pivot_intervala_sati_prednji: slobodni_termini.append("Termin je blokiran !") pivot_intervala_minute_prednji += trajanje_intervala if pivot_intervala_minute_prednji >= 60: pivot_intervala_sati_prednji += 1 pivot_intervala_minute_prednji = 0 continue
Nakon provjera preklapanja s rezerviranim terminima slijedi provjera zauzetosti samih
termina u Google Kalendaru te spremanja početka vremenskog termina u niz slobodnih
termina odnosno rezultata.
try: if self.calendar.main(pocetno_vrijeme, zavrsno_vrijeme): slobodni_termini.append(pocetno_vrijeme) except: continue return slobodni_termini Naravno kako bi mogli kontaktirati API potrebni su nam podaci za Oauth2
autentifikaciju koje smo dodijelili svakom agentu prilikom aktivacije. Gradimo objekt koji će
pristupati API-u na način da mu dodjeljujemo parametre i upit koji će pokretati. Ukoliko ne
omogućimo parametre, tada će podatke za autentifikaciju tražiti iz datoteke koja je priložena
na poveznici u poglavlju 4 .
flow = OAuth2WebServerFlow(self.client_id, self.client_secret, self.scope) storage = Storage('credentials.dat') credentials = storage.get() if credentials is None or credentials.invalid: credentials = run(flow, storage) http = httplib2.Http() http = credentials.authorize(http) service = build('calendar', 'v3', http=http)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
23
Konkretnije za svaki vremenski odsječak očekujemo odgovor od API-a a klasa i
metoda koja gradi upit i vraća istinu ako je odsječak prazan a u suprotnom slučaju neistinu
izgleda ovako:
try: freebusy_query = { "timeMin" : pocetno_vrijeme, "timeMax" : zavrsno_vrijeme, "timeZone": "GMT", "items" :[ { "id" : self.client_name } ] } request = service.freebusy().query(body=freebusy_query) while request != None : response = request.execute() if(response['calendars'][self.client_name]['busy']== []): return True else : return False except AccessTokenRefreshError: print ('Access token denied')
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
24
5. Primjer korištenja Kod samog izvođenja aplikacije redoslijed je bitan, naime potrebno je prvo aktivirati agente
klijente a tek onda agenta organizatora jer ukoliko svi agenti klijenti nisu aktivirani onda
nema previše smisla slati poruke ostalim agentima.
Prilikom otvaranja aplikacije se pojavljuje mali izbornik (slika 6.) koji nudi opciju
novog kruga pregovora te opciju za gašenje svih agenata. Također ispisuje se brojač krugova
pregovora. Kada on dostigne vrijednost 10. aplikacija se zaustavlja i staje s radom.
Slika 6: Aktivacija aplikacije za automatizirano višeagentno pregovaranje (Izvor: vlastita izrada)
Slika 7: Primjer unosa granica termina,podataka o sastanku i trajanju u aplikaciju (Izvor: vlastita izrada)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
25
Odabirom opcije za predlaganje novog termina korisniku se nude opcije izbora niza
parametara (slika 7) kojima određuje početno i završno vrijeme vremenskog intervala kao i
trajanje,lokaciju i naziv sastanka. Važno je napomenuti da prilikom upisivanja valja pratiti
upute u zagradama i unositi parametre u valjanom formatu inače podaci koje šaljemo će biti
krivog formata a samim time i rezultat će biti pogrešan.
Nakon odabira granica vremenskog intervala i trajanja sastanka agent organizator šalje
agentima klijentima podatke, oni te podatke primaju i započinje evaluacija vremenskih
termina. (slika 8)
Svaki od agenata zasebno računa slobodno vrijeme (slika 9) te po završetku šalje agentu
organizatoru povratnu informaciju odnosno niz slobodnih i rezerviranih termina (slika 10) .
Slika 8: Primanje poruke i pokretanje evaluacije agenata klijenata (Izvor: vlastita izrada)
Slika 9: Pronalaženje slobodnih vremenskih intervala (Izvor: vlastita izrada)
Slika 10: Slanje niza slobodnih i rezerviranih termina agentu organizatoru (Izvor: vlastita izrada)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
26
Slika 11: Primanje nizova slobodnih i rezerviranih vremena od svih agenata, neuspješno računanje slobodnog termina (Izvor: vlastita izrada)
Slika 12: Primanje nizova slobodnih i rezerviranih vremena od svih agenata, uspješno računanje slobodnog termina (Izvor: vlastita izrada)
Nakon što agent organizator primi poruke od svih agenata kreće s pronalaskom
najboljeg termina za sastanak. Ta operacija može biti neuspješna (slika 11) ili može rezultirati
najboljim terminom za sastanak (slika 12). Ako je rezultat neuspješan otvara se izbornik sa
slike 6.
Slika 13: Dijalog potvrde dodavanja sastanka u raspored (Izvor: vlastita izrada) Ukoliko je pronalazak termina uspješan tada se korisniku nudi dijalog (slika 13) te
odabirom dijaloga se obavlja akcija upisa termina u kalendar. (slika 14)
Generira se i jedinstveni link na događaj i u događaj se dodaju ostali agenti kao sudionici što
znači da nije potrebno generirati poseban događaj za svakog agenta klijenta već koristimo
Google-ove integrirane mogućnosti.
Primjer kreiranog događaja se može vidjeti na slici 15.
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
27
Slika 14: Primjer upita na Google Kalendar API i poveznica za kreirani događaj (Izvor: vlastita izrada)
Slika 15: Primjer kreiranog događaja u Google Kalendaru(Izvor: vlastita izrada)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
28
6. Osvrt
Prilikom izrade višeagentnog sustava izloženog u ovom radu primijećeno je da postoji cijeli
niz strategija za pregovaranje i postizanje dogovora u višeagentnoj okolini. Implementiran je
poprilično jednostavan algoritam koji se temelji na principu da svaki agent klijent procijeni
može li prisustvovati sastanku i objavi organizatoru skup vremena koja mu odgovaraju ili
blokirana vremena.
Smatram da je ovakav pristup u redu ali nije dovoljno učinkovit te da bi u budućnosti
trebalo utrošiti vremena na implementaciju boljeg pristupa u pregovaranju. Također sustav za
sada funkcionira na vremenskom periodu od jednog dana zbog ograničenja u Google-ovim
servisima te bi u idućim iteracijama trebalo poraditi na tome da se vremenski interval za kojeg
je aplikacija učinkovita proširi na barem tjedan dana.
Iz rada (Wainer, Ferreira, Constantino 2007) je primijećeno da princip otvorenog
rasporeda u kojem svaki agent daje niz vremena kada je slobodan i može prisustvovati
sastanku a agent organizator ih koordinira i daje prijedlog vremena dosta dobro funkcionira i
daje respektabilne rezultate, stoga smatram da bi pri budućem radu trebalo prihvatiti taj
pristup umjesto sada implementiranog rješenja.
Također trebalo bi poraditi na sistemu evaluacije povratnih rezultata od klijenata te
učinkovitije selektirati termine koje vraćaju agenti klijenti.
Na posljetku može se zaključiti da je ostvarena implementacija učinkovita i pogodna
za dogovaranje kraćih sastanaka koji imaju trajanje manje od sata u vremenskom intervalu od
jednog dana zbog ograničenja Google Kalendar API-a .
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
29
7. Zaključak
Pristup kojim agenti dogovaraju sastanke koji je izložen u ovom radu je poprilično
jednostavan ali se iz njegovih postavki, implementacije i načina na koji se može dobiti
rezultat se može shvatit da nije riječ o trivijalnom problemu. Prilikom izrade implementacije
dobivena je ideja i predodžba koliko je teško izraditi učinkovit program koji će svaki puta u
konačnom broju koraka davati neko prihvatljivo rješenje.
Komunikacija između agenata i njihova koordinacija su podložni nizu faktora i postoje
dinamičnoj okolini koja ne mora svaki puta davati iste rezultate stoga je bitno nastaviti
provoditi istraživanja na području pregovaranja agenata u potrazi za najstabilnijim i
najučinkovitijim algoritmom za postizanje dogovora.
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
30
Literatura
[1] Wooldridge M (2002) An Introduciton to MultiAgent Systems. West Sussex :John Wiley
and Sons. < http://coltech.vnu.edu.vn/httt/media/courses/AI++/Tai%20lieu/TLTK.pdf >
(dostupno 25.08.2014)
[2] Macho S, Torrens M , Faltings B (2001) A Multi-Agent System for Planning Meetings ,
Artificial Intelligence Laboratory, Swiss Federal Institute of Technology
<http://liawww.epfl.ch/Publications/Archive/Macho-Gonzalez.pdf>
(dostupno25.08.2014)
[3] Crawford E , Veloso M (2004) Opportunities for Learning in Multi-Agent Meeting
Scheduling , Computer Science Department, Carmegie Mellon University <
https://www.cs.cmu.edu/~mmv/papers/04aaais-liz.pdf > (dostupno 25.08.2014)
[4] Sen S , Durfee EH (1998) A formal study of Distributed Meeting Scheduling
< http://deepblue.lib.umich.edu/handle/2027.42/42829 > (dostupno 25.08.2014)
[5] Jakelić F (2013) Samoorganizacija i izranjajuće ponašanje u višeagentnim sustavima ,
Diplomski rad <https://bib.irb.hr/datoteka/637882.1-JakeliFraneDiplomskiRad2013.pdf >
(dostupno 25.08.2014)
[6] Agnetis A ( 2011) Multi-agent scheduling problems , .[ prezentacije s predavanja] ,
Dipartimenti di Ingenglneria dell'Informazione, Universita di Siena
< http://www.laas.fr/files/MOGISA/Seminaire-Agnetis-MASP.pdf > (dostupno
25.08.2014)
[7] Wainer J , Ferreira PR , Constantino ER (2007) Scheduling meetings through multi-agent
neotigation, Institute of Computing, State University of Campinas,Brasil <
http://www.ic.unicamp.br/~wainer/papers/ds07.pdf > (dostupno 25.08.2014)
[8] Sindhu R, Wahid A, Purohit GN (2011) Negotiation in Multi-Agent System using Partial-
Ordered Schedule, < http://ijcsi.org/papers/IJCSI-8-1-346-355.pdf > (dostupno
25.08.2014)
[9] Marinova ZL, Planning in Multiagent Systems (2002) PhD thesis , Departement of
Information Technologies,Sofia University
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
31
[10] Gazendram HWM, Jorna RJ (1994) Theories about architecture and performance of multi-agent systems <http://www.bdk.rug.nl/medewerkers/h.w.m.gazendam/WebBDK/documents/1998/theories%20about%20architecture%20and%20performance%20of%20multi-agent%20systems.pdf> (dostupno 25.08.2014)
[11] Schatten M (2013) Višeagentni sustavi Interakcija i postizanje dogovora.[ prezentacije s
predavanja] , Varaždin, Fakultet organizacije i informatike, (dostupno 25.08.2014)
[12] The negotiation exprerts (2014) <http://www.negotiations.com/definition/negotiation/
>(dostupno 25.08.2014)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
32
9. Prilog 1. - Programski kod aplikacije
9.1. Agent organizator class OrganizatorAgent(Agent): class Pregovaranje(Behaviour): brojac_krugova_pregovora = 0 lokacija = "" naziv = "" pocetno_vrijeme = "" zavrsno_vrijeme = "" trajanje_dogadjaja = "" izbornik_odabir = "0" brojac_odgovora = 0 odgovori = [] def _process(self): self.msg = None self.msg = self._receive(True) if self.msg: print "\nAgent organizator : " + str(self.brojac_odgovora+1) + " /4 poruka primljeno" self.brojac_odgovora += 1 self.odgovori.append(self.msg.content) if self.brojac_odgovora % 4 == 0: for x in range(0, 4): print self.odgovori[x] termin = self.nadjiNajboljiTermin() if termin == "": self.brojac_odgovora = 0 del self.odgovori[:] print "\nNe može se odrediti najbolji termin sastanka s tim vremenom." \ "\nMolimo predložite novi termin !" self.izbornik() else: print "\nNajbolji termin je : " + termin self.upisiTerminUKalendar(termin)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
33
else: print self.msg print "\nAgent organizator : Čekao sam ali nema poruke" self.prikaziIzbornik() def prikaziIzbornik(self): if self.brojac_krugova_pregovora == 10: print "\nDogovor nije postignut u 10 krugova pregovora" self.zaustaviAgenta() self.izbornik() def izbornik(self): print "\n\n%i. krug pregovora" % (self.brojac_krugova_pregovora + 1) self.izbornik_odabir = raw_input( "\n1)Predlozi sastanak\n2)Odustani od pregovaranja\n\nOdabir:") if self.izbornik_odabir == "1": self.brojac_odgovora = 0 self.brojac_krugova_pregovora += 1 self.odgovori = [] vrijeme = self.odrediVrijemeSastanka() self.posaljiPorukuAgentima(vrijeme) if self.izbornik_odabir == "2": self.zaustaviAgenta() def zaustaviAgenta(self): print "Agent organizator se gasi..." self.posaljiPorukuAgentima("stop") self.MyAgent._kill def odrediVrijemeSastanka(self): self.lokacija = raw_input("\nUnesite lokaciju sastanka:") self.naziv = raw_input("Naziv sastanka sastanka:") print "Unesi pocetno vrijeme intervala..." godina_pocetak = raw_input("pocetna godina (yyyy) : ") mjesec_pocetak = raw_input("pocetni mjesec (mm) :") dan_pocetak = raw_input("pocetni dan (dd) :") sat_pocetak = raw_input("pocetni sat (hh) : ") minute_pocetak = raw_input("pocetne minute (mm) : ") print "\nUnesi zavrsno vrijeme intervala...\n" godina_kraj = raw_input("zavrsna godina (yyyy) : ") mjesec_kraj = raw_input("zavrsni mjesec (mm) :") dan_kraj = raw_input("zavrsni dan (dd) : ") sat_kraj = raw_input("zavrsni sat (hh) : ") minute_kraj = raw_input("zavrsne minute (mm) : ")
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
34
self.trajanje_dogadjaja = raw_input("\ntrajanje događaja (min) : ") self.pocetno_vrijeme = godina_pocetak + "-‐" + mjesec_pocetak + "-‐" + dan_pocetak + "T" + sat_pocetak + ":" + minute_pocetak + ":00.000Z" self.zavrsno_vrijeme = godina_kraj + "-‐" + mjesec_kraj + "-‐" + dan_kraj + "T" + sat_kraj + ":" + minute_kraj + ":00.000Z" vremena_sastanka = [self.pocetno_vrijeme, self.zavrsno_vrijeme, self.trajanje_dogadjaja] return vremena_sastanka def posaljiPorukuAgentima(self, poruka): i = 1 while i < 5: time.sleep(0.3) i += 1 klijent = "agent_klijent%[email protected]" %i adresa = "xmpp://" + klijent primatelj = spade.AID.aid(name=klijent, addresses=[adresa]) self.msg = ACLMessage() self.msg.setPerformative("inform") self.msg.setOntology("termin_sastanka") self.msg.setLanguage("Hrvatski") self.msg.addReceiver(primatelj) self.msg.setContent(poruka) self.myAgent.send(self.msg) print "\nposlao sam poruku agentu klijentu " + klijent + " !" def nadjiNajboljiTermin(self): rjesenje = False for x in range(0, 4): element = self.odgovori[x] if element == "[]": return "" redak = element.translate(None, '[]').split(",") for l in range(0, len(redak)): #print "uzeli smo sada : " + redak[l] if "Termin je blokiran" in redak[l]: continue pojava = 0 for y in range(0, 4): #print "usporedjujem " + redak[l] + " sa %i"%y + ". tim retkom" el = self.odgovori[y] red = el.translate(None, '[]').split(",") for k in range(0, len(red)):
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
35
#print "usporedjujem " + redak[l] + " sa " + red[k] if redak[l] == red[k]: pojava += 1 #print pojava if pojava == 4: return redak[l] if not rjesenje: return "" def upisiTerminUKalendar(self, termin): izbor = 0 while izbor != 1 or izbor != 2: izbor = input("\nŽelite sastanak s terminom %s upisati u kalendar ?" "\n1)Dodaj u kalendar" "\n2)Odustani" "\nodabir:" % termin) if izbor == 1: pocetno_vrijeme = termin.split("'")[1] zavrsno_vrijeme = self.izracunajZavrsnoVrijeme(termin); calendar = GoogleCalendar() try: if calendar.upisiTerminUKalendar(pocetno_vrijeme, zavrsno_vrijeme, self.naziv, self.lokacija): print "Događaj je uspješno upisan u kalendar..." self.zaustaviAgenta() self.izbornik() except: print "Dodavanje događaja nije uspjelo !" self.izbornik() if izbor == 2: print "Dodavanje događaja otkazano !" self.izbornik_odabir = 0 self.izbornik() return def izracunajZavrsnoVrijeme(self, pocetno_vrijeme): godina = pocetno_vrijeme.split("-‐")[0].split("'")[1] mjesec = pocetno_vrijeme.split("-‐")[1] dan = pocetno_vrijeme.split("-‐")[2].split("T")[0] pocetni_sat = int(pocetno_vrijeme.split("T")[1].split(":")[0]) pocetne_min = int(pocetno_vrijeme.split("T")[1].split(":")[1]) + int(self.trajanje_dogadjaja)
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
36
if pocetne_min > 60: razlika = pocetne_min % 60 pocetni_sat += pocetne_min / 60 pocetne_min = razlika zavrsno_vrijeme = godina + "-‐" + mjesec + "-‐" + dan + "T" + str(pocetni_sat) + ":" + str(pocetne_min) \ + ":00.000Z" return zavrsno_vrijeme def _setup(self): time.sleep(5) print "\n Agent\t" + self.getName() + " je aktivan" povratna_informacija = ACLTemplate() povratna_informacija.setOntology("povratna_informacija") predlozak = spade.Behaviour.MessageTemplate(povratna_informacija) pregovaranje = self.Pregovaranje() self.addBehaviour(pregovaranje, predlozak) pregovaranje.prikaziIzbornik()
9.2. Agent klijent google_client_id = "" google_client_secret = "" google_client_username = "" ne_preferirani_termini = "" class PrimiTerminSastanka(Behaviour): calendar = "" ime_agenta = "" pocetno_vrijeme = "" zavrsno_vrijeme = "" trajanje_dogadjaja = "" google_client_id = "" google_client_secret = "" google_client_username = "" ne_preferirani_termini = "" def setGoogleAccountPodatke(self, id, secret, user, ime, termini):
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
37
self.google_client_id = id self.google_client_secret = secret self.google_client_username = user self.ime_agenta = ime self.ne_preferirani_termini = termini self.calendar = GoogleCalendar(self.google_client_id, self.google_client_secret, self.google_client_username) def _process(self): self.msg = None self.msg = self._receive(True) if self.msg: print "\nAgent " + self.ime_agenta + " : primio sam poruku : %s " % self.msg.content if self.msg.content == "stop": print "Agent " + self.ime_agenta + ": gasim se" self.MyAgent._kill() if self.msg.content == "potvrda": print "Agent " + self.ime_agenta + ": Sastanak potvrđen -‐\tgasim se" self.MyAgent._kill() else: vremena = self.msg.content.split("'") self.pocetno_vrijeme = vremena[1] self.zavrsno_vrijeme = vremena[3] self.trajanje_dogadjaja = vremena[5] rezultat = self.evaluirajPrijedlog(self.pocetno_vrijeme, self.zavrsno_vrijeme, self.trajanje_dogadjaja) self.posaljiOdgovor(rezultat) else: print "\nAgent " + self.ime_agenta + " : čekao sam ali nema poruke" self.posaljiOdgovor("Nisam primio poruku") def evaluirajPrijedlog(self, pocetno_vrijeme, zavrsno_vrijeme, trajanje): print "\nAgent " + self.ime_agenta.split(" ")[0] + " : Evaluiram prijedlog za sastankom" try: pocetak_godina = pocetno_vrijeme.split("-‐")[0] pocetak_mjesec = pocetno_vrijeme.split("-‐")[1] pocetak_dan = pocetno_vrijeme.split("-‐")[2].split("T")[0] zavrsetak_godina = zavrsno_vrijeme.split("-‐")[0] zavrsetak_mjesec = zavrsno_vrijeme.split("-‐")[1] zavrsetak_dan = zavrsno_vrijeme.split("-‐")[2].split("T")[0]
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
38
slobodni_termini = [] trajanje_intervala = int(trajanje) fiksni_zavrsni_sat = int(zavrsno_vrijeme.split("T")[1].split(":")[0]) fiksne_zavrsne_min = int(zavrsno_vrijeme.split("T")[1].split(":")[1]) pocetak_intervala_sati = int(pocetno_vrijeme.split("T")[1].split(":")[0]) pocetak_intervala_minute = int(pocetno_vrijeme.split("T")[1].split(":")[1]) pivot_intervala_sati_prednji = pocetak_intervala_sati pivot_intervala_minute_prednji = pocetak_intervala_minute ne_preferirani_pocetak_sati = int(self.ne_preferirani_termini[0].split(":")[0]) ne_preferirani_pocetak_minute = int(self.ne_preferirani_termini[0].split(":")[1]) ne_preferirani_zavrsetak_sati = int(self.ne_preferirani_termini[1].split(":")[0]) ne_preferirani_zavrsetak_minute = int(self.ne_preferirani_termini[1].split(":")[1]) while fiksni_zavrsni_sat -‐ 1 >= pivot_intervala_sati_prednji \ and fiksne_zavrsne_min <= pivot_intervala_minute_prednji: pivot_intervala_sati_zadnji = pivot_intervala_sati_prednji pivot_intervala_minute_zadnji = pivot_intervala_minute_prednji if ne_preferirani_pocetak_sati == pivot_intervala_sati_prednji \ and ne_preferirani_pocetak_minute <= pivot_intervala_minute_prednji: slobodni_termini.append("Termin je blokiran !") pivot_intervala_minute_prednji += trajanje_intervala if pivot_intervala_minute_prednji >= 60: pivot_intervala_sati_prednji += 1 pivot_intervala_minute_prednji = 0 continue if ne_preferirani_zavrsetak_sati == pivot_intervala_sati_prednji \ and ne_preferirani_zavrsetak_minute >= pivot_intervala_minute_prednji: slobodni_termini.append("Termin je blokiran !") pivot_intervala_minute_prednji += trajanje_intervala if pivot_intervala_minute_prednji >= 60: pivot_intervala_sati_prednji += 1
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
39
pivot_intervala_minute_prednji = 0 continue if ne_preferirani_pocetak_sati < pivot_intervala_sati_zadnji \ and ne_preferirani_zavrsetak_sati > pivot_intervala_sati_prednji: slobodni_termini.append("Termin je blokiran !") pivot_intervala_minute_prednji += trajanje_intervala if pivot_intervala_minute_prednji >= 60: pivot_intervala_sati_prednji += 1 pivot_intervala_minute_prednji = 0 continue else: pivot_intervala_minute_prednji += trajanje_intervala if pivot_intervala_minute_prednji >= 60: pivot_intervala_sati_prednji += 1 pivot_intervala_minute_prednji = 0 if pivot_intervala_sati_zadnji < 10: pocetak_sat = "0%i" % (pivot_intervala_sati_zadnji) else: pocetak_sat = "%i" % (pivot_intervala_sati_zadnji) if pivot_intervala_minute_zadnji < 10: pocetak_minute = "0%i" % (pivot_intervala_minute_zadnji) else: pocetak_minute = "%i" % (pivot_intervala_minute_zadnji) if pivot_intervala_sati_prednji < 10: zavrsetak_sat = "0%i" % (pivot_intervala_sati_prednji ) else: zavrsetak_sat = "%i" % (pivot_intervala_sati_prednji ) if pivot_intervala_minute_prednji < 10: zavrsetak_minute = "0%i" % pivot_intervala_minute_prednji else: zavrsetak_minute = "%i" % (pivot_intervala_minute_prednji ) pocetno_vrijeme = pocetak_godina + "-‐" + pocetak_mjesec + "-‐" + pocetak_dan + "T" + \ pocetak_sat + ":" + pocetak_minute + ":00.000Z" zavrsno_vrijeme = zavrsetak_godina + "-‐" + zavrsetak_mjesec + "-‐" + str(zavrsetak_dan) + "T" \ + zavrsetak_sat + ":" + zavrsetak_minute + ":00.000Z" print self.name + ": računam slobodno vrijeme..."
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
40
try: if self.calendar.main(pocetno_vrijeme, zavrsno_vrijeme): slobodni_termini.append(pocetno_vrijeme) except: continue return slobodni_termini except: return "Greska u evaluaciji" def posaljiOdgovor(self, odgovor): primatelj = spade.AID.aid(name="[email protected]", addresses=["xmpp://[email protected]"]) self.msg = ACLMessage() self.msg.setPerformative("inform") self.msg.setOntology("povratna_informacija") self.msg.setLanguage("Hrvatski") self.msg.addReceiver(primatelj) self.msg.setContent(odgovor) self.myAgent.send(self.msg) print "\nAgent " + self.ime_agenta + " : poslao sam poruku agentu organizatoru %s\n!" % (odgovor) def _setup(self): print "\n Agent\t" + self.getAID().getName() + " je aktivan" feedback_template = ACLTemplate() feedback_template.setOntology("termin_sastanka") mt = MessageTemplate(feedback_template) termin = self.PrimiTerminSastanka() self.addBehaviour(termin, mt) termin.setGoogleAccountPodatke(self.google_client_id, self.google_client_secret, self.google_client_username, self.getAID().getName(), self.ne_preferirani_termini) def setGoogleAccountPodatke(self, id, secret, user, termini): self.google_client_id = id self.google_client_secret = secret self.google_client_username = user
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
41
9.3. Komunikacija s Google Calendar API-em5 from apiclient.discovery import build from oauth2client.file import Storage from oauth2client.client import AccessTokenRefreshError from oauth2client.client import OAuth2WebServerFlow from oauth2client.tools import run class GoogleCalendar: client_id = "" client_secret = "" client_name = "" scope = 'https://www.googleapis.com/auth/' def __init__(self,cli_id=None, cli_secret=None,cli_name=None): self.client_id = cli_id self.client_secret = cli_secret self.client_name = cli_name def main(self,pocetno_vrijeme,zavrsno_vrijeme): flow = OAuth2WebServerFlow(self.client_id, self.client_secret, self.scope) storage = Storage('credentials.dat') credentials = storage.get() if credentials is None or credentials.invalid: credentials = run(flow, storage) http = httplib2.Http() http = credentials.authorize(http) service = build('calendar', 'v3', http=http) try: freebusy_query = { "timeMin" : pocetno_vrijeme, "timeMax" : zavrsno_vrijeme, "timeZone": "GMT", "items" :[ { "id" : self.client_name }
5 Osnovna strukutra za komunikaciju s Google Kalendar uslugom kao i biblioteke za O2 autentifikaciju su preuzete sa : https://developers.google.com/api-client-library/python
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
42
] } request = service.freebusy().query(body=freebusy_query) while request != None : response = request.execute() if(response['calendars'][self.client_name]['busy']== []): return True else : return False except AccessTokenRefreshError: print ('The credentials have been revoked or expired, please re-‐run''the application to re-‐authorize') def upisiTerminUKalendar(self,pocetno_vrijeme,zavrsno_vrijeme,naziv,lokacija): print lokacija print naziv print self.client_name flow = OAuth2WebServerFlow(self.client_id, self.client_secret, self.scope) storage = Storage('credentials.dat') credentials = storage.get() if credentials is None or credentials.invalid: credentials = run(flow, storage) http = httplib2.Http() http = credentials.authorize(http) service = build('calendar', 'v3', http=http) pocetno_vrijeme = pocetno_vrijeme.split("Z")[0]+"-‐00:00" zavrsno_vrijeme = zavrsno_vrijeme.split("Z")[0]+"-‐00:00" print zavrsno_vrijeme[23] event = { "end": { "dateTime": zavrsno_vrijeme }, "start": { "dateTime": pocetno_vrijeme },
Automatizirano pregovaranje o rasporedu u višeagentnoj okolini - Završni rad
43
"attendees": [ { "email": "[email protected]" }, { "email": "[email protected]" }, { "email": "[email protected]" }, { "email": "[email protected]" } ], "summary": naziv, "location": lokacija } print event try: created_event = service.events().insert(calendarId='primary', body=event).execute() print "Kreirani dogadjaj : " + created_event['htmlLink'] return True except: print "Nije zapisano u kalendar" return False