SVEU ˇ CILIŠTE U ZAGREBU FAKULTET ORGANIZACIJE I INFORMATIKE VARAŽDIN Mario Kolmaˇ ci´ c VIŠEAGENTNI SUSTAV ZA B2B PREGOVARANJE DIPLOMSKI RAD Varaždin, 2013.
SVEUCILIŠTE U ZAGREBUFAKULTET ORGANIZACIJE I INFORMATIKE
VARAŽDIN
Mario Kolmacic
VIŠEAGENTNI SUSTAV ZA B2BPREGOVARANJE
DIPLOMSKI RAD
Varaždin, 2013.
SVEUCILIŠTE U ZAGREBUFAKULTET ORGANIZACIJE I INFORMATIKE
VARAŽDIN
Mario Kolmacic
Redoviti student
Broj indeksa: 40488/11-R
Smjer: Baze podataka i baze znanja
VIŠEAGENTNI SUSTAV ZA B2BPREGOVARANJE
DIPLOMSKI RAD
Mentor:
Doc. dr. sc. Markus Schatten
Varaždin, lipanj 2013.
Sadržaj
1. Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2. E-poslovanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3. B2B pregovaranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
4. Višeagentni sustavi u B2B pregovaranju . . . . . . . . . . . . . . . . . . . . . . . . . 44.1. Zahtjevi sustava za B2B pregovaranje u e-poslovanju . . . . . . . . . . . . . . . . . 44.2. Arhitektura sustava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
5. Automatizirano pregovaranje u višeagentnim sustavima . . . . . . . . . . . . . . . . 75.1. Bilateralno pregovaranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85.2. Problem kvalitativnih vrijednosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5.2.1. Kvalitativne vrijednosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95.2.2. Neizrazite vrijednosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.3. Multilateralno pregovaranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
6. Višeagentni sustav javne nabave temeljem automatiziranog pregovaranja . . . . . . 116.1. Motivacija za uvodenje automatiziranog sustava javne nabave . . . . . . . . . . . . . 116.2. Javna nabava u Republici Hrvatskoj . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6.2.1. Segmenti javne nabave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126.2.2. Postupci javne nabave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136.2.3. Zakonodavni i institucionalni okvir . . . . . . . . . . . . . . . . . . . . . . 146.2.4. Nadležne institucije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
7. Implementacija automatiziranog sustava javne nabave . . . . . . . . . . . . . . . . 157.1. SPADE platforma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157.2. Znacajke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167.3. Web graficko sucelje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167.4. Opis arhitekture sustava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
7.4.1. Web sucelje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177.4.2. Višeagentni sustav . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177.4.3. Baza podataka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
7.5. Dijagram prikaza rada sustava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187.6. ERA model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
I
7.7. Natjecaji i ponude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217.8. Struktura Jedinstvenog rjecnika javne nabave (CPV) . . . . . . . . . . . . . . . . . 227.9. Unos natjecaja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237.10. Unos ponude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257.11. Strategije pregovaranja i njihova implementacija . . . . . . . . . . . . . . . . . . . . 277.12. Primjer prijave i pregovaranja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
8. Povezana istraživanja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
9. Zakljucak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
10. Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
11. Prilozi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4011.1. PRILOG 1 - Implementacija agenta narucioca . . . . . . . . . . . . . . . . . . . . . 4011.2. PRILOG 2 - Implementacija agenta ponudaca . . . . . . . . . . . . . . . . . . . . . 52
II
1. Uvod
Pregovaranje je postalo vrlo bitno u današnje vrijeme. Vrlo cesto cujemo za taj pojam u gotovo
svim medijima. Pregovaranje bi mogli definirati kao dijalog izmedu dvoje ili više ljudi sa ciljem
da se postigne sporazum na dobrobit svih strana ili da se stekne prednost u odnosu na ostale strane.
Pregovaramo u gotovo svim podrucjima (poslovanje, neprofitne organizacije, vlade, itd.) i životnim
situacijama (vjencanje, roditeljstvo, škola, itd.). Postoje i profesionalni pregovaraci koji su specijali-
zirani za pregovaranje u važnijim podrucjima života kao što su financije (npr. brokeri), policija (npr.
pregovaraci u slucaju talacke krize), itd. Takva pregovaranja obavljaju se izmedu ljudi i poprilicno
se razlikuju od automatiziranog pregovaranja na kojem ce biti naglasak u ovom radu.
Rastom kolicine informacija i globalnog e-tržišta raste potreba za sve inteligentnijim rješenjima
koja ce omoguciti obavljanje velike vecine zadataka u ime svog vlasnika. Jedno od rješenja su
višeagentni sustavi. Inteligentni agenti obavljaju složene operacije kao što su donošenje odluka i
rješavanja kompleksnih problema. Autonomni su i adaptivni te su u mogucnosti donositi odluke
bez traženja dodatnih informacija od vlasnika ili drugih korisnika. Agenti omogucuju znacajno
smanjenje troškova transakcija te brže provodenje poslovnih procesa.
Automatizirano pregovaranje postaje sve važnije s obzirom na povecanje elektronickog trgova-
nja. Za automatizirano pregovaranje potrebni su odredeni preduvjeti kako bi bilo ostvarivo (npr.
strategija i protokol pregovaranja). Protokol pregovaranja jasno definira tok poruka izmedu prego-
varackih strana te odreduje tko kada i što smije reci i prema kojim pravilima. Protokol pregovaranja
mora biti javni i dostupan svim pregovarackim stranama. Strategija je privatna za svaku stranu jer
predstavlja nacin i pravila pregovaranja i omogucuje dobivanje najboljih rezultata. U ovom radu
automatizirano pregovaranje primjenjeno je na postupcima javne nabave, a implementirano je po-
mocu višeagentnog sustava.
U skladu s navedenim prvo ce se u poglavlju 2. navesti opci pojmovi o e-poslovanju. U po-
glavlju 3. predstavlja se B2B pregovaranje te faze i koraci pregovaranja. Poglavlje 4. bavi se više-
agentnim sustavima u B2B pregovaranju te je naveden primjer sustava koji je potkrijepljen stvarnim
primjerom. Automatizirano pregovaranje u višeagentnim sustavima (bilateralno i multilateralno)
objašnjeno je u 5. poglavlju. Zatim slijedi višeagentni sustav javne nabave temeljem automatizi-
ranog pregovaranja koji je implementiran u sklopu rada te detaljno objašnjenje arhitekture sustava.
Povezana istraživanja spominju se u 8. poglavlju.
1
2. E-poslovanje
Porastom informacijskih tehnologija na tržištima, današnje poslovanje velikim se dijelom obavlja
elektronickim putem. Automatizacijom procesa i poslovnih transakcija omogucuje tvrtkama bolju
efikasnost i pouzdanost poslovnih procesa. Razlikujemo sljedece vrste e-poslovanja:
� B2B (eng. Business-to-business) - vrsta elektronickog poslovanja koje se odvija izmedu orga-
nizacija. Najveci dio elektronickog poslovanja upravog je te vrste. Obujam B2B transakcija
mnogo je veci nego kod ostalih poslovanja zbog mnogo transakcija u lancu opskrbe kako bi
proizvod bio izraden i prodan krajnjem kupcu.
� B2C (eng. Business-to-Consumer) - vrsta elektronickog poslovanja izmedu poduzeca i kraj-
njih korisnika. Treba naglasiti da bilo koji B2C proizvod ili usluga može biti i B2B proizvod.
� B2G (eng. Business-to-government) - predstavlja poslovanje izmedu razlicitih poduzeca i
javnog sektora. Primjeri B2G poslovanja su korištenje interneta za javnu nabavu, licenciranje,
itd.
� C2C (eng. Customer to customer) - elektronicko poslovanje izmedu krajnjih korisnika preko
neke trece strane. Primjer C2C poslovanja su online aukcije gdje prodavac objavljuje svoj
proizvod, a kupci daju svoje ponude. Aukcija se odvija preko nekog web servisa.
� Mobilno poslovanje - predstavlja kupnju i prodaju usluga korištenjem bežicne tehnologije tj.
korištenjem mobilnih uredaja. Primjer mobilnog poslovanja je mobilno bankarstvo.
Slika 2.1: Prikaz razlicitih vrsta e-poslovanja
2
3. B2B pregovaranje
B2B prodavaci i kupci koriste pregovaracke strategije kako postigli sporazum o uvjetima i cijeni
koji zadovoljava obje strane. Nužno je da strategije uzimaju u obzir interese i kupaca i prodavaca.
Pregovaranja su sveprisutna u raznim kontekstima kao što su marketing, uspostavljanje poslovnog
ugovora, upravljanje radnim sporovima, rješavanje granicnih sukba, upravljanje talackom krizom,
itd. Pregovaranje se odnosi na proces kojim skupina agenata (ljudskih ili programskih) komunicira
jedna s drugom kako bi se postigao prihvatljivi dogovor o raspodjeli sredstava.
S obzirom na sveprisutnost i važnost pregovora u razlicitim podrucjima, istraživanje teorija
i tehnika pregovaranja privuklo je pažnju iz više znanstvenih disciplina kao što su distribuirana
umjetna inteligencija, socijalna psihologija, teorija igara, operacijska istraživanja, a u novije vrijeme
i agentno-posredovano elektronicko poslovanje. Unatoc razlicitim pristupima prema proucavanju te-
orije pregovaranja, model pregovaranja sastoji se od cetiri osnovna elementa: protokol pregovaranja,
strategija pregovaranja, okružje pregovaranja i okružje agenata [Woolridge, 2002]. Pregovaranje se
sastoji od sljedecih faza i koraka [Eunson, 1994]:
� Priprema
• Postavljanje ciljeva - utvrdivanje naših ciljeva te razmatranje mogucih ciljeva druge
strane
• Definiranje rezervnog plana - razmotriti najbolje alternative u slucaju neuspjelog prvo-
bitnog plana te razmotriri najgore moguce pozicije
• Postaviti prioritete - odrediti važnost pojedinih parametara
• Odluciti o najboljim i najgorim limitima trgovanja - odrediti najviše i najviše vrijednosti
pojedinihg parametara trgovanja (najniža cijena, kolicina, itd.)
• Planirati nepredvidive situacije izvan okvira trgovanja - promotriti moguca odstupanja
(plan "Što ako ... ?" te odgovarajuce strategije)
� Pregovaranje
• Postavljanje problema - na pocetku pregovaranja ne smijemo otkriti prioritete
• Postavljanje pitanja - pitanja služe za bolje informiranje i upoznavanje motiva koji nam
otkriva smjer pregovaranja
• Rezimiranje - parafraziranje dosadašnjih koraka i prikupljenih informacija
• Ustupci pregovaranja - postizanje dogovora o tome koje akcije je potrebno poduzeti i pod
kojim uvjetima
• Zakljucak - sumiranje i zakljucivanje pregovora
3
4. Višeagentni sustavi u B2B pregovaranju
Rast ICT (engl. Information and Communication Technologies) industrije u svim segmentima
tržišta i poslovanja omogucio je tvrtkama korištenje naprednih tehnologija i inteligentnih agenata
kako bi smanjili vrijeme transakcija i poboljšali proces pregovaranja. Potreba za razvojem alata za
inteligentnu podršku naglo je porasla zbog rasta broja transakcija elektronickim putem. Inteligentna
podrška omogucuje povecanje stupnja sofisticiranosti i automatizacije e-poslovanja. Vjeruje se da
ce B2B i dalje rasti te ce biti dominantni nacin poslovanja u bližoj buducnosti.
Pregovaranje predstavlja jedan od kljucnih koraka u B2B e-poslovanju. Programski agenti su en-
kapsulirani racunalni sustavi smješteni u nekima okružjima kao što su internet i sposobni su izvoditi
fleksibilne i autonomne akcije u tom okružju kako bi postigli zadani cilj. Agenti unutar višeagent-
nog sustava komuniciraju i autonomno donose odluke u ime svojih korisnika. Na taj nacin smanjuju
vrijeme ljudskog pregovaranja i prepoznaju optimalna ili približna rješenja kompleksnih prostora
pregovaranja.
4.1. Zahtjevi sustava za B2B pregovaranje u e-poslovanju
Mehanizmi pregovaranja za B2B e-poslovanje moraju biti racunalno ucinkoviti. Agent koji pred-
stavlja svog korisnika zna vlastita svojstva, ali ne i svojstva svojih protivnika u pregovaranju. U ve-
cini B2B pregovaranja, agent mora biti u stanju donositi razumne odluke temeljene na nepotpunim
i neizvjesnim informacijama. Buduci da B2B pregovaranja cesto ukljucuju višestruke parametre
(cijena, kolicina, kvaliteta, itd.) istovremeno, mehanizmi pregovaranja moraju biti u mogucnosti
podržati multilateralna pregovaranja. Konkretno, B2B odnosi i interakcije trebaju se modelirati kao
integrativna pregovaranja. Ukratko, cilj automatiziranog sustava za B2B pregovaranje je ucinkovito
traženje win-win situacije s obzirom na specificna svojstva.
4.2. Arhitektura sustava
Web servisi višeagentnog sustava omogucavaju interakciju te su izgradeni na vrhu postoje-
cih Web protokola, a temelje se na otvorenim XML standardima. Dizajn dinamickih rješenja e-
poslovanja temeljenih na B2B e-poslovanju naziva se BBT (Business-to-Business Transaction) mo-
del koji sustavno analizira procese na B2B e-tržištima [He et al., 2003] [Lau, 2006]
S obzirom na BBT model [He et al., 2003], B2B poslovni proces može se podijeliti u šest naj-
važnijih faza:
� formiranje partnerstva - potraga za poslovnim partnerima koji pružaju proizvode ili usluge
u opskrbnom lancu
4
� posredovanje - proces traženja odgovarajucih partnera, tj. prodavaca koji prodaju proizvode
ili usluge i kupaca koji kupuju te proizvode
� pregovaranje - trgovci pokušavaju postici dogovor o uvjetima prodaje
� formiranje ugovora - oznacava kraj pregovaranja i ukljucuje dogovorene uvjete koje ce sadr-
žavati ugovor
� ispunjenje ugovora - obavljanje transakcija u skladu s ugovorom
� procjena usluge - posljednja faza gdje sudionici procjenjuju njihovu razinu zadovoljstva os-
tvarenim transakcijama te pripremaju mogucu ponovnu suradnju u buducnosti
Arhitektura WSDNS (eng. Web Service Discovery and Negotiation System) servisa prikazana je na
slici 4.1. Predložena WSDNS arhitektura izravno podržava prve cetiri faze BBT modela (formiranje
Slika 4.1: Prikaz WDSNS-a [Lau, 2006]
partnerstva, posredovanje, pregovaranje, formiranje ugovora) i lako je proširiva na posljednje dvije
faze ukoliko je to potrebno.
Svakodnevni primjer primjene WSDNS platforme za ucinkovito B2B e-poslovanje možemo ilus-
trirati na sljedeci nacin:
1. Pružatelji usluga kao što su proizvodaci automobila angažiraju svoje programske agente (npr.
klijentske aplikacije) kako bi objavili njihove informacije o proizvodima ili uslugama na web
server (Web server 1 na slici 4.1). Specifikacije i detalji aplikacije opisani su pomocu univer-
zalnog WSDL (eng. Web Service Description Language) jezika.
5
2. Kada trgovac na veliko želi kupiti veliki broj automobila od nekog proizvodaca, zastupnik
može prenijeti taj zadatak na svoje inteligentne programske agente. Programski agent (npr.
druga klijentska aplikacija) šalje upit UDDI (eng. Universal Description Discovery and Inte-
gration) serveru [Curbera et al., 2002] za pretragu relevantnih proizvoda i dobivanje pozivnih
informacija od web servisa. Auto zastupnik instancira njihov racunalni agent na racunalo ili
mobilnu uslugu. Programski ageni auto zastupnika i proizvodaca automobila mogu se povezati
na WSDNS preko standardnog XML-baziranog SOAP (eng Simple Object Access Protocol)
kommunikacijskog standarda.
3. Ako je servisno sucelje transakcijskog web servisa prepoznato od strane programskog agenta
auto zastupnika (tj. korisnik servisa), konekcija na transakcijski servis (Web server 2 na slici
4.1.) uspostavlja se odmah izmedu auto zastupnika i proizvodaca automobila (tj. pružatelj
servisa). Ukoliko je sucelje web servisa nepoznatog tipa prema korisniku servisa, prije konek-
cije biti ce provedena adaptacija servisa. U ovom slucaju, programski agent auto zastupnika
može ispitati katalog automobila na transakcijskom serveru proizvodaca automobila nakon
uspješnog uspostavljanja usluge.
4. Nakon dobivanja relevantne informacije o automobilu od proizvodaca automobila, auto zas-
tupnik može poceti pregovore sa proizvodacem automobila o cijeni, vremenu dostave auto-
mobila, uvjeti placanja, broj dostavljenih automobila, itd. Auto zastupnik i proizvodac auto-
mobila mogu dobiti informacije o davatelju usluge pregovarackog servisa preko ranije spo-
menutog UDDI servera. nakon dobivanja relevantne WDSL-temeljene specifikacije, klijent-
ske aplikacije koje predstavljaju svoje stranke kontaktiraju ontologijski server (Web server 3
na slisi 4.1.) kako bi podijelili zajednicki skup pregovarackih atributa. Nakon takvog tzv.
"hand-shake" procesa, kupac i prodavac mogu poceti pregovore instancirajuci odgovarajuce
programske agente na pregovarackom serveru. Kada se postigne dogovor, odgovarajuci agenti
ce obavijestiti njihove korisnike kako bi prihvatili ili odbili ponudu preko racunala ili mobilnog
uredaja.
Uloge razlicitih komponenti WSDNS-a mogu se razumijeti u smislu tradicionalnog nacina kupnje
automobila. UDDI servis može predstavljati oglasnik gdje možemo pronaci razlicite vrste poslo-
vanja. WSDL je analogno narudžbenici koja odreduje koje su informacije potrebne za ispunjenje
narudžbe, a SOAP protokol definira format za prijenos elektronickog primjera narudžbenice. Tre-
nutna arhitektura lako se može proširiti na posljednje dvije faze B2B poslovnog procesa. Npr. kupac
i prodavac mogu se spojiti na transakcijski server kako bi pratili status narudžbi i ispunjenje odrede-
nih uvjeta. Štoviše, korisnici servisa mogu poslati povratne informacije o proizvodima i uslugama
na transakcijski server za daljnju analizu od strane pružatelja servisa.
6
5. Automatizirano pregovaranje u višeagentnim sustavima
Agenti koji pregovaraju moraju postici odredeni sporazum koji zadovoljava obje strane. Prije
detaljnije obrade teme, treba spomenuti cetiri razlicite komponente pregovaranja [Woolridge, 2002]:
� Skup pregovaranja - predstavlja prostor mogucih ponuda agenata
� Protokol - definira legalne ponude agenata, kao što su funkcije prema povijesti pregovaranja
� Kolekcija strategija - jedna za svakog agenta, koja odreduje koje ce ponude agenti dati. Naj-
cešce, strategija koju agent igra je privatna, što znaci da nije vidljiva ostalim agentima sudi-
onicima pregovaranja.
� Pravilo - odreduje da li je postignut sporazum, i kakav je taj sporazum.
Pregovaranje se obicno obavlja u serijama te svaki agent daje ponudu u svakoj svakoj iteraciji. Po-
nude koje agenti daju su definirane prema njihovim strategijama te moraju biti pravilne, baš kako su
definirane prema protokolu. Ukoliko je postignut dogovor, koji je definiran prema pravilu dogovora,
tada pregovaranje prestaje sa dogovorom.
Ova cetiri parametra vode prema ekstremno bogatoj i složenoj okružju za analizu. Prvi atribut
koji može komplicirati pregovaranje je kada su ukljucena višestruka pitanja. Primjer jednostrukog
pregovaranja bio bi kada dva agenta pregovaraju samo o cijeni neke robe za prodaju. U takvom sce-
nariju, postavke agenata su simetricne, što znaci da sporazum koji je više pozitivan za jednog agenta,
ce biti manje pozivitan za drugog agenta, i obrnuto. Takvi simetricni scenariji se lako analiziraju jer
je uvijek dolazi do ustupka. Tako npr. ako prodavac želi prodati robu, mora napraviti ustupak, tj.
sniziti cijenu, a kupac ako želi kupiti, mora takoder napraviti ustupak, tj. povecati svoju ponudu.
U višestrukim pregovaranjima, agenti ne pregovaraju samo o vrijednosti jednog atributa, nego o
vrijednostima više atributa, koji mogu biti u medusobnom odnosu. Na primjer, kada kupujemo auto,
cijena nije jedini faktor o kojem pregovaramo (iako vrlo vjerojatno najdominantniji). Kupca može
interesirati dužina garancije, servis vozila, dodatna oprema itd. U višestrukim pregovaranjima cesto
nije ocit pravi ustupak, jer nije slucaj da sve vrijednosti atributa moraju biti povecane ili smanjene.
Višestruki atributi vode k eksponencijalnom rastu prostora mogucih rješenja. Ukoliko u nekoj
domeni pregovaraju agenti o vrijednosti n Boole-ovih varijabli, v1, . . . , vn, postavke se sastoje od do-
djela ili istinitih ili lažnih vrijednosti za svaku varijablu vi. Vidimo da postoji 2n mogucih dogovora
u takvoj domeni. To znaci da, u pokušaju da odluci koja ponuda ce biti sljedeca, za agenta ce biti
potpuno neizvedivo da razmorti svaki moguci dogovor u domenama srednje velicine. Vecinom, do-
mene pregovaranja su mnogo kompleksnije od ove. Na primjer, agenti pregovaraju o vrijednostima
atributa gdje ti atributi mogu imati m mogucih vrijednosti, što dovodi do mn mogucih dogovora.
7
Složenost pregovaranja odreduje i broj agenata ukljucenih u pregovaranje te nacin na koji agenti
komuniciraju.
Postoje sljedece tri mogucnosti:
� Pregovaranje jedan-na-jedan - Agent pregovara sa samo jednim agentom. Djelomicno jed-
nostavan primjer pregovaranja jedan-na-jedan je kada agenti imaju simetricna svojstva s ob-
zirom na moguce ponude. Primjer takvog pregovaranja u svakodnevnom životu bio bi kada
pregovaramo o uvjetima sa prodavacem vozila.
� Pregovaranje više-na-jedan - U ovom pregovaranju, jedan agent pregovara s nekim brojem
ostalih agenata. Aukcije su primjer više-na-jedan pregovaranja. Pregovaranje više-na-jedan se
cesto tretira kao veci broj jedan-na-jedan pregovaranja.
� Pregovaranje više-na-više - U ovom pregovaranju, više agenata pregovara s više ostalih age-
nata simultano. Prema najgorem slucaju, gdje je ukupno n agenata ukupno ukljuceno u prego-
varanje, znaci da je moguce do n{n − 1}/2 pregovarackih dretvi. Iz gledišta analize, takvim
pregovaranjem teško je upravljati.
5.1. Bilateralno pregovaranje
Model bilateralnog pregovaranja [Raïffa, 1982] koristi skup kvantitativnih varijabli. Neka su s
i (i ∈ {a, b}) oznaceni agenti koji pregovaraju i neka su sa j (j ∈ {1, ..., n}) oznaceni elementi
ponude. Neka je nadalje s xj ∈ [minj,maxj] oznacen moguc skup vrijednosti za element ponude
j. Svaki agent posjeduje funkciju korisnosti V ij : [minj,maxj] −→ [0, 1] koja pridjeljuje pojedinim
vrijednostima elemenata ponude korisnost (radi jednostavnosti korisnost ce biti u intervalu [0, 1]).
Sa wij oznacit cemo relativnu težinu koju agent i pridodaje elementu ponude j (pretpostavljamo da
su relativne težine normalizirane tj.∑
16j6n wij = 1). Ukupna funkcija korisnosti agenta i za neku
ponudu x = (x1, ..., xn) definirana je kao:
V i(x) =∑
16j6n
wijV
ij (xj)
.
5.2. Problem kvalitativnih vrijednosti
Prethodni model polazi od pretpostavke da su svi elementi ponude kvantitativnog karaktera.
Kako bi se u obzir uzele i kvalitativne vrijednosti (npr. kvaliteta usluge - visoka, srednja, niska i sl.)
potrebno je oblikovati drukcije funkcije korisnosti pregovaranja. Moguca rješenja su kvalitativne i
neizrazite vrijednosti.
8
5.2.1. Kvalitativne vrijednosti
Funkcija korisnosti definira se izravno nad skupom kvalitativnih vrijednosti. Neka je zadan
skup kvalitativnih vrijednosti Q = {q1, q2, ..., qr} Funkciju korisnosti moguce je sada definirati kao
diskretnu funkciju:
Vj : Q → [0, 1]
5.2.2. Neizrazite vrijednosti
U ovom slucaju elemente ponude definiramo neizrazitim skupovima. Moguce vrijednosti ele-
menata ponude su kontinuirani interval (xj ∈ [minj,maxj]). Težinu kvalitativnih elemenata opet
odredujemo funkcijom Vj : Q → [0, 1]. Kvalitativne vrijednosti elemenata ponude (qk ∈ Q) defi-
nirane su funkcijom pripadnosti µqk . Sada možemo definirati funkciju korisnosti elementa ponude
kao:
Vj(xj) =∑qk∈Q
µqk(xj)Vj(qk)
Slika 5.1: Primjer kvalitativnih vrijednosti prikazanih pomocu skupa neizrazitih vrijednosti
S obzirom na prethodnu sliku skup izrazitih vrijednosti je µq1(xj) = 0.75, µq2(xj) = 0.2, µq3(xj) =
0. zadana je ponuda (q1, q2, q3), pri cemu je Vj(q1) = 0.2, Vj(q2) = 0.5 i Vj(q3) = 0.8. Tada je
korisnost ponude:
Vj(xj) = µq1(xj)Vj(q1) + µq2(xj)Vj(q2) + µq3(xj)Vj(q3)
= 0.75× 0.2 + 0.2× 0.5 + 0× 0.8
= 0.25
5.3. Multilateralno pregovaranje
Model multilateralnog pregovaranja [Faratin et al., 1998] temelji se na nizu medusobnog utjecaja
dviju strana, sa mnogim parametrima pregovaranja. Slijed ponuda i protuponuda naziva se dretva
9
pregovaranja. Ponude i protuponude generirane su slijedom kombinacija jednostavnih funkcija koje
nazivamo taktikom. Taktike generiraju ponude i protuponude za jednu komponentu objekta prego-
varanja koristeci jednan kriterij (vrijeme, resursi, itd.)
Zadana je dekompozicija skupa agenata A = K ∪ P , pri cemu je K skup klijenata (primatelja
usluga), a P skup poslužitelja (davatelja usluga). Klijenti i poslužitelji u nacelu imaju suprotne inte-
rese (cijena, kvaliteta, kolicina itd.). U manjem broju slucajeva klijenti i poslužitelji imaju zajednicki
interes (takvi elementi ponude automatski poprimaju maksimalnu mogucu vrijednost). Pregovaranje
se uvijek obavlja izmedu dva agenta k ∈ K i p ∈ P
S xta→b oznacavamo vektor elemenata ponude koju je agent a predložio agentu b u trenutku t (radi
jednostavnosti pretpostavlja se diskretno vrijeme T , pri cemu je vrijeme slanja/primanja ponude
0). S xta→b[j] oznacavamo vrijednost elementa ponude j u ponudi xt
p→k. Prihvatljive vrijednosti
elementa ponude j, agenta a su u intervalu [minaj ,maxa
j ].
Dretva pregovaranja izmedu agenata a, b ∈ A, u trenutku t je bilo koja konacni niz oblika
(xt1d1→e1
, xt2d2→e2
, ..., xtndn→en
) pri cemu je:
� ei = di+1 - ponude su naizmjenicne izmedu agenata;
� tk je prije tl ako k 6 l - ponude su vremenski uredene;
� di, ei ∈ {a, b} - dretva sadrži samo ponude agenata a i b;
� di = ei - agent ne nudi sam sebi
� xtidi→ei
[j] ∈ [mindij ,maxdi
j ] ∪ {prihvati, odbij}
Dretvu pregovaranja oznacavamo s xta↔b ili xt
b↔a. Za dretvu pregovaranja kažemo da je aktivna ako
xtndn,en
[j] /∈ {prihvati, odbij} ∀j.
Neka je zadan agent a i njegova funkcija korisnosti V a. Interpretacija ponude xtb→a agenta a u
trenutku t′ (t < t′), definirana je kao:
Ia(t′, xtb→a) =
odbij ako t′ > tamax
prihvati ako V a(xtb→a) > V a(xt′
a→b)
xt′
a→b u protivnom
Pri cemu je xt′
a→b ponuda koju bi agent a ponudio agentu b u trenutku t′, a tamax najkasniji trenutak u
kojem agent a mora završiti pregovor.
10
6. Višeagentni sustav javne nabave temeljem automatiziranog
pregovaranja
U sklopu diplomskog rada implementiran je višeagentni sustav javne nabave temeljem automa-
tiziranog pregovaranja.
6.1. Motivacija za uvodenje automatiziranog sustava javne nabave
Neke od prednosti uvodenja automatiziranog sustava javne nabave navedene su u uvodu i one su
glavna motivacija za uvodenje takvog sustava.
Motivacija za uvodenje sustava javne nabave temeljem automatiziranog pregovaranja:
� Slican sustav u Republici Hrvatskoj još ne postoji - u Republici Hrvatskoj postoji nekoliko
servisa e-javne nabave te isto tako elektronickih oglasnika gdje ponudaci mogu pratiti stanje
natjecaja, ali takvi sustavi nisu sustavi nisu automatizirani i ne koriste automatizirano pregova-
ranje višeagentnih sustava, nego su implementirani kao jednostavne web aplikacije sa bazom
podataka.
� Velike uštede novca i vremena - znacajnim smanjenjem ljudskog posla i povecanim utje-
cajem automatiziranog sustava, uštedilo bi se na raznim direktnim troškovima obrade, ali i
mnogim indirektnim troškovima na koje ne obracamo toliko pozornosti. Uštede vremena ta-
koder su znacajne zbog brzine rada automatiziranog sustava koji bi mjesece i dane sveo na
svega nekoliko sekundi ili minuta.
� Korupcijski rizici svedeni na minimum - uvodenjem automatiziranog sustava javne nabave
ljudski utjecaj znatno bi se smanjio, a samim time i mogucnost manipulacija i koruptivnih
radnji koje su posebno kriticne u segmentu javne nabave zbog prometa velike kolicine novca.
� Brža realizacija nabave - automatiziranim sustavom javne nabave omogucila bi se izuzetno
brza realizacija javne nabave bez potrebe za raznim komisijama i povjerenstvima za odabir
najboljih ponuda kojima treba prilicno puno vremena za donošenje odluke o odabiru najbolje
ponude.
� Automatizirano pregovaranje omogucuje fleksibilnost - automatiziranim pregovaranjem
omogucuje se fleksibilnost za oba segmenta javne nabave što znaci da ponuda može varirati
ovisno o nacinu pregovaranja i unaprijed zadanim strategijama. Funkcije korisnosti omogu-
cuju davanje važnosti pojedinim parametrima ponude/natjecaja te se u skladu s time obracu-
nava korisnost.
11
� Poticanje tržišnog natjecanja - uvodenjem automatiziranog sustava javne nabave povecala
bi se korektnost i ravnopravnost svih korisnika sustava te povecala njihova potreba za tržišnim
natjecanjem što dovodi do sveukupne bolje ponude na tržištu
� Ocuvanje okoliša - smanjenjem papirologije direktno se utjece na zaštitu okoliša. Postoje i
mnogi ostali faktori koji utjecu na ocuvanje okoliša kao što su smanjena potreba za prijevozom,
manja potrošnja elektricne energije, itd.
� Bolja preglednost i nadzor nad postupcima javne nabave - automatiziranim sustavom
znatno bi se povecala transparensnost poslovanja i omogucila bolja preglednost nad koris-
nicima javne nabave. Jednostavnim kreiranjem izvještaja moguc je uvid u svako nadmetanje,
njihov status i napredak.
Teško je nabrojiti sve prednosti ovog sustava koje su motivacija za uvodenje. Uvodenjem automa-
tiziranog sustava javne nabave, na dobitku bi bili i narucitelji i ponudaci. Implementacijom sustava
smanjio bi se ljudski utjecaj na minimalni nivo što znaci da bi se smanjile koruptivne radnje koje
predstavljaju veliki problem javne nabave u Hrvatskoj, ali i u Europi i svijetu zbog ogromne kolicine
novca koje se javljaju u javnim nabavama.
6.2. Javna nabava u Republici Hrvatskoj
Prema službenoj definiciji Ministarstva pravosuda RH [Republika Hrvatska Ministarstvo pravo-
suda, 2011]: "Javna nabava obuhvaca skup postupaka koje narucitelji, koji samostalno ne stjecu
financijska sredstva nego su neposredni ili posredni korisnici državnog ili lokalnog proracuna, mo-
raju provesti prije zakljucivanja ugovora o javnoj nabavi roba, radova ili usluga".
Ciljeve javne nabave dijelimo na kratkorocne i dugorocne [Republika Hrvatska, Ministarstvo gos-
podarstva, 2012]:
� kratkorocni ili primarni - racionalno i ucinkovito trošenje proracunskih sredstava
� dugorocni ili sekundarni - pravna sigurnost, sprecavanje korupcije i kriminala, pozitivni
utjecaji na gospodarski razvoj i zapošljavanje (poticanje tržišnog natjecanja, promicanje iz-
vrsnosti), unaprjedenje upravljanja javnim financijama, ocuvanje okoliša i dr.
6.2.1. Segmenti javne nabave
U javnoj nabavi susrecemo dva segmenta. Narucitelj koji predstavlja javni sektor te ponuditelj
koji predstavlja privatni sektor.
Javni narucitelji u Republici Hrvatskoj mogu biti [Republika Hrvatska Ministarstvo pravosuda,
2011]:
12
� Državna tijela Republike Hrvatske;
� Jedinice lokalne i podrucne(regionalne) samouprave;
� Pravne osobe koje su osnovane za odredene svrhe radi zadovoljavanja potreba u opcem inte-
resu, a koje nemaju industrijski ni trgovacki znacaj;
� Udruge koje su osnovale državna tijela ili jedinice lokalne samouprave.
6.2.2. Postupci javne nabave
Zakon o javnoj nabavi [Hrvatski sabor, 2007] uspostavlja pet postupaka javne nabave:
� otvoreni postupak javne nabave - postupak u kojem svaki zainteresirani gospodarski subjekt
može podnijeti ponudu
� ograniceni postupak javne nabave - postupak u kojem svaki zainteresirani gospodarski su-
bjekt može zatražiti da sudjeluje u postupku, pri cemu samo oni gospodarski subjekti koje
narucitelj pozove mogu podnijeti ponudu
� pregovaracki postupak javne nabave - postupak u kojem se narucitelj obraca gospodarskim
subjektima po vlastitom izboru i dogovara uvjete ugovora s jednim ili više gospodarskih su-
bjekata
� natjecaj - postupak koji omogucava dobivanje plana ili projekta koji je odabrao ocjenjivacki
sud, uglavnom u podrucju prostornog planiranja, arhitekture i graditeljstva, inženjerstva ili
obrade podataka, nakon provedenog natjecaja, s dodjelom ili bez dodjele nagrada
� natjecateljski dijalog - postupak u kojem svaki zainteresirani gospodarski subjekt može za-
tražiti da sudjeluje u postupku, pri cemu narucitelj s natjecateljima primljenim u taj postupak
vodi dijalog s ciljem razvijanja jednog ili više prikladnih rješenja koja mogu udovoljiti njego-
vim zahtjevima
Za nabave velike vrijednosti javni narucitelj može birati izmedu otvorenog i ogranicenog pos-
tupka javne nabave. U posebnim slucajevima i okolnostima smije primijeniti pregovaracki postupak
s prethodnom objavom ili bez prethodne objave, a u posebnim okolnostima može koristiti natjeca-
teljski dijalog.
Za nabave male vrijednosti narucitelji mogu koristiti otvoreni, ograniceni i pregovaracki postu-
pak javne nabave, okvirni sporazum i elektronicku dražbu.
13
6.2.3. Zakonodavni i institucionalni okvir
Zakonodavni okvir sustava javne nabave u Republici Hrvatskoj cine[Republika Hrvatska Minis-
tarstvo pravosuda, 2011]:
� Zakon o javnoj nabavi (ZJN), - 90/2011 [Hrvatski sabor, 2007] - ovim se Zakonom ureduju
postupci sklapanja ugovora o javnoj nabavi i okvirnih sporazuma radi nabave robe, radova ili
usluga, pravna zaštita u vezi s tim postupcima i nadležnost središnjeg tijela državne uprave
nadležnog za sustav javne nabave;
� Zakon o koncesijama – NN 125/08 [Hrvatski sabor, 2008b]- ovim se Zakonom ureduju pos-
tupci davanja koncesija, ugovor o koncesiji, prestanak koncesije, pravna zaštita u postupcima
davanja koncesije, politika koncesija, te druga pitanja u vezi s koncesijama;
� Zakon o javno-privatnom partnerstvu – NN 129/08 i 55/11 [Hrvatski sabor, 2008a]- ovim
se Zakonom ureduje postupak predlaganja i odobravanja prijedloga projekata javno-privatnog
partnerstva, pracenje provedbe projekata javno-privatnog partnerstva, sadržaj ugovora o javno-
privatnom partnerstvu te nadležnosti Agencije za javno-privatno partnerstvo;
� Zakon o Državnoj komisiji za kontrolu postupaka javne nabave – NN 21/10 [Hrvatski
sabor, 2013]- ovim se Zakonom ureduje nadležnost Državne komisije za kontrolu postupaka
javne nabave i druga pitanja vezana za rad Državne komisije.
6.2.4. Nadležne institucije
Za sustav javne nabave nadležno je nekoliko ministartsva i agencija[Republika Hrvatska Minis-
tarstvo pravosuda, 2011]:
� Ministarstvo gospodarstva , Uprava za sustav javne nabave - analizira provedbu propisa u
podrucju javne nabave te je nadležna za izobrazbu i usavršavanje u javnoj nabavi;
� Ministarstvo financija - nadležno za razvoj, unapredenje i koordinaciju sustava politike kon-
cesija i ocjenu proracunskih rizika u podrucju javno-privatnog partnerstva te vodi Registar
koncesija koji predstavlja cjelovitu elektronicku evidenciju ugovora o svim koncesijama;
� Agencija za javno-privatno partnerstvo - u suradnji s nadležnim tijelima državne uprave
ocjenjuje predložene projekte i donosi mišljenja o projektima koji se mogu provoditi prema
modelu JPP-a;
� Državna komisija za kontrolu postupaka javne nabave - samostalno i neovisno državno
tijelo cija se nadležnost ostvaruje kroz rješavanje žalbi u postupcima javne nabave, postupcima
davanja koncesija te javno-privatnog partnerstva.
14
7. Implementacija automatiziranog sustava javne nabave
U ovom poglavlju bit ce opisana arhitektura sustava javne nabave koji je implementiran u sklopu
ovog rada te uloge pojedinih komponenti i nacin implementacije.
7.1. SPADE platforma
Slika 7.1: SPADE logo1
SPADE (Smart Python multi-Agent Development Environ-
ment) [Gregori et al., 2006] je platforma za razvoj višeagent-
nih sustava bazirana na XMPP/Jabber tehnologiji i pisana u
programskom jeziku Python. Platforma je razvijena 2005. go-
dine na Politehnickom Sveucilištu u Valenciji. Stvorena je kao
dokaz koncepta za testiranje tehnologije za instant poruke (bazirane na XML-u) kao transportnog
protokola za inteligentne agente.
Slika 7.2: Pregled SPADE platforme2
SPADE platforma bazirana je na skupu standarda, a najvažniji medu njima su FIPA 3 i XMP-
P/Jabber 4. Treba naglasiti da je SPADE prva platforma za razvoj višeagentnih sustava temeljena na
XMPP tehnologiji.
1Izvor: https://code.google.com/p/spade2/2Izvor: https://code.google.com/p/spade2/3FIPA (The Foundation for Intelligent Physical Agents) - organizacija za razvoj i sastavljanje standarda za heterogene
i interaktivne te agentno-bazirane sustave4XMPP (Extensible Messaging and Presence Protocol) - komunikacijski protokol baziran na XML-u izvornog naziva
Jabber. Poznat po tome što ga koriste Facebook Chat, Google Chat, i dr.
15
7.2. Znacajke
Glavne znacajke SPADE platforme su:
� Razvoj korištenjem Python programskog jezika
� Pokrivenost FIPA standarda
� P2P komunikacija izmedu agenata
� Podržava FIPA-SL i RDF jezike za opis strukturiranih informacija
� Modeli ponašanja: ciklicko, periodicko, jednokratno, aktivno, Jednokratno s vremenskim od-
makom, bazirano na dogadajima
� Podrška za komunikaciju s ostalim agentima korištenjem razlicitih transportnih protokola:
JADE 5 (preko HTTP i XMPP) i SIMBA.
� Web graficko sucelje
7.3. Web graficko sucelje
Web graficko sucelje temelji se na HTTP protokolu i moguc je pristup sa mnogih uredaja. Glavne
znacajke web grafickog sucelja su:
� Sucelje je podesivo kroz predloške
� Svaki agent identificira se kroz QR kod
� Introspekcija agenata
� Njuškanje (sniffer) poruka
� Pretraživanje agenata i usluga
5JADE (Java Agent Development Framework) - java framework za višeagentne sustave
16
7.4. Opis arhitekture sustava
Predloženi prototip sustava se sastoji od tri glavne komponente:
� Web sucelje
� Višeagentni sustav
� Baza podataka
7.4.1. Web sucelje
Web sucelje predstavlja najviši sloj automatiziranog sustava te omogucuje interakciju s koris-
nikom. Kada korisnik unese parametre ponude/natjecaja, zapisuju se u bazu i pokrece se agent
specifican za tu ponudu ili natjecaj. Preko web sucelja moguce je pratiti trenutne natjecaje, njihov
status i dobivenu ponudu ukoliko je natjecaj završio. Ponudaci mogu kreirati i pratiti svoje ponude,
njihov status u pregovaranjima itd.
7.4.2. Višeagentni sustav
Višeagentni sustav predstavlja najvažniji dio automatiziranog sustava. Agenti primaju parametre
ponude/natjecaja te sukladno tome pregovaraju s drugim agentima kako bi se izborili za najpovolj-
nije rješenje. Agenti se dijele na dvije osnovne uloga. Uloga narucioca i uloga ponudaca. Agent
narucioca ima ulogu da prati prijavljene ponude i pregovara s njima, dok agent ponudaca prati na-
tjecaje, prijavljuje se na njih i pregovara a agentima narucioca.
7.4.3. Baza podataka
Baza podataka predstavlja temeljni dio aplikacije jer se svi važni podaci za funkcioniranje sus-
tava upisuju i citaju iz baze podataka. Uvidom u bazu podataka, agenti se prijavljuju na odgovarajuce
natjecaje prema prije zadanim kriterijima, a narucitelji odabiru odgovarajuce ponude. U bazu poda-
taka zapisuju rezultati natjecaja kako bi bio omogucen uvid u web aplikaciji.
17
7.5. Dijagram prikaza rada sustava
Dijagram jasnije prikazuje funkcionalnost sustava koja je navedena u prijašnjim poglavljima.
Slika 7.3: Dijagram prikaza rada sustava
Jasno se vidi da postoje dvije vrste korisnika (narucitelj i ponudac) koji podatke unose u aplika-
ciju koja ih zatim sprema u bazu podataka i pokrece agenta dajuci mu potrebne parametre za ispravan
rad. Agenti koriste bazu podataka za upis/citanje ponude/natjecaja. Podaci iz baze vidljivi su u web
sucelju.
Svaki agent jednoznacno je identificiran korištenjem kombinacije korisnickog imena, id-a na-
tjecaja/ponude te oznakom "n" za natjecaj i "p" za ponudaca. Nakon završetka natjecaja, graficko
web sucelje prikazuje status natjecaja i dobivenu ponudu citajuci podatke iz baze podataka koju
popunjava agent natjecaja.
18
7.6. ERA model
ERA model aplikacije sastoji se od nekoliko tablica, a najvažnije su:
� Natjecaj - sadrži sve bitne podatke vezane uz kreirane natjecaje
� Ponuda - sadrži sve bitne podatke vezane uz kreirane ponuda
� Natjecaj_Ponuda - sadrži podatke vezane uz prijavljene ponude na odredene natjecaje
Osim navedenih, postoje i ostale tablice za spremanje razlicitih vrsta podataka neophodnih za funk-
cioniranje sustava. To su:
� Korisnik - sadrži sve bitne podatke o registriranom korisniku
� Uloga - povezana sa tablicom korisnika, a predstavlja ulogu korisnika u sustavu
� Tvrtka - omogucuje povezivanje korisnika sa tvrtkom
� Glavni_rjecnik - tablica sadrži sve CPV oznake i vezana je uz tablice natjecaja i ponude.
Pretraživanje tablice omoguceno je u web grafickom sucelju.
� Dodatni_rjecnik - sadrži CPV oznake dodatnog rjecnika. U natjecaj i ponudu dodatna oznaka
unosi se samo ukoliko je to potrebno.
� Status - predstavlja status natjecaja ili ponude. Pomocu statusa imamo uvid da li je natjecaj
završen ili je u tijeku. Isto vrijedi i za ponudu. Takoder, status oznacava da li je ponuda
pobijedila u nekon natjecaju.
� Potez - oznacava koji agent je trenutno na potezu za unos ponude. Ova tablica je zamišljena
kao pomoc ukoliko dode do greške u sustavu kako bi se kasnije dogadaj mogao vratiti na
prijašnje stanje.
� Kriterij_odabira - oznacava kriterij odabira neke ponude i vezan je za tablicu natjecaj. Mo-
guci kriteriji odabira su najpovljnija cijena ili ekonomski najpovoljnija ponuda
Na sljedecoj stranici nalazi se kompletan prikaz ERA dijagrama.
19
7.7. Natjecaji i ponude
Kako bi proces prijava na natjecaje bio automatiziran, korisnik treba kreirati natjecaj koji ce
provjeravati ima li u bazi ponuda koje su prijavljene na taj natjecaj, odnosno, ponudu koja ce pro-
vjeravati ima li u bazi natjecaja na koje se ponuda može prijaviti.
Kriterij prema kojemu ponudac raspoznaje kompatibilan natjecaj, je CPV oznaka. CPV pred-
stavlja oznaku jedinstvenog rjecnika javne nabave za svaku robu i/ili uslugu[Hrvatski sabor, 2012].
CPV oznaka može se pretražiti unutar aplikacije po kljucnim rijecima. Prikaz forme nalazi se na
sljedecoj slici.
Slika 7.5: Prikaz rezultata pretraživanja unutar aplikacije za traženi pojam "bicikl"
CPV oznaka je razvijena od strane Europske Unije za javnu nabavu. Osnovana je uredbom (EC)
Broj 2195/2002 Europskog parlamenta i Vijeca o Jedinstvenom rjecniku javne nabave (CPV). Valja
naglasiti kako je CPV broj jednak za sve jezike, dok tekstualni opis može varirati.
21
7.8. Struktura Jedinstvenog rjecnika javne nabave (CPV)
Uredba o uvjetima primjene Jedinstvenog rjecnika javne nabave (CPV) [Vlada Republike Hrvat-
ske, 2008] donesena u sijecnju 2008. godine nalaže sljedecu strukturu Jedinstvenog rjecnika javne
nabave (CPV):
� CPV se sastoji od glavnog rjecnika i dodatnog rjecnika.
� Glavni se rjecnik temelji na hijerarhijskoj strukturi koja se sastoji od najviše devet znamenki
uz koje se nalazi tekst kojiopisuje vrstu robe, radova ili usluga koji cine predmet nabave.
� Brojcana oznaka Glavnog rjecnika se sastoji od osam znamenki, podijeljenih kako slijedi:
• prve dvije znamenke oznacuju odjeljke (XX000000-Y);
• prve tri znamenke oznacuju skupine (XXX00000-Y):
• prve cetiri znamenke oznacuju razrede (XXXX0000-Y);
• prvih pet znamenki oznacuju kategorije (XXXXX000-Y).
� Svaka od zadnje tri znamenke u Glavnom rjecniku predstavlja precizniju oznaku unutar svake
kategorije.Deveta znamenka Glavnog rjecnika služi za provjeru prethodnih znamenki.
� Dodatni rjecnik se može koristiti za proširenje opisa predmeta nabave. Stavke se sastoje od
alfanumericke oznake, uz koju se nalazi odgovarajuci tekst koji omogucuje podrobniji opis
posebne vrste ili odredišta predmeta nabave koji se nabavlja.
� Alfanumericka oznaka Dodatnog rjecnika se sastoji od:
• prve razine koju cini jednoslovna oznaka podrucja
• druge razine koju cine cetiri znamenke, od kojih prve tri oznacuju pododjeljke, dok zad-
nja znamenka služi za provjeru.
22
7.9. Unos natjecaja
Polja za unos natjecaja potrebno je pažljivo ispuniti jer uvelike ovise o ishodu natjecaja i odabira
"bolje" ponude. Izgled forme prikazan je na sljedecoj slici.
Slika 7.6: Prikaz forme natjecaja
Potrebno je obratiti pozornost na neka polja i procitati kratke upute pisane ispod samih polja
za unos. Npr. zbroj korisnosti unosimo u postotcima i logicko je da zbroj treba iznositi 100 inace
natjecaj nece biti unesen. Takoder, ne treba pretjerivati u zahtjevima i unositi pretjeranu korisnost jer
vrlo je moguce da agent nece postici sporazum sa nijednim drugim agentom zbog izuzetno visokih
kriterija. Kod unosa strategije takoder treba obratiti pozornosti i unijeti razumne vrijednosti u obliku
postotka.
23
Polja koja narucitelj mora ispuniti su:
� CPV glavna oznaka
� CPV dodatna oznaka (ukoliko je potrebno)
� Naziv i istek natjecaja - nakon isteka natjecaja, agent odabire najbolju ponudu i gasi se
� Jedinica mjere
� Najmanja i najveca kolicina - bitno je napomenuti da, ukoliko korisnik ne želi pregovaranje
o kolicini, unese iste vrijednosti
� Procijenjena vrijednost natjecaja i maksimalna vrijednost natjecaja
� Minimalni i maksimalni rok isporuke (u danima)
� Kriterij odabira najbolje ponude - ukoliko korisnik odabere najbolju cijenu bez pregovara-
nja, ne treba unositi funkciju korisnosti, strategiju, minimalnu korisnost te vrijeme pregovara-
nja
� Korisnost - predstavlja davanje važnosti odredenim atributima u postotcima pa tako zbroj
treba iznositi 100
� Strategija - predstavlja promjenu vrijednosti u svakom krugu pregovaranja te povecavanje/-
smanjivanje atributa u skladu s time izraženih u postotku
� Minimalna korisnost - unosi se u obliku postotka i predstavlja najmanju korisnost za prihva-
canje ponuda. Ispod te korisnosti, agent nece prihvacati ponude.
� Kljucne rijeci - predvidene su za bolje pretraživanje natjecaja i ponuda
Natjecaj se zatim unosi u bazu podataka i pokrece se agent zadužen za taj natjecaj cija je uloga pratiti
dospjele ponude te na kraju odabrati najpovoljniju prema od prije zadanim kriterijima. Ukoliko
je kriterij odabira ekonomski najpovoljnija ponuda, tada agent narucitelja pregovara sa agentima
ponudaca te prema navedenim parametrima (korisnost, trajanje pregovaranja, strategija) odgovara
na ponude. Ukoliko je kriterij najpovoljnija ponuda, tada agent odabire najpovoljniju inicijalnu
ponudu bez pregovaranja.
24
7.10. Unos ponude
Ponudac treba ispuniti zadana polja na ispravan i pažljiv nacin kako bi agent ispravno pregovarao
i pokušao dobiti što bolje uvjete. Izgled forme prokazan je na sljedecoj slici.
Slika 7.7: Prikaz forme ponude
Pravila za unos su slicna kao i kod unosa natjecaja (p. 5.8.). Ponudac je dužan unijeti postotke
korisnosti, strategiju prema istim kriterijima kao i narucilac.
25
Polja koja ponudac mora ispuniti su:
� CPV glavna oznaka
� CPV dodatna oznaka (ukoliko je potrebno)
� Naziv i istek ponude - nakon isteka ponude, agent se gasi
� Jedinica mjere
� Najmanja i najveca kolicina za isporuku robe, usluge, itd.
� Najniža i najviša jedinicna cijena - jedinicna cijena predstavlja važnu stavku u kreiranju
korisnosti
� Minimalni i maksimalni rok isporuke (u danima)
� Korisnost - predstavlja davanje važnosti odredenim parametrima u postotcima pa tako zbroj
treba iznositi 100
� Strategija - predstavlja promjenu vrijednosti u svakom krugu pregovaranja te povecavanje/-
smanjivanje atributa u skladu s time izraženih u postotku
� Minimalna korisnost - unosi se u obliku postotka i predstavlja najmanju korisnost za prihva-
canje ponuda. Ispod te korisnosti, agent nece prihvacati ponude.
� Kljucne rijeci - predvidene su za bolje pretraživanje natjecaja i ponuda
Ponuda se unosi u bazu podataka i pokrece se agent koji prati natjecaje na koje je moguca prijava
ponude. Bitno je naglasiti da ponudac unosi najvecu i najmanju kolicinu koju je spreman prodati
te najmanju i najvecu jedinicnu cijenu. Prema tim parametrima se izracunava ponuda odredenu
kolicinu proizvoda koju narucitelj traži.
26
7.11. Strategije pregovaranja i njihova implementacija
Agenti su implementirani korištenjem SPADE platforme i Python programskog jezika. Tran-
sakcija se može sastojati od nekoliko vrijednosti (u ovom primjeru 3) iz kojih se racuna korisnost
funkcije i na temelju kojih se racuna protuponuda.
Funkcija korisnosti oznacena je sa V a. Interpretacija ponude xtb→a agenta u intervalu t′(t < t′)
definirana je na sljedeci nacin:
Ia(t′, xtb→a) =
odbij ako t′ > tamax
prihvati ako V a(xtb→a) > V a(xt′
a→b)
inace xt′
a→b
� V a(xt′
a→b) predstavlja ponudu koju bi agent a ponudio agentu b u trenutku t′
� tamax predstavlja najkasniji trenutak u kojem agent a mora završiti pregovor
Transakcija se sastoji od triju vrijednosti (i, j, k) te je svaka vrijednost u intervalu [0, 1]
Funkcije korisnosti agenata su:
V a(i, j, k) = 0.2i− 0.1j + 0.7k
V b(i, j, k) = −0.4i+ 0.3j − 0.3k
U Python-u je gotovo sve realizirano pomocu lista jer zbog jednostavnosti, a ukoliko string nije lista,
rastavlja se i pretvara u listu zbog racunanja. Funkcije korisnosti definirane su na nacin da svaki clan
u listi predstavlja odredenu vrijednost iz (i, j, k). U slucaju agenta A to bi izgledalo ovako:
self.funkcija_korisnosti = [0.2, -0.1, 0.7]
Inicijalne ponude agenata u trenucima t = 0 i t = 1 su:
x0a→b = (0.9, 0.1, 0.9)
x1b→a = (0.1, 0.8, 0.2)
Inicijalne ponude su takoder implementirane vrlo jednostavno pomocu lista. Sljedeci primjer poka-
zuje jednu od inicijalnih ponuda:
self.inicijalna_ponuda = [0.9, 0.1, 0.9]
27
Strategije ponuda u ovom primjeru definirane su na sljedeci nacin:
Sa(xt) −→ (xt[i]− 0.1, xt[j] + 0.1, xt[k]− 0.2) uz V amin = 0.30
Sb(xt) −→ (xt[i] + 0.2, xt[j]− 0.2, xt[k] + 0.1) uz V bmin = −0.25
Strategije ponuda su implementirane pomocu lista. Sljedeci primjer pokazuje jednu od strategija
ponuda:
self.strategije_ponuda = [-0.1, 0.1, -0.2]
Najkasniji trenuci (u mojem primjeru) za završavanje pregovora su:
tamax = 10
tbmax = 8
Sljedeci primjer pokazuje kako su definirani najkasniji trenuci:
self.t_max = 10
Za primjer cu prikazati prvu iteraciju, a ostale se racunaju analogno i uvijek se provjeravaju
funkcije korisnosti i jednostavno, ukoliko je korisnost naše ponude veca od korisnosti primljene,
tada dajemo protuponudu, a ako je korisnost primljene ponude veca od naše protuponude, tada jed-
nostavno prihvacamo primljenu ponudu i pregovaranje završava.
Interpretacija agenta A ponude x1b→a
V a(0.1, 0.8, 0.2) = 0.2 · 0.1− 0.1 · 0.8 + 0.7 · 0.2 = 0.08
x2a→b = (0.8, 0.2, 0.7)
V a(0.1, 0.8, 0.7) = 0.2 · 0.8− 0.1 · 0.2 + 0.7 · 0.8 = 0.63
Korisnost sljedece ponude je veca od korisnosti primljene ponude, tako da šaljemo protuponudu.
Interpretacija je sljedeca:
Ia(t2, x1b→a)
28
U Python-u su definirane metode za izracun korisnosti te za izracun strategije, tj. protuponude
na sljedeci nacin:
Metoda korisnost uzima listu primljene ponude te obavlja izracun svakog clana liste primljene po-
nude sa svakim clanom liste iz funkcije korisnosti, a nakon toga zbraja sve rezultate te se tako dobiva
korisnost obiju ponuda.
def Korisnost( self, ponuda ):
tmp = 0
k = 0
if isinstance(ponuda, str):
p = eval(ponuda)
else:
p = ponuda
f = self.funkcija_korisnosti
for i in range(len(p)):
tmp = f[i] * p[i]
k += tmp
return k
Nakon izracuna korisnosti primljene ponnude, potrebno je izracunati vlastitu ponudu pomocu
metode strategija. Ovisno o definiranoj strategiji, svaki clan liste strategije_ponuda se, ovisno o
operaciji, izracunava sa prethodnom ponudom koju smo poslali, a ukoliko smo u prvoj iteraciji, tada
sa inicijalnom ponudom.
def Strategija( self, ponuda ):
tmp = 0
s = []
if isinstance(ponuda, str):
p = eval(ponuda)
else:
p = ponuda
f = self.strategije_ponuda
for i in range(len(p)):
self.tmp = p[i] + f[i]
s.append(round(self.tmp,2))
return s
29
7.12. Primjer prijave i pregovaranja
Za primjer pregovaranja i prijave koristit ce se javna nabava lož ulja. Na dan 4.3.2013. cijena
litre Lož ulja iznosila je 6.81 kn/l 6.
Tvrtka A nabavlja 4500-5500 litara lož ulja (razlog ne navodenja konkretnog iznosa je poticanje
na pregovaranja) te je procijenjena vrijednost natjecaja 34000 kn a maksimalna moguca cijena iznosi
37400 kn. Raspon roka isporuke krece se od 5 do 30 dana. Kriterij odabira je ekonomski najpovolj-
nija cijena. Korisnost cijena:kolicina:rok isporuke iznosi 50%:30%:20%. Strategija tj. promjena
parametara tijekom pregovora je cijena:kolicina:rok isporuke +2%:-1%:+1%.
Tvrtka B nudi kolicinu 1000 - 10000 litara lož ulja po jedinicnoj cijeni od 5.8 - 7.0 kn uz rok
isporuke od 7 - 40 dana. Korisnost cijena:kolicina:rok isporuke iznosi 40%:40%:20%. Strategija
tj. promjena parametara tijekom pregovora je cijena:kolicina:rok isporuke -1%:0%:-2% što znaci
da ponudac ne pristaje na promijenu kolicine. Najmanju korisnost i vrijeme pregovaranja nece biti
definirani u ovom primjeru kako bi vidjeli pregovaranje do samog završetka.
Kako bi sve jasnije izgledalo, parametri su zapisani u sljedecoj tablici:
Tablica 7.1: Pregled parametara
Agent Parametar Iznos
Natjecaj
Kolicina 4500-5500Procijenjena vrijednost 34000 knMaksimalna vrijednost 37400 knRok isporuke 5-30 danaKorisnost cijene 50%Korisnost kolicine 30%Korisnost roka isporuke 20%Strategija cijene +2%Strategija kolicine -1%Strategija roka isporuke +1%
Ponuda
Kolicina 1000-10000Najmanja jedinicna cijena 5.8 kn/lNajveca jedinicna cijena 7.0 kn/lRok isporuke 7-40 danaKorisnost cijene 50%Korisnost kolicine 30%Korisnost roka isporuke 20%Strategija cijene +2%Strategija kolicine -1%Strategija roka isporuke +1%
6INA - cjenik goriva - http://www.ina.hr/?id=203
30
Agent ponudaca se prijavljuje na natjecaj pa samim time daje i inicijalnu ponudu. Inicijalna
ponuda predstavlja 100-postotnu korisnost za ponudaca s obzirom na uvjete natjecaja. Naravno,
100% korisnosti za ponudaca znaci gotovo nikakvu korisnost za agenta natjecaja pa on daje svoju
inicijalnu ponudu i tako pocinje proces pregovaranja koji ce detaljno biti sada prikazan.
T0
x0p→n
V a(38500, 5500, 30) = 38500 · 0.4− 5500 · 0.4 + 30 · 0.2 = 17606
Kako je ponudacu u interesu prodati što više roba/usluga po što vecoj kolicini i uz što duži rok
isporuke, inicijalna ponuda (17606) iznosi 100%, a najmanja korisnost iznosila bi prodaju velike
kolicine uz najmanju cijenu i najbrži rok isporuke (14961) tj. 0%. U sljedecim intervalima korisnosti
ce biti prikazane u postotcima radi lakše preglednosti. Dakle, ponudac šalje ponudu kolicine od 5500
(što je maksimalno s obzirom na intevral natjecaja) po najvišoj cijeni od 7 kn/l što iznosi 38500 kn
uz najduži moguci rok isporuke od 30 dana.
T1
x1n→p
V p(31900, 5500, 5) = −31900 · 0.5 + 5500 · 0.3− 5 · 0.2 = −14301
Kako je agentu natjecaja u interesu kupiti što više roba/usluga po što nižoj cijenu i uz što kraci rok
isporuke, inicijalna ponuda (-14301) iznosi 100%, a najmanja korisnost iznosila bi kupnju velike
kolicine uz najvišu cijenu i najduži rok isporuke (-17606) tj. 0%. Dakle, agent natjecaja šalje
ponudu kolicine od 5500 (što je maksimalno s obzirom na intevral natjecaja) po najmanjoj cijeni
agenta od 5.8 kn/l što iznosi 31900 kn uz najkraci moguci rok isporuke od 5 dana.
T2
x2n→p
V n(31900, 5500, 5) = 31900 · 0.4− 5500 · 0.3 + 29.4 · 0.2 = 0.0%
x2p→n = (38115, 5500, 29.4)
V p(38115, 5500, 29.4) = 38115 · 0.4− 5500 · 0.4 + 29.4 · 0.2 = 94.17%
Sljedecu ponudu izracunavamo prema unaprijed unesenoj strategiji (Cijena - 1%, Kolicina +0%,
Rok isporuke - 2%), što primjenjeno na prijašnju ponudu (38500, 5500, 30) iznosi [38115, 5500,
29.4]. Jasno se vidi da je korisnost izracunate ponude mnogo veca od korisnosti ponude natjecaja
koju smo primili pa šaljemo ponudu s korisnošcu od 94.17% agentu natjecaja.
31
Interpretacija je sljedeca:
Ip(t2, x1n→p) = x2
p→n
T3
x2p→n
V p(38115, 5500, 29.4) = 38115 · 0.5− 5500 · 0.3 + 29.4 · 0.2 = 5.83%
x3n→p = (32538, 5445, 5, 05)
V n(32538, 5445, 5, 05) = −32538 · 0.5 + 5445 · 0.3− 5, 05 · 0.2 = 89.85%
Sljedecu ponudu izracunavamo prema unaprijed unesenoj strategiji (Cijena + 2%, Kolicina - 1%,
Rok isporuke + 1%), što primjenjeno na prijašnju ponudu (31900, 5500, 5) iznosi [32538, 5445,
5,05]. Jasno se vidi da je korisnost izracunate ponude mnogo veca od korisnosti ponude koju smo
primili pa šaljemo ponudu s korisnošcu od 89.85% agentu ponude.
Interpretacija je sljedeca:
In(t3, x2p→n) = x3
n→p
T4
x3n→p
V n(32538, 5445, 5, 05) = 8.82%
x4p→n = (37733, 85, 5500, 28, 81)
V p(37733, 85, 5500, 28, 812) = 88.40%
Ponudu takoder izracunavamo prema strategiji s obzirom na prijašnju ponudu Jasno se vidi da je
korisnost izracunate ponude mnogo veca od korisnosti ponude natjecaja koju smo primili pa šaljemo
ponudu s korisnošcu od 88.40% agentu natjecaja.
Interpretacija je sljedeca:
Ip(t4, x3n→p) = x4
p→n
T5
x4p→n
V p(37733, 85, 5500, 28, 812) = 11.60%
x4n→p = (33188, 76, 5390, 55, 5, 10)
V n(33188, 76, 5390, 55, 5, 1005) = 79.51%
Interpretacija je sljedeca:
In(t5, x4p→n) = x5
n→p
32
T6
x5n→p
V n(33188, 76, 5390, 55, 5, 1005) = 17.84%
x6p→n = (37356, 51, 5500, 28, 23)
V p(37356, 51, 5500, 28, 23) = 82.69%
Interpretacija je sljedeca:
Ip(t6, x5n→p) = x6
p→n
T7
x6p→n
V p(37356.5115, 5500, 28.23576) = 17.31%
x7n→p = (33852.53, 5336.6445, 5.15)
V n(33852.53, 5336.6445, 5.15) = 68.98%
Interpretacija je sljedeca:
In(t7, x6p→n) = x7
n→p
T8
x7n→p
V n(33852.53, 5336.6445, 5.15) = 27.06%
x8p→n = (36982.94, 5500, 27.67)
V p(36982.94, 5500, 27.67) = 77.04%
Interpretacija je sljedeca:
Ip(t8, x7n→p) = x8
p→n
T9
x8p→n
V p(36982.94, 5500, 27.67) = 22.96%
x9n→p = (34529.58, 5283.27, 5.20)
V n(34529.58, 5283.27, 5.20) = 58.25%
Interpretacija je sljedeca:
In(t9, x8p→n) = x9
n→p
33
T10
x9n→p
V n(34529.58, 5283.27, 5.20) = 36.49%
x10p→n = (36613.11, 5500, 27.11)
V p(36613.11, 5500, 27.11) = 71.44%
Interpretacija je sljedeca:
Ip(t10, x9n→p) = x10
p→n
T11
x10p→n
V p(36613.11, 5500, 27.11) = 28.56%
x11n→p = (35220.17, 5230.44, 5.25)
V n(35220.17, 5230.44, 5.25) = 47.32%
Interpretacija je sljedeca:
In(t11, x10p→n) = x11
n→p
T12
x11n→p
V n(35220.17, 5230.44, 5.25) = 46.14%
x12p→n = (36246.99, 5500, 26.57)
V p(36246.99, 5500, 26.57) = 65.90%
Interpretacija je sljedeca:
Ip(t12, x11n→p) = x12
p→n
T13
x12p→n
V p(36246.99, 5500, 26.57) = 34.11%
x13n→p = (35924.58, 5178.14, 5, 30)
V n(35924.58, 5178.14, 5, 30) = 36.19%
Interpretacija je sljedeca:
In(t13, x12p→n) = x13
n→p
34
T14
x13n→p
V n(35924.58, 5178.14, 5, 30) = 56.00%
x14p→n = (35884.51, 5500, 26.04)
V p(35884.51, 5500, 26.04) = 60.42%
Interpretacija je sljedeca:
Ip(t14, x13n→p) = x14
p→n
T15
x14p→n
V p(35884.51, 5500, 26.04) = 39.59%
x15n→p = (36643.07, 5126.36, 5.36)
V n(36643.07, 5126.36, 5.36) = 24.85%
Primjecujemo da je korisnost primljene ponude veca od korisnosti ponude koju bu natjecaj poslao
agentu ponude. U tom slucaju ponuda se prihvaca i pregovori završavaju sa cijenom od 35884.51
kn, 5500 litara i 26.04 dana. Što znaci da cijena po litri iznosi 6.52 kune što je nešto niže od 6.81.
Vidimo da je ponuda u intervalima oba agenta što je vrlo bitno jer u protivnom, agent ciji raspon nije
u skladu s definiranim, prekida pregovaranje.
Korisnost za agenta natjecaja iznosi: 39.59 %
Korisnost za agenta ponude iznosi: 60.42 %
Pregovori su mogli biti i nastavljeni ili prekinuti ranije ukoliko bi postavili T ili minimalnu
korisnost jer vidimo da je agent ponude u ovom primjeru "prošao" prilicno dobro sa korisnošcu od
60.42 %. Strategija pregovora uvelike ovisi o krajnjoj korisnosti.
Bitno je spomenuti da su parametri odabrani kako bi se prikazao primjer pregovaranja. Umjesto
cijene, kolicine i roka isporuke mogli bi dodati još razne parametre, ali za pokazni primjer 3 para-
metra su dovoljna.
Naravno, Agent natjecaja istovremeno pregovara sa više agenata te na kraju natjecaj dobiva agent
cija ponuda ima najvecu korisnost za agenta natjecaja.
U aplikaciji je implementirana mogucnost odabira kriterija bez pregovaranja što znaci da se
ponudaci jave na natjecaj s odredenom ponudom, a odabire se najniža cijena bez pregovaranja.
35
8. Povezana istraživanja
U ovo poglavlju navest ce se povezana istraživanja koja se bave slicnim podrucjima istraživanja.
Potrebno je naglasiti da potpuno iste tematike nema ni u Hrvatskoj, a ni u svijetu, što ovom radu
da je još vecu vrijednost. Sustav e-javne nabave postoji u mnogim državam svijeta, ali ne u obliku
višeagentnog sustava sa automatiziranim pregovaranjem.
Sustava e-javne nabave implementiran je u Južnoj Koreji 2002. godine [Si Kyung Seong, 2004].
Sustav e-javne nabave prepoznat je kao uspješan od strane vlade. U clanku se opisuju sustavi e-javne
nabave u Koreji, razvoji procesi te faktori za uspješnu implementaciju sustava. Opisane su i uloge
predsjednika, ministara i raznih agencija za koji su široko podržali ideju uvodenja e-nabave davne
2002. godine.
Višeagentni sustav baziran na pregovaranju za opskrbni lanac [Chen et al., 1999] implementiran
je na Sveucilištu Maryland. Autori su Ye Chen, Yun Peng, Tim Finin, Yannis Labrou i Scott Cost.
Opisani su agenti u opskrbnom lancu te donošenje njihovih odluka. Opskrbni lanac implementiran
je kroz agentno pregovaranje. Kada narudžba stigne, porlazi kroz opskrbni lanac kroz automatsko
ili polu-automatsko pregovaranje izmedu agenata. U clanku su dani kratki primjeri i analize prego-
varanja.
Sljedece povezano istraživanje o pregovaranju i kooperaciji u višeagentnoj okolini [Kraus, 1997].
Autor Sarit Kraus sa Sveucilišta Bar llan u Izraelu predstavlja razvoj racunalnih sustava koji su u
mogucnosti suradivati iz raditi zajedno predstavlja kao izazov. Kao primjer sustava koji dobro sura-
duje navode se dijelovi racunala (disk, pisac, procesor, itd.). Primjer inteligentnih sustava ukljucuje
npr. automatizirane agente koji prate elektricno naponsku mrežu, tim robotskih sustava koji djeluju
u neprijateljskim okruženjima, programski agenti koji olakšavaju distribuiran dizajn i inženjering,
distribuirani sustavi za transport i planiranje, internet agenti koji suraduju kako bi pružili ažurne in-
formacije svojim korisnicima. U clanku se navode još strategijski modeli pregovaranja za dijeljenje
resursa i distribuciju zadataka, primjenu klasicne mehanike u velikim agentnim sustavima, primjena
tehnika operacijskih istraživanja te Primjena neformalnih modela ponašanja i društvenih znanosti na
automatiziranim agentima. Istraživanje datira iz 1997. godine te je poprilicno napredno za ono doba
ako uzmemo u obzir razvoj višeagentnih sustava.
Clanak s Londonskog Sveucilišta [Bigham and Du, 2003] govori o pregovarackom pristupu za
kontrolu pokrivenosti mobilne mreže u realnom vremenu. Performanse cijele mobilne mreže su
poboljšane ugovaranjem i oblikovanjem antenskog zracenja oko tzv. "hot spotova". U clanku je
dokazano pregovaranje izmedu baznih stanica vodi prema dogovoru optimalne pokrivenosti koji ima
doseg kroz cijelu mobilnu mrežu. Rezultat pregovaranja bila bi inteligentna mobilna pokrivenost s
obzirom na distribuciju geografskog prometa mreže u realnom vremenu.
36
9. Zakljucak
Ovim diplomskim radom naglašena je važnost pregovaranja u današnjem poslovanju. Naglasak
je bio na automatiziranom pregovaranju u B2B e-poslovanju koje poprima sve vece razmjere rastom
informacijskih tehnologija i inteligentnih sustava. Višeagentni sustavi omogucuju velike transakcij-
ske i vremenske uštede u poslovanju. Programski agenti u mogucnosti su prilagoditi se razlicitim
okružjima te donositi važne odluke bez potrebe za povratnom informacijom od korisnika.
U sklopu ovog rada implementiran je višeagentni sustav javne nabave temeljem automatiziranog
pregovaranja. Izradom sustava javne nabave temeljem automatiziranog pregovaranja otvaraju se sa-
svim nove mogucnosti. Javna nabava postala bi brža, jeftinija i sigurnija te omogucila ravnopravnije
nadmetanje. Podrucje javne nabave široko je i kompleksno te zahtjeva poseban nadzor i upravljanje
zbog velike kolicine novca. Važno je napomenuti da ovim projektom nije dan sustav koji bi odmah
mogao u komercijalnu upotrebu, vec koncept koji bi odredenim modifikacijama trebalo uskladiti
za svim zakonskim okvirima i standardima kako bi bio potpuno regularan i funkcionalan. Takve
promijene iziskuju ulaganja, ali u usporedbi s kasnijim uštedama, više su nego isplative.
Višeagentni sustav omogucuje gotovo samostalno djelovanje što znaci da radi na strani korisnika
koji je agenta kreirao. Nakon toga, agent samostalno pregovara s drugim agentima obavještavajuci
korisnika u realnom vremenu o trenutnim statusima.
Osim opisa postupka javne nabave i zakonskog okvira te opisa implementacije sustava, u ovom
radu dano je i rješenje problema kvalitativnih vrijednosti u automatiziranom pregovaranju kojeg
rješavamo korištenjem neizrazitih skupova.
Slican sustav u Republici Hrvatskoj, ali i u Svijetu ne postoji. Postoje razne e-javne nabave i u
nekim su zemljama sasvim uobicajene vec nekoliko godina. U Republici Hrvatskoj postoji nekoliko
rješenja za e-javne nabave, ali takvi sustavi ne koriste automatizirano pregovaranje i višeagentne
sustave što znaci da je ovaj sustav zasad jedinstven.
Naglim rastom e-poslovanja, potreba za automatiziranim višeagentnim sustavima rasti ce i u
bližoj buducnosti.
37
10. Literatura
[1] Bigham, J. and Du, L. (2003). Cooperative negotiation in a multi-agent system for real-time
load balancing.
[2] Chen, Y., Peng, Y., Finin, T., Labrou, Y., Chu, B., Yao, J., Sun, R., Willhelm, B., and Cost,
S. (1999). A negotiation-based multi-agent system for supply chain management. In In Pro-
ceedings of Agents 99 Workshop on Agent Based Decision-Support for Managing the Internet-
Enabled Supply-Chain, pages 15–20.
[3] Curbera, F., Duftler, M., Khalaf, R., Nagy, W., Mukhi, N., and Weerawarana, S. (2002). Unrave-
ling the web services web: An introduction to soap, wsdl, and uddi. IEEE Internet Computing,
6(2):86–93.
[4] Eunson, B. (1994). Negotiation Skills. The communication skills series. John Wiley & Sons
Australia, Limited.
[5] Faratin, P., Sierra, C., and Jennings, N. R. (1998). Negotiation decision functions for autono-
mous agents. International Journal of Robotics and Autonomous Systems, 24:3–4.
[6] Gregori, M. E., Cámara, J. P., and Bada, G. A. (2006). A jabber-based multi-agent system
platform. In Proceedings of the fifth international joint conference on Autonomous agents and
multiagent systems, AAMAS ’06, pages 1282–1284, New York, NY, USA. ACM.
[7] He, M., Jennings, N. R., and fung Leung, H. (2003). On agent-mediated electronic commerce.
IEEE Transactions on Knowledge and Data Engineering, 15:985–1003.
[8] Hrvatski sabor (2007). Zakon o javnoj nabavi. Narodne novine.
[9] Hrvatski sabor (2008a). Zakon o javno privatnom partnerstvu. Narodne novine.
[10] Hrvatski sabor (2008b). Zakon o koncesijama. Narodne novine.
[11] Hrvatski sabor (2012). Pravilnik o primjeni jedinstvenog rjecnika javne nabave (cpv). Narodne
novine.
[12] Hrvatski sabor (2013). Zakon o državnoj komisiji za kontrolu postupaka javne nabave. Na-
rodne novine.
[13] Kaliannan, M. and Awang, H. (2009). Adoption and use of e-government services: a case study
on e-procurement in malaysia. In Proceedings of the 8th WSEAS International Conference
38
on E-Activities and information security and privacy, E-ACTIVITIES’09/ISP’09, pages 88–
93, Stevens Point, Wisconsin, USA. World Scientific and Engineering Academy and Society
(WSEAS).
[14] Kraus, S. (1997). Negotiation and cooperation in multi-agent environments. Artificial Intelli-
gence, 94:79–97.
[15] Lau, R. Y. (2006). Towards a web services and intelligent agents-based negotiation system for
b2b ecommerce. Department of Information Systems, City University of Hong Kong, Tat Chee
Avenue, Kowloon, Hong Kong, China.
[16] Raïffa, H. (1982). The art and science of negotiation. Belknap Press of Harvard University
Press.
[17] Republika Hrvatska, Ministarstvo gospodarstva (2011). Statisticko godišnje izvješce o javnoj
nabavi za 2011. godinu. Uprava za sustav javne nabave.
[18] Republika Hrvatska, Ministarstvo gospodarstva (2012). Javna nabava. Cefta trade portal.
[19] Republika Hrvatska Ministarstvo pravosuda (2011). Javne nabave. Narodne novine.
[20] Si Kyung Seong, J. Y. L. (2004). Developing E-Procurement Systems: A Case Study on the
Government E-Procurement Systems in Korea. Public Finance and Management.
[21] Vlada Republike Hrvatske (2008). Uredba o uvjetima primjene jedinstvenog rjecnika javne
nabave (cpv). Narodne novine, broj 110/2007.
[22] Woolridge, M. (2002). An Introduction to MultiAgent Systems. John Wiley & Sons, LTD.
39
11. Prilozi
11.1. PRILOG 1 - Implementacija agenta narucioca
U nastavku je dan izvorni kod agenta narucioca tj. natjecaja koji se sastoji od glavne klase agenta
te potrebnim metodama za izracunavanje trenutne korisnosti, ukupne korisnosti i strategije.
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 import sys
4 import spade
5 import psycopg2
6
7 from time import sleep, localtime, strftime
8 from datetime import datetime
9
10 from spade.Agent import Agent
11 from spade.DF import ServiceDescription
12 from spade.Behaviour import OneShotBehaviour, EventBehaviour,
PeriodicBehaviour, ACLTemplate, MessageTemplate
13 from spade.ACLMessage import ACLMessage
14 import logging
15
16 con = None
17
18 try:
19 con = psycopg2.connect(host=’localhost’, dbname=’nabava’, user=’postgres’,
password=’postgres’)
20 cur = con.cursor()
21 print "Connected to database tested !!"
22 con.close()
23
24 except psycopg2.DatabaseError, e:
25 print ’Greška sa spajanjem na bazu !! %s’ % e
26 sys.exit(1)
27
28 class Natjecaj( Agent):
29 class Natjecaj_Agent( PeriodicBehaviour ):
30 def onStart(self):
31 print ’Naziv AGENTA: ’, self.myAgent.naziv
32 logging.basicConfig(filename= self.myAgent.naziv +
’.log’,level=logging.DEBUG,
33 format=’%(asctime)s %(message)s’)
40
34 self.counter = 0
35
36 def _onTick( self ):
37 print "******************************"
38 print "Vrijeme ["+strftime("%D - %H:%M:%S", localtime())+"]:
Agent[" + self.myAgent.naziv + "]"
39 print ’Brojac: ’, self.counter
40 logging.info(’Provjeravam bazu za ponudama...’)
41 try:
42 con = psycopg2.connect(host=’localhost’, dbname=’nabava’,
user=’postgres’, password=’postgres’)
43 cur = con.cursor()
44 cur.execute("SELECT count(*) FROM natjecaj_ponuda WHERE
natjecajid = %s AND potezid = 1 AND statusid IN(0,1,2)",
(self.myAgent.param1,))
45 num = cur.fetchone()
46 if (num[0] == 0):
47 logging.info(’Trenutno nema ponuda prijavljenih na natjecaj
!!’)
48 else:
49 print "Broj prijavljenih ponuda: ", num[0]
50 logging.info(’Broj prijavljenih ponuda: %s’, num[0])
51 cur.execute("SELECT * FROM natjecaj_ponuda WHERE natjecajid =
%s AND potezid = 1 AND statusid IN(0,1,2)",
(self.myAgent.param1,))
52 rows = cur.fetchall()
53 if (self.myAgent.param2 == str(2)):
54 for row in rows:
55 if (row[5] == 0):
56 cur.execute("SELECT n.najmanja_kolicina,
n.najveca_kolicina, n.procijenjena_vrijednost,
n.maksimalna_vrijednost, n.najmanji_rok_isporuke,
n.najveci_rok_isporuke, p.najmanja_kolicina,
p.najveca_kolicina,
p.najniza_cijena,p.najvisa_cijena,
p.najmanji_rok_isporuke, p.najveci_rok_isporuke,
n.funkcija_korisnosti, np.inicijalna_ponuda_p,
p.agent \
57 FROM natjecaj n, ponuda p,
natjecaj_ponuda np WHERE
n.idnatjecaja = np.natjecajid AND
p.idponude = np.ponudaid AND
n.idnatjecaja = %s AND
41
p.idponude=%s",
(self.myAgent.param1, row[1]))
58 param = cur.fetchone()
59 in_ponuda = []
60 in_ponuda.append(float(param[1]*param[8]))
61 in_ponuda.append(float(param[1]))
62 in_ponuda.append(float(param[10]))
63 logging.info(’Inicijalna ponuda: %s, ID ponude: %s’
% (in_ponuda, row[1]))
64 cur.execute("UPDATE natjecaj_ponuda SET
inicijalna_ponuda_n = %s, trenutna_ponuda_n = %s,
t = 1, potezid = 2 WHERE natjecajid = %s AND
ponudaid = %s", (in_ponuda, in_ponuda,
self.myAgent.param1, row[1]))
65 con.commit()
66 x1 = param[13].replace("{", "")
67 y1 = x1.replace("}", "")
68 inp = y1.split(’,’)
69 inp1 = float(inp[0])
70 kolicina = float(inp[1])
71 maxrok = float(inp[2])
72 if ( param[10] <= param[4] ):
73 minrok = param[4]
74 else:
75 minrok = param[10]
76 min_kor = self.myAgent.TempKorisnost( param[9],
kolicina, maxrok, param[12] )
77 print "Temp min korisnost: ", min_kor
78
79 max_kor = self.myAgent.TempKorisnost( param[8],
kolicina, minrok, param[12] )
80 print "Temp max korisnost: ", max_kor
81 cijena = kolicina * float(param[8])
82 inip = "{%s,%s,%s}" % (cijena, kolicina, minrok)
83 print ’Initp 2: ’, inip
84 korisnost = self.myAgent.Korisnost( inip, param[12],
min_kor, max_kor, 0 )
85 print "Korisnost u postotcima", korisnost
86 cur.execute("UPDATE natjecaj_ponuda SET
inicijalna_ponuda_n = %s, trenutna_ponuda_n = %s,
t = 1, potezid = 2 WHERE natjecajid = %s AND
ponudaid = %s", (inip, inip, self.myAgent.param1,
row[1]))
42
87 con.commit()
88 logging.info(’Inicijalna ponuda: %s, ID ponude: %s,
T min korisnost: %s, T max korisnost: %s,
Postoci: %s’ % (in_ponuda, row[1], min_kor,
max_kor, korisnost))
89
90 msg = ACLMessage()
91 primatelj = spade.AID.aid( name= param[14],
addresses=["xmpp://" + param[14]])
92 msg.addReceiver( primatelj )
93 msg.setOntology( ’B2B’ )
94 msg.setContent( inip )
95 self.myAgent.send( msg )
96 else:
97 cur.execute("SELECT np.trenutna_ponuda_p,
np.inicijalna_ponuda_p, np.inicijalna_ponuda_n,
n.funkcija_korisnosti, np.trenutna_ponuda_n,
n.strategija, n.najmanji_rok_isporuke,
p.najmanji_rok_isporuke, p.najniza_cijena,
p.najvisa_cijena, p.agent, n.minimalna_korisnost,
np.t, n.t_max \
98 FROM natjecaj_ponuda np, natjecaj n,
ponuda p WHERE n.idnatjecaja =
np.natjecajid AND p.idponude =
np.ponudaid AND natjecajid = %s AND
ponudaid = %s",
(self.myAgent.param1, row[1]))
99 param = cur.fetchone()
100
101 x1 = param[1].replace("{", "")
102 y1 = x1.replace("}", "")
103 inp = y1.split(’,’)
104 inp1 = float(inp[0])
105 inp2 = float(inp[1])
106 inp3 = float(inp[2])
107
108 x2 = param[2].replace("{", "")
109 y2 = x2.replace("}", "")
110 inn = y2.split(’,’)
111 inn1 = float(inn[0])
112 inn2 = float(inn[1])
113 inn3 = float(inn[2])
114
43
115 x3 = param[3].replace("{", "")
116 y3 = x3.replace("}", "")
117 fk = y3.split(’,’)
118 fk1 = float(fk[0]) / 100
119 fk2 = float(fk[1]) / 100
120 fk3 = float(fk[2]) / 100
121
122 x4 = param[0].replace("{", "")
123 y4 = x4.replace("}", "")
124 tpp = y4.split(’,’)
125 tpp1 = float(tpp[0])
126 tpp2 = float(tpp[1])
127 tpp3 = float(tpp[2])
128
129 x5 = param[4].replace("{", "")
130 y5 = x5.replace("}", "")
131 tpn = y5.split(’,’)
132 tpn1 = float(tpn[0])
133 tpn2 = float(tpn[1])
134 tpn3 = float(tpn[2])
135
136 if ( param[7] <= param[6] ):
137 minrok = param[6]
138 else:
139 minrok = param[7]
140 min_kor_p = self.myAgent.TempKorisnost( param[9],
tpp2, inp3, param[3] )
141 print "Temp P min korisnost: ", min_kor_p
142
143 print param[8], tpp2, inn3, param[3]
144 max_kor_p = self.myAgent.TempKorisnost( param[8],
tpp2, inn3, param[3] )
145 print "Temp P max korisnost: ", max_kor_p
146
147 korisnost_p = self.myAgent.Korisnost( param[0],
param[3], min_kor_p, max_kor_p, 0 )
148 print "Korisnost u postotcima P ", korisnost_p
149 logging.info(’Trenutna ponuda: %s, ID ponude: %s, T
min korisnost: %s, T max korisnost: %s, Postoci:
%s’ % (param[0], row[1], min_kor_p, max_kor_p,
korisnost_p))
150
151 ponuda_n = self.myAgent.Strategija( param[4],
44
param[5], 0 )
152 x6 = ponuda_n.replace("{", "")
153 y6 = x6.replace("}", "")
154 tppn = y6.split(’,’)
155 tppn1 = float(tppn[0])
156 tppn2 = float(tppn[1])
157 tppn3 = float(tppn[2])
158 print ponuda_n
159
160 min_kor_n = self.myAgent.TempKorisnost( param[9],
tppn2, inp3, param[3] )
161 print "Temp N min korisnost: ", min_kor_n
162
163 max_kor_n = self.myAgent.TempKorisnost( param[8],
tppn2, inn3, param[3] )
164 print "Temp N max korisnost: ", max_kor_n
165
166 korisnost_n = self.myAgent.Korisnost( ponuda_n,
param[3], min_kor_n, max_kor_n, 0 )
167 print "Korisnost u postotcima N ", korisnost_n
168 logging.info(’Trenutna ponuda: %s, ID ponude: %s, T
min korisnost: %s, T max korisnost: %s, Postoci:
%s’ % (ponuda_n, row[1], min_kor_n, max_kor_n,
korisnost_n))
169 if (korisnost_n > korisnost_p):
170 min_n = float(param[11])/100
171 if ( korisnost_n < float( min_n ) ) or (
int(param[12]) > int(param[13]) ):
172 print "Ponuda je ispod minimalne korisnosti ili
je rok za pregovaranje istekao"
173 logging.info(’Ponuda je ispod minimalne
korisnosti ili je rok za pregovaranje
istekao’)
174 cur.execute("UPDATE natjecaj_ponuda SET
konacna_ponuda = ’ISTEKLO’, statusid = 5,
statusid2 = 8, potezid = 1 WHERE natjecajid =
%s AND ponudaid = %s", (self.myAgent.param1,
row[1]))
175 con.commit()
176 print "Natjecaj > Ponudac"
177 cur.execute("UPDATE natjecaj_ponuda SET
trenutna_ponuda_n = %s, t = t + 1, potezid = 2
WHERE natjecajid = %s AND ponudaid = %s",
45
(ponuda_n, self.myAgent.param1, row[1]))
178 con.commit()
179
180 print ’Slanje ponude!!’
181 msg = ACLMessage()
182 primatelj = spade.AID.aid( name= param[10],
addresses=["xmpp://" + param[10]])
183 msg.addReceiver( primatelj )
184 msg.setOntology( ’B2B’ )
185 msg.setContent( ponuda_n )
186 self.myAgent.send( msg )
187 logging.info(’Slanje ponude: %s, agentu: %s ’ %
(ponuda_n, primatelj))
188 else:
189 print "Ponudac > Natjecaj"
190 min_n = float(param[11])/100
191 if ( korisnost_p < float( min_n ) ) or (
int(param[12]) > int(param[13]) ):
192 print "Ponuda je ispod minimalne korisnosti ili
je rok za pregovaranje istekao"
193 logging.info(’Ponuda je ispod minimalne
korisnosti ili je rok za pregovaranje
istekao’)
194 cur.execute("UPDATE natjecaj_ponuda SET
konacna_ponuda = ’ISTEKLO’, statusid = 5,
statusid2 = 8, potezid = 1 WHERE natjecajid =
%s AND ponudaid = %s", (self.myAgent.param1,
row[1]))
195 con.commit()
196 d = self.myAgent.Korisnost( param[0], y3,
min_kor_n, max_kor_n, 1 )
197 if (d == 0):
198 cur.execute("UPDATE natjecaj_ponuda SET
konacna_ponuda = ’ISTEKLO’, statusid = 5,
statusid2 = 8, potezid = 1 WHERE natjecajid =
%s AND ponudaid = %s", (self.myAgent.param1,
row[1]))
199 con.commit()
200 else:
201 cur.execute("UPDATE natjecaj_ponuda SET
trenutna_ponuda_n = %s, konacna_ponuda =
trenutna_ponuda_p, statusid = 3, statusid2 =
4, potezid = 1, korisnost = %s WHERE
46
natjecajid = %s AND ponudaid = %s",
(ponuda_n, korisnost_p, self.myAgent.param1,
row[1]))
202 con.commit()
203 #SLANJE PORUKE param[10]
204 msg = ACLMessage()
205 primatelj = spade.AID.aid( name= param[10],
addresses=["xmpp://" + param[10]])
206 msg.addReceiver( primatelj )
207 msg.setOntology( ’B2B’ )
208 msg.setContent( ’Prihvacam ponudu’ )
209 self.myAgent.send( msg )
210 logging.info(’Prihvacam ponudu: %s, od agenta:
%s’ % (param[0], primatelj))
211 cur.execute("SELECT np.t, n.istek, n.t_max FROM
natjecaj_ponuda np, natjecaj n WHERE n.idnatjecaja =
np.natjecajid AND natjecajid = %s AND ponudaid = %s",
(self.myAgent.param1, row[1]))
212 provjera_s = cur.fetchone()
213 if (provjera_s[0] > provjera_s[2]):
214 print "Natjecaj je istekao !!"
215 cur.execute("UPDATE natjecaj_ponuda SET
konacna_ponuda = ’ISTEKLO’, statusid = 3,
statusid2 = 8, potezid = 1 WHERE natjecajid =
%s AND ponudaid = %s", (self.myAgent.param1,
row[1]))
216 con.commit()
217 else:
218 print "Bez pregovaranja"
219 cur.execute("SELECT istek FROM natjecaj WHERE idnatjecaja =
%s", (self.myAgent.param1,))
220 provjera_i = cur.fetchone()
221 if (provjera_i[0] < datetime.now()):
222 print "Natjecaj istekao..."
223 logging.info(’Natjecaj je istekao’)
224 cur.execute("SELECT natjecajid, ponudaid, konacna_ponuda
FROM natjecaj_ponuda WHERE natjecajid = %s AND statusid
= 2 ORDER BY konacna_ponuda ASC",
(self.myAgent.param1,))
225 rangs = cur.fetchall()
226 i = 0
227 for rang in rangs:
228 if (i == 0):
47
229 cur.execute("UPDATE natjecaj_ponuda SET statusid =
6, statusid2 = 7 WHERE natjecajid = %s AND
ponudaid = %s", (rang[0], rang[1]))
230 con.commit()
231 i = 1
232 else:
233 cur.execute("UPDATE natjecaj_ponuda SET statusid =
6, statusid2 = 8 WHERE natjecajid = %s AND
ponudaid = %s", (rang[0], rang[1]))
234 con.commit()
235 print "Rangiranje dovršeno"
236 logging.info(’Rangiranje dovrseno’)
237 if con:
238 con.close()
239 self.myAgent.kill()
240 print "Preostalo do isteka", provjera_i[0] - datetime.now()
241 con = psycopg2.connect(host=’localhost’, dbname=’nabava’,
user=’postgres’, password=’postgres’)
242 cur = con.cursor()
243 cur.execute("SELECT istek FROM natjecaj WHERE idnatjecaja = %s",
(self.myAgent.param1,))
244 provjera_s = cur.fetchone()
245 if (provjera_s[0] < datetime.now()):
246 print "RANGIRANJE"
247 cur.execute("UPDATE natjecaj SET statusid = 3 WHERE
idnatjecaja = %s", (self.myAgent.param1,))
248 con.commit()
249 logging.info(’Rangiranje...’)
250 cur.execute("SELECT natjecajid, ponudaid, korisnost FROM
natjecaj_ponuda WHERE natjecajid = %s AND statusid = 3 AND
statusid2 = 4 ORDER BY korisnost DESC",
(self.myAgent.param1,))
251 rangs = cur.fetchall()
252 i = 0
253 for rang in rangs:
254 if (i == 0):
255 cur.execute("UPDATE natjecaj_ponuda SET statusid = 6,
statusid2 = 7 WHERE natjecajid = %s AND ponudaid =
%s", (rang[0], rang[1]))
256 con.commit()
257 print "Natjecaj dobiva ponuda: ", rang[1]
258 logging.info(’Natjecaj dobiva %s’, rang[1])
259 i = 1
48
260 else:
261 cur.execute("UPDATE natjecaj_ponuda SET statusid = 6,
statusid2 = 8 WHERE natjecajid = %s AND ponudaid =
%s", (rang[0], rang[1]))
262 con.commit()
263 if con:
264 con.close()
265 self.myAgent.kill()
266 except psycopg2.DatabaseError, e:
267 print e.pgerror
268 return False
269 finally:
270 if con:
271 con.close()
272 self.counter = self.counter + 1
273
274 class Natjecaj_Msg( EventBehaviour ):
275 def _process( self ):
276 self.msg = None
277 self.msg = self._receive( True )
278 if self.msg:
279 logging.info(’Primljena ponuda: %s, Agent: %s’ %
(self.msg.content, self.msg.sender))
280
281 def TempKorisnost( self, cijena, kolicina, rok, fkorisnosti ):
282 x3 = fkorisnosti.replace("{", "")
283 y3 = x3.replace("}", "")
284 fk = y3.split(’,’)
285 fk1 = float(fk[0]) / 100
286 fk2 = float(fk[1]) / 100
287 fk3 = float(fk[2]) / 100
288
289 kor = -float(kolicina) * float(cijena) * fk1 + float(kolicina) * fk2 -
float(rok) * fk3
290 return kor
291
292 def Korisnost( self, ponuda, y3, min_kor, max_kor, td ):
293 print "Racunanje KORISNOSTI"
294 a = ponuda.replace("{", "")
295 b = a.replace("}", "")
296 pnd1 = b.split(’,’)
297 a1 = float(pnd1[0])
298 a2 = float(pnd1[1])
49
299 a3 = float(pnd1[2])
300 f = y3.replace("{", "")
301 y2 = f.replace("}", "")
302 fk = y2.split(’,’)
303 fk1 = float(fk[0]) / 100
304 fk2 = float(fk[1]) / 100
305 fk3 = float(fk[2]) / 100
306 print "-%s * %s + %s * %s - %s * %s" % (a1, fk1, a2, fk2, a3, fk3)
307 kor = - a1 * fk1 + a2 * fk2 - a3 * fk3;
308 korisnost = (kor - min_kor ) / ( max_kor - min_kor )
309
310 if (td == 1):
311 con = psycopg2.connect(host=’localhost’, dbname=’nabava’,
user=’postgres’, password=’postgres’)
312 cur = con.cursor()
313 cur.execute("SELECT najmanja_kolicina, najveca_kolicina,
procijenjena_vrijednost, maksimalna_vrijednost,
najmanji_rok_isporuke, najveci_rok_isporuke FROM natjecaj WHERE
idnatjecaja = %s", (self.param1,))
314 ck = cur.fetchone()
315 if ((ck[0] > a2) or (a2 > ck[1]) or (a1 > ck[3]) or (a3 < ck[4]) or
(a3 > ck[5])):
316 print "PONUDA JE PREVISOKA DOGOVOR NIJE POSTIGNUT - PONUÐAC"
317 return 0
318 else:
319 return korisnost
320
321 def Strategija( self, ponuda, strategija, td ):
322 print "Racunanje STRATEGIJE"
323 print ponuda, strategija
324 a = ponuda.replace("{", "")
325 b = a.replace("}", "")
326 pnd1 = b.split(’,’)
327 a1 = float("%.3f" % float(pnd1[0]))
328 a2 = float("%.3f" % float(pnd1[1]))
329 a3 = float("%.3f" % float(pnd1[2]))
330
331 x = strategija.replace("{", "")
332 y = x.replace("}", "")
333 fk = y.split(’,’)
334 fk1 = float(fk[0])
335 fk2 = float(fk[1])
336 fk3 = float(fk[2])
50
337
338 p1 = a1 + ( a1 * fk1 )
339 p2 = a2 + ( a2 * fk2 )
340 p3 = a3 + ( a3 * fk3 )
341 ponuda_n = "{%s,%s,%s}" % (p1, p2, p3)
342
343 if td == 1:
344 con = psycopg2.connect(host=’localhost’, dbname=’nabava’,
user=’postgres’, password=’postgres’)
345 cur = con.cursor()
346 cur.execute("SELECT najmanja_kolicina, najveca_kolicina,
procijenjena_vrijednost, maksimalna_vrijednost,
najmanji_rok_isporuke, najveci_rok_isporuke FROM natjecaj WHERE
idnatjecaja = %s", (self.param1,))
347 ck = cur.fetchone()
348 if ((ck[0] > p2) or (p2 > ck[1]) or (p2 > ck[3]) or (p3 < ck[4]) or
(p3 > ck[5])):
349 logging.info(’Ponuda je previsoka, dogovori nije postignut...’)
350 print "PONUDA JE PREVISOKA DOGOVOR NIJE POSTIGNUT"
351 return 0
352 else:
353 return ponuda_n
354
355 def _setup( self ):
356 print "--------------------------"
357 print "Agent NATJECAJ: START!"
358 natjecaj = ACLTemplate()
359 natjecaj.setOntology(’B2B’)
360 m = MessageTemplate( natjecaj )
361 self.addBehaviour( self.Natjecaj_Msg(), m)
362
363 p = self.Natjecaj_Agent( 2 )
364 self.addBehaviour( p, None )
365 def __init__(self, ime, lozinka, parametar1, parametar2):
366 print parametar1
367 print parametar2
368 self.param1 = parametar1
369 self.param2 = parametar2
370 self.naziv = ime
371 Agent.__init__( self, ime, lozinka )
372 self.start()
51
11.2. PRILOG 2 - Implementacija agenta ponudaca
U nastaku je dan izvorni kod agenta ponudaca. Kao i kod agenta narucioca, izvorni kod se sastoji
od glavne klase agenta ponude te potrebnim metodama za izracunavanje trenutne korisnosti, ukupne
korisnosti i strategije.
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 import sys
4 import spade
5 import psycopg2
6
7 from time import sleep, localtime, strftime
8 from datetime import datetime
9
10 from spade.Agent import Agent
11 from spade.DF import ServiceDescription
12 from spade.Behaviour import OneShotBehaviour, EventBehaviour,
PeriodicBehaviour, ACLTemplate, MessageTemplate
13 from spade.ACLMessage import ACLMessage
14 import logging
15
16 con = None
17
18 try:
19
20 con = psycopg2.connect(host=’localhost’, dbname=’nabava’, user=’postgres’,
password=’postgres’)
21 cur = con.cursor()
22 print "Connected to database tested !!"
23 con.close()
24
25 except psycopg2.DatabaseError, e:
26 print ’Greška sa spajanjem na bazu !! %s’ % e
27 sys.exit(1)
28
29 class Ponuda( Agent):
30 class Ponuda_Agent( PeriodicBehaviour ):
31 def onStart(self):
32 print ’Naziv AGENTA: ’, self.myAgent.naziv
33 logging.basicConfig(filename= self.myAgent.naziv +
’.log’,level=logging.DEBUG, format=’%(asctime)s %(message)s’)
34 self.counter = 0
52
35
36 def _onTick( self ):
37 print "******************************"
38 print "Vrijeme ["+strftime("%D - %H:%M:%S", localtime())+"]:
Agent[" + self.myAgent.naziv + "]"
39 print ’Brojac: ’, self.counter
40 print "Provjeravam bazu za natjecajima..."
41 logging.info(’Provjeravam bazu za natjecajima...’)
42 try:
43 con = psycopg2.connect(host=’localhost’, dbname=’nabava’,
user=’postgres’, password=’postgres’)
44 cur = con.cursor()
45
46 cur.execute("SELECT count(*) FROM natjecaj WHERE glavna_oznaka =
%s AND statusid NOT IN(3,6)", (self.myAgent.param2,))
47 num = cur.fetchone()
48 if (num[0] == 0):
49 print "Trenutno nema natjecaja za prijavu !!"
50 logging.info(’Trenutno nema natjecaja za prijavu !!’)
51 else:
52 print "Broj natjecaja za prijavu: ", num[0]
53 logging.info(’Broj natjecaja za prijavu: %s’, num[0])
54
55 cur.execute("SELECT n.idnatjecaja, n.kriterij_odabiraid,
n.statusid, n.najmanja_kolicina, n.najveca_kolicina,
n.najmanji_rok_isporuke, n.najveci_rok_isporuke,
p.najmanja_kolicina, p.najveca_kolicina,
p.najmanji_rok_isporuke, p.najveci_rok_isporuke,
p.najniza_cijena, p.najvisa_cijena, p.funkcija_korisnosti,
n.agent \
56 FROM natjecaj n, ponuda p WHERE n.glavna_oznaka
= %s AND n.statusid = 1 AND p.idponude = %s
AND ((p.najmanja_kolicina BETWEEN
n.najmanja_kolicina AND n.najveca_kolicina)
OR (p.najveca_kolicina BETWEEN
n.najmanja_kolicina AND n.najveca_kolicina)
OR (n.najmanja_kolicina BETWEEN
p.najmanja_kolicina AND p.najveca_kolicina) \
57 OR (n.najveca_kolicina BETWEEN
p.najmanja_kolicina AND p.najveca_kolicina))
AND ((p.najmanji_rok_isporuke BETWEEN
n.najmanji_rok_isporuke AND
n.najveci_rok_isporuke) OR
53
(p.najveci_rok_isporuke BETWEEN
n.najmanji_rok_isporuke AND
n.najveci_rok_isporuke) OR
(n.najmanji_rok_isporuke BETWEEN
p.najmanji_rok_isporuke AND
p.najveci_rok_isporuke) \
58 OR (n.najveci_rok_isporuke BETWEEN
p.najmanji_rok_isporuke AND
p.najveci_rok_isporuke))",
(self.myAgent.param2, self.myAgent.param1))
59 rows = cur.fetchall()
60 for row in rows:
61 if(row[1] == 2):
62
63 cur.execute("SELECT COUNT(*) FROM natjecaj_ponuda WHERE
natjecajid = %s AND ponudaid = %s", (row[0],
self.myAgent.param1))
64 numm = cur.fetchone()
65
66 if numm[0] == 0:
67
68 print ’Nema ponude u bazi, racunam inicijalnu ponudu’
69
70 if (row[4] <= row[8]):
71 print ’Unosim najvecu kolicinu natjecaja’
72 kolicina = row[4]
73 else:
74 print ’Unosim našu najvecu kolicinu’
75 kolicina = row[8]
76
77 if (row[6] <= row[10]):
78 print ’Unosim najvecu rok isporuke natjecaja’
79 rok = row[6]
80 else:
81 print ’Unosim naš najveci rok isporuke’
82 rok = row[10]
83 if ( row[9] <= row[5] ):
84 minrok = row[5]
85 else:
86 minrok = row[9]
87
88 cijena = float("%.3f" % float(kolicina * row[12]))
89
54
90 inip = "{%s,%s,%s}" % (cijena, kolicina, rok)
91 print row[0], self.myAgent.param1, inip
92
93 print "slanje"
94 msg = ACLMessage()
95 primatelj = spade.AID.aid( name= row[14],
addresses=["xmpp://" + row[14]])
96 msg.addReceiver( primatelj )
97 msg.setOntology( ’B2B’ )
98 msg.setContent( inip )
99 self.myAgent.send( msg )
100 cur.execute("INSERT INTO natjecaj_ponuda(natjecajid,
ponudaid, inicijalna_ponuda_p, trenutna_ponuda_p, t,
statusid, potezid) VALUES(%s, %s, %s, %s, 0, 0, 1)",
(row[0], self.myAgent.param1, inip, inip))
101 con.commit()
102
103 min_kor = self.myAgent.TempKorisnost( row[11], kolicina,
minrok, row[13] )
104 print "Temp min korisnost: ", min_kor
105
106 max_kor = self.myAgent.TempKorisnost( row[12], kolicina,
rok, row[13] )
107 print "Temp max korisnost: ", max_kor
108
109 korisnost = self.myAgent.Korisnost( inip, row[13],
min_kor, max_kor, 0 )
110 print "Korisnost u postotcima", korisnost
111 logging.info(’Inicijalna ponuda: %s, ID natjecaja: %s, T
min korisnost: %s, T max korisnost: %s, Postoci: %s’
% (inip, row[0], min_kor, max_kor, korisnost))
112 else:
113 print ’Ponuda je u bazi, ceka se potez i unos
protuponude’
114 cur.execute("SELECT * FROM natjecaj_ponuda WHERE
natjecajid = %s AND ponudaid = %s", (row[0],
self.myAgent.param1))
115 pon = cur.fetchone()
116
117 if pon[8] == 2:
118 print ’mi smo na redu’
119 cur.execute("SELECT np.trenutna_ponuda_n,
np.inicijalna_ponuda_n, np.inicijalna_ponuda_p,
55
p.funkcija_korisnosti, np.trenutna_ponuda_p,
p.strategija, p.najniza_cijena, p.najvisa_cijena,
n.agent, p.minimalna_korisnost, np.t, p.t_max \
120 FROM natjecaj_ponuda np, ponuda p,
natjecaj n \
121 WHERE p.idponude = np.ponudaid AND
n.idnatjecaja = np.natjecajid \
122 AND natjecajid = %s AND ponudaid = %s",
(row[0], self.myAgent.param1))
123 param = cur.fetchone()
124 x1 = param[1].replace("{", "")
125 y1 = x1.replace("}", "")
126 inp = y1.split(’,’)
127 inp1 = float(inp[0])
128 inp2 = float(inp[1])
129 inp3 = float(inp[2])
130
131 x2 = param[2].replace("{", "")
132 y2 = x2.replace("}", "")
133 inn = y2.split(’,’)
134 inn1 = float(inn[0])
135 inn2 = float(inn[1])
136 inn3 = float(inn[2])
137
138 x3 = param[3].replace("{", "")
139 y3 = x3.replace("}", "")
140 fk = y3.split(’,’)
141 fk1 = float(fk[0]) / 100
142 fk2 = float(fk[1]) / 100
143 fk3 = float(fk[2]) / 100
144
145 x4 = param[0].replace("{", "")
146 y4 = x4.replace("}", "")
147 tpn = y4.split(’,’)
148 tpn1 = float(tpn[0])
149 tpn2 = float(tpn[1])
150 tpn3 = float(tpn[2])
151
152 x5 = param[4].replace("{", "")
153 y5 = x5.replace("}", "")
154 tpp = y5.split(’,’)
155 tpp1 = float(tpp[0])
156 tpp2 = float(tpp[1])
56
157 tpp3 = float(tpp[2])
158
159 if ( row[9] <= row[5] ):
160 minrok = row[5]
161 else:
162 minrok = row[9]
163
164 min_kor_n = self.myAgent.TempKorisnost( row[11], tpn2,
minrok, row[13] )
165 print "Temp N min korisnost: ", min_kor_n
166
167 max_kor_n = self.myAgent.TempKorisnost( row[12], tpn2,
inn3, row[13] )
168 print "Temp N max korisnost: ", max_kor_n
169
170 korisnost_n = self.myAgent.Korisnost( param[0],
param[3], min_kor_n, max_kor_n, 0 )
171 print "Korisnost u postotcima N ", korisnost_n
172 logging.info(’Trenutna ponuda: %s, ID natjecaja: %s, T
min korisnost: %s, T max korisnost: %s, Postoci:
%s’ % (param[0], row[0], min_kor_n, max_kor_n,
korisnost_n))
173
174 ponuda_p = self.myAgent.Strategija( param[4],
param[5], 0 )
175 x6 = ponuda_p.replace("{", "")
176 y6 = x6.replace("}", "")
177 tppp = y6.split(’,’)
178 tppp1 = float(tppp[0])
179 tppp2 = float(tppp[1])
180 tppp3 = float(tppp[2])
181
182
183 min_kor_p = self.myAgent.TempKorisnost( row[11],
tppp2, minrok, row[13] )
184 print "Temp P min korisnost: ", min_kor_p
185
186 max_kor_p = self.myAgent.TempKorisnost( row[12],
tppp2, inn3, row[13] )
187 print "Temp P max korisnost: ", max_kor_p
188
189 korisnost_p = self.myAgent.Korisnost( ponuda_p,
param[3], min_kor_p, max_kor_p, 0 )
57
190 print "Korisnost u postotcima P ", korisnost_p
191 logging.info(’Trenutna ponuda: %s, ID natjecaja: %s, T
min korisnost: %s, T max korisnost: %s, Postoci:
%s’ % (ponuda_p, row[0], min_kor_p, max_kor_p,
korisnost_p))
192
193 if (korisnost_p > korisnost_n):
194 min_p = float(param[9])/100
195 if ( korisnost_p < float(min_p) ) or (
int(param[10]) > int(param[11]) ):
196 print "Ponuda je ispod minimalne korisnosti ili je
rok za pregovaranje istekao"
197 logging.info(’Ponuda je ispod minimalne korisnosti
ili je rok za pregovaranje istekao’)
198 cur.execute("UPDATE natjecaj_ponuda SET
konacna_ponuda = ’ISTEKLO’, statusid = 5,
statusid2 = 8, potezid = 1 WHERE natjecajid =
%s AND ponudaid = %s", (row[0],
self.myAgent.param1))
199 con.commit()
200 print "Ponudac > Natjecaj"
201 cur.execute("UPDATE natjecaj_ponuda SET
trenutna_ponuda_p = %s, t = t + 1, potezid = 1
WHERE natjecajid = %s AND ponudaid = %s",
(ponuda_p, row[0], self.myAgent.param1))
202 con.commit()
203
204 msg = ACLMessage()
205 primatelj = spade.AID.aid( name = row[14],
addresses=["xmpp://" + row[14]])
206 msg.addReceiver( primatelj )
207 msg.setOntology( ’B2B’ )
208 msg.setContent( ponuda_p )
209 self.myAgent.send( msg )
210 logging.info(’Slanje ponude: %s, agentu: %s ’ %
(ponuda_p, primatelj))
211 else:
212 print "Natjecaj > Ponudac"
213 min_p = float(param[9])/100
214 if ( korisnost_n < float(min_p) ) or (
int(param[10]) > int(param[11]) ):
215 print "Ponuda je ispod minimalne korisnosti ili je
rok za pregovaranje istekao"
58
216 logging.info(’Ponuda je ispod minimalne korisnosti
ili je rok za pregovaranje istekao’)
217 cur.execute("UPDATE natjecaj_ponuda SET
konacna_ponuda = ’ISTEKLO’, statusid = 5,
statusid2 = 8, potezid = 1 WHERE natjecajid =
%s AND ponudaid = %s", (row[0],
self.myAgent.param1))
218 con.commit()
219 d = self.myAgent.Korisnost( param[0], y3, min_kor_n,
max_kor_n, 1 )
220 f = self.myAgent.Korisnost( ponuda_p, y3, min_kor_p,
max_kor_p, 1 )
221 if (d == 0) or (f == 0):
222 cur.execute("UPDATE natjecaj_ponuda SET
konacna_ponuda = ’ISTEKLO’, statusid = 5,
statusid2 = 8, potezid = 1 WHERE natjecajid =
%s AND ponudaid = %s", (row[0],
self.myAgent.param1))
223 con.commit()
224 else:
225 cur.execute("UPDATE natjecaj_ponuda SET
trenutna_ponuda_p = %s, konacna_ponuda =
trenutna_ponuda_n, statusid = 3, statusid2 = 4,
potezid = 2, korisnost = %s WHERE natjecajid =
%s AND ponudaid = %s", (ponuda_p, korisnost_n,
row[0], self.myAgent.param1))
226 con.commit()
227 msg = ACLMessage()
228 primatelj = spade.AID.aid( name = row[14],
addresses=["xmpp://" + row[14]])
229 msg.addReceiver( primatelj )
230 msg.setOntology( ’B2B’ )
231 msg.setContent( ’Prihvacam ponudu’ )
232 self.myAgent.send( msg )
233 logging.info(’Prihvacam ponudu: %s, od agenta: %s’
% (param[0], primatelj))
234 else:
235 print ’Ponudac nije na redu ili ponuda nije važeca’
236 logging.info(’Ponudac nije na redu ili ponuda nije
važeca’)
237 cur.execute("SELECT np.t, p.istek, p.t_max FROM
natjecaj_ponuda np, ponuda p WHERE p.idponude =
np.ponudaid AND natjecajid = %s AND ponudaid = %s",
59
(row[0], self.myAgent.param1))
238 provjera_s = cur.fetchone()
239 if (provjera_s[1] < datetime.now()):
240 print "Ponuda je istekla !!"
241 if con:
242 con.close()
243 self.myAgent.kill()
244 else:
245 print "Bez pregovaranja"
246 cur.execute("SELECT COUNT(*) FROM natjecaj_ponuda WHERE
natjecajid = %s AND ponudaid = %s", (row[0],
self.myAgent.param1))
247 numm = cur.fetchone()
248
249 if numm[0] == 0:
250 if (row[7] <= row[4] <= row[8]):
251 print "Kolicina je u našem intervalu"
252 cijena = row[4] * row[11]
253 kolicina = row[4]
254 rok = row[9]
255 ponuda = "{%s,%s,%s}" % (cijena, kolicina, rok)
256 print ponuda
257 cur.execute("INSERT INTO natjecaj_ponuda(natjecajid,
ponudaid, trenutna_ponuda_p, konacna_ponuda, t,
statusid, potezid) VALUES(%s, %s, %s, %s, 1, 2, 1)
", (row[0], self.myAgent.param1, ponuda, cijena))
258 con.commit()
259 else:
260 print "Ponudu nije moguce unijeti zbog kolicine"
261 else:
262 print "Ponuda je vec u bazi, ceka se odgovor"
263
264 except psycopg2.DatabaseError, e:
265 print e.pgerror
266 return False
267 finally:
268 if con:
269 con.close()
270 self.counter = self.counter + 1
271 class Ponuda_Msg( EventBehaviour ):
272 def _process( self ):
273 self.msg = None
274 self.msg = self._receive( True )
60
275 if self.msg:
276 logging.info(’Primljena ponuda: %s, Agent: %s’ %
(self.msg.content, self.msg.sender))
277
278 def TempKorisnost( self, cijena, kolicina, rok, fkorisnosti ):
279 x3 = fkorisnosti.replace("{", "")
280 y3 = x3.replace("}", "")
281 fk = y3.split(’,’)
282 fk1 = float(fk[0]) / 100
283 fk2 = float(fk[1]) / 100
284 fk3 = float(fk[2]) / 100
285 kor = float(kolicina) * float(cijena) * fk1 + float(kolicina) * fk2 +
float(rok) * fk3
286 return kor
287
288 def Korisnost( self, ponuda, y3, min_kor, max_kor, td ):
289 print"Racunanje KORISNOSTI"
290 a = ponuda.replace("{", "")
291 b = a.replace("}", "")
292 pnd1 = b.split(’,’)
293 a1 = float(pnd1[0])
294 a2 = float(pnd1[1])
295 a3 = float(pnd1[2])
296 f = y3.replace("{", "")
297 y2 = f.replace("}", "")
298 fk = y2.split(’,’)
299 fk1 = float(fk[0]) / 100
300 fk2 = float(fk[1]) / 100
301 fk3 = float(fk[2]) / 100
302 print "%s * %s + %s * %s + %s * %s" % (a1, fk1, a2, fk2, a3, fk3)
303 kor = a1 * fk1 + a2 * fk2 + a3 * fk3
304 print min_kor, max_kor
305 korisnost = (kor - min_kor ) / ( max_kor - min_kor )
306 if (td == 1):
307 con = psycopg2.connect(host=’localhost’, dbname=’nabava’,
user=’postgres’, password=’postgres’)
308 cur = con.cursor()
309 cur.execute("SELECT najmanja_kolicina, najveca_kolicina,
najniza_cijena, najvisa_cijena, najmanji_rok_isporuke,
najveci_rok_isporuke FROM ponuda WHERE idponude = %s",
(self.param1,))
310 ck = cur.fetchone()
311 if ((ck[0] > a2) or (a2 > ck[1]) or (a1 > ck[3]) or (a3 < ck[4]) or
61
(a3 > ck[5])):
312 print "PONUDA JE PRENISKA DOGOVOR NIJE POSTIGNUT - PONUÐAC"
313 return 0
314 else:
315 return korisnost
316
317 def Strategija( self, ponuda, strategija, td ):
318 print"Racunanje STRATEGIJE"
319 a = ponuda.replace("{", "")
320 b = a.replace("}", "")
321 pnd1 = b.split(’,’)
322 a1 = float("%.3f" % float(pnd1[0]))
323 a2 = float("%.3f" % float(pnd1[1]))
324 a3 = float("%.3f" % float(pnd1[2]))
325 x = strategija.replace("{", "")
326 y = x.replace("}", "")
327 fk = y.split(’,’)
328 fk1 = float(fk[0])
329 fk2 = float(fk[1])
330 fk3 = float(fk[2])
331 p1 = a1 + ( a1 * fk1 )
332 p2 = a2 + ( a2 * fk2 )
333 p3 = a3 + ( a3 * fk3 )
334 ponuda_p = "{%s,%s,%s}" % (p1, p2, p3)
335 if (td == 1):
336 con = psycopg2.connect(host=’localhost’, dbname=’nabava’,
user=’postgres’, password=’postgres’)
337 cur = con.cursor()
338 cur.execute("SELECT najmanja_kolicina, najveca_kolicina,
najniza_cijena, najvisa_cijena, najmanji_rok_isporuke,
najveci_rok_isporuke FROM ponuda WHERE idponude = %s",
(self.param1,))
339 ck = cur.fetchone()
340 if ((ck[0] > p2) or (p2 > ck[1]) or (ck[2] > p1/p2 ) or (p3 < ck[4])
or (p3 > ck[5])):
341 print "PONUDA JE PRENISKA DOGOVOR NIJE POSTIGNUT"
342 return 0
343 else:
344 return ponuda_p
345
346 def _setup( self ):
347 print "--------------------------"
348 print "Agent PONUDA: START!"
62
349 ponuda = ACLTemplate()
350 ponuda.setOntology(’B2B’)
351 m = MessageTemplate( ponuda )
352 self.addBehaviour( self.Ponuda_Msg(), m)
353
354 p = self.Ponuda_Agent( 3 )
355 self.addBehaviour( p, None )
356
357 def __init__(self, ime, lozinka, parametar1, parametar2):
358 print parametar1
359 print parametar2
360 self.param1 = parametar1
361 self.param2 = parametar2
362 self.naziv = ime
363 spade.Agent.Agent.__init__( self, ime, lozinka )
364 #self._setup()
365 self.start()
63