46
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.

Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 2: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 3: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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  

Page 4: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 5: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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

Page 6: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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

Page 7: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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

Page 8: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 9: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)

Page 10: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 11: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 12: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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

Page 13: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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

Page 14: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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

Page 15: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 16: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 17: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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:

[email protected]

[email protected]

[email protected]

[email protected]

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.

Page 18: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)

Page 19: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)

Page 20: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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

Page 21: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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  +  "  !"  

Page 22: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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  ""  

Page 23: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)  

Page 24: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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        

Page 25: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)  

Page 26: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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')  

 

Page 27: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)

Page 28: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)

Page 29: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 30: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)

Page 31: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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 .

Page 32: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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.

Page 33: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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

Page 34: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)

Page 35: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)      

Page 36: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)                :  ")      

Page 37: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)):  

Page 38: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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)  

Page 39: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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):  

Page 40: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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]  

Page 41: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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  

Page 42: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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..."  

Page 43: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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    

Page 44: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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

Page 45: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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                                              },  

Page 46: Automatizirano pregovaranje o rasporedu u višeagentnoj ... · igara, sociologije, psihologije i mnogih drugih. (Schatten 2013) (Schatten 2013) Sama definicija agenta kao osnovne

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