A gazdasági cserét modellező szimulációkban az ügynökök közötti interakciók kulcsfontosságúak, hogy megértsük, hogyan történnek az erőforrások (például érmék) átadása. Az ügynökök közötti transzferek szabályozása és a rendszer mozgásának szimulálása sok érdekes kérdést vet fel, amelyeket megértve jobban ráláthatunk a szimulációk és modellek működésére. A következőben azt vizsgáljuk meg, hogyan valósul meg az ügynökök közötti érmecserélés egy Python-alapú szimulációban, ahol az ügynökök mozgása és döntései szabályozzák a gazdasági rendszert.
Az ügynökök érmecseréjének alapja a take_coin módszer, amely valóban végrehajtja a tranzakciót, ha a megfelelő feltételek teljesülnek. Ha az ügynök rendelkezik érmével, a tranzakció lezajlik: az ügynök csökkenti az érméinek számát, és az új ügynök hozzáad egy érmét a saját vagyonához. Ha az ügynök nem rendelkezik érmével, akkor a tranzakció nem történik meg, és a szimuláció folytatódik.
A szimuláció két fontos függvényt használ az interakciók vezérlésére: neighbour és give_or_take_coin. A neighbour függvény az ügynökök szomszédos celláit ellenőrzi, míg a give_or_take_coin biztosítja, hogy csak akkor történjen érmecsere, ha az ügynöknek van mit adnia. Ha egy ügynök rendelkezik érmével, akkor a give_coin metódus hívódik meg, amely növeli annak az ügynöknek a gazdagságát, aki az érmét megkapja. Ellenkező esetben a give_coin nem kerül meghívásra.
A neighbour függvény két ügynök (x1, y1) és (x, y) koordinátáit veszi figyelembe, hogy megállapítsa, azok szomszédos cellákban helyezkednek-e el. Ha igen, akkor igaz értéket ad vissza, különben hamis értéket. A give_or_take_coin függvény az ügynökök pozícióit ellenőrzi, és ha a pozíciók egy szomszédos cellában helyezkednek el, akkor a megfelelő ügynök indexét adja vissza. Ha nincs ilyen ügynök, akkor -1-et ad vissza, jelezve, hogy nincs senki a környezetében.
A rendszer szimulációjában a legfontosabb szereplő az ügynök. Az ügynök egy objektum, amely adatokat és funkciókat csoportosít egy osztályba. A Pythonban az osztályokat a class kulcsszóval definiáljuk. Az ügynökök esetében egy agent osztályt definiálunk, amely az ügynökök számára fenntartott különböző attribútumokat tartalmazza, mint például az ügynök ID-ja, a grid oszlopainak és sorainak száma, illetve a kezdő érmék száma.
Az ügynök osztályának inicializálása (azaz az objektum létrehozása) a __init__ metódus segítségével történik. Ekkor az ügynök különböző paramétereket kap, mint például az ügynök ID-ja, az oszlopok és sorok száma a gridben, valamint az érmék száma. Az ügynök pozíciójának beállítása során fontos, hogy a pozíció érvényes legyen, azaz nem ütközzön más ügynökök pozíciójával. A generált koordinátákat a validate_position metódus ellenőrzi, hogy megbizonyosodjon arról, hogy az új pozíció szabad.
Miután a pozíciót érvényesnek találja, az ügynök elkezd mozogni. A raw_move metódus véletlenszerű mozgást generál a szomszédos cellákba, biztosítva, hogy az ügynök soha ne ütközzön más ügynökkel. Minden egyes mozgás után a szimuláció frissíti az ügynökök pozícióját, így biztosítva, hogy a rendszer folyamatosan változik és reagál a különböző eseményekre.
A szimulációs modell lehetőséget ad arra, hogy az ügynökök gazdagságának növekedését, valamint a köztük zajló interakciókat nyomon kövessük. Az ügynökök mozgása és a gazdasági cserék segítenek jobban megérteni az erőforrások eloszlásának dinamikáját, valamint azokat a szabályokat, amelyek meghatározzák az egyes ügynökök közötti interakciók sikerességét. A szimuláció végeredménye egy olyan komplex gazdasági rendszer, amely képes adaptálódni a különböző paraméterek változásaihoz.
Az ügynökrendszerek és azok gazdasági modellezése lehetőséget ad arra, hogy megértsük a valós gazdaságok működését is. A szimulált környezetekben az ügynökök egyszerű szabályok alapján cselekednek, azonban ezek a szabályok összetett, nem lineáris eredményekhez vezethetnek, amelyek hasonlítanak a valós gazdasági rendszerek viselkedésére. A szimulációk lehetőséget adnak arra is, hogy teszteljük a különböző gazdasági politikákat és azok hatásait anélkül, hogy valós erőforrásokat kellene mozgósítani.
A szimulációval kapcsolatos további fontos megfontolás, hogy az ügynökök közötti interakciók és a gazdasági cserék nemcsak a tranzakciók egyszerű végrehajtásáról szólnak. A szimulált gazdaságban egy ügynök társadalmi, gazdasági státusza, valamint az általa használt stratégiák is kulcsszerepet játszanak. A pénzforgalom mellett az ügynökök közötti bizalom, kooperáció és verseny mind hozzájárulnak a gazdaság sikeréhez.
Hogyan változik a döntéshozatal válság idején: Az Ultimátum Játék mint tanulóügynökök példája
A válság nélküli helyzetet vizsgáló első ábrán a következő kódot használjuk: plt.bar(lx, ly, width=width) (7.65. lista). A bar() a Matplotlib metódusa, amely lehetővé teszi az oszlopdiagramok rajzolását; három paramétert vesz figyelembe: a címkéket (lx változóban tárolt oszlopok), az értékeket (ly változóban), és opcionálisan a szélességet (width). A ciklus, amely az oszlopok fölött elhelyezi a szöveges értékeket: for n in range(len(ly)): plt.text(n, ly[n], ly[n], ha="center", va="bottom") (7.66. lista), biztosítja, hogy az értékek a megfelelő helyre kerüljenek az oszlopok felett.
A válság idején a helyzet némileg megváltozik. Az alábbiakban bemutatott második kódrészlet (plt.subplot(2, 1, 2) plt.title("With crisis") plt.bar(lx2, ly2, width=width, color="red") for n in range(len(ly2)): plt.text(n, ly2[n], ly2[n], ha="center", va="bottom"), 7.67. lista) ugyanezt a folyamatot alkalmazza, de ezúttal a válság hatását ábrázolva, az oszlopok piros színnel jelennek meg.
A diagram két különböző forgatókönyvet mutat be: a válság előtti állapotot és a válságos időszakot. A válság előtti állapotban az epsilon változó, amely a True vagy False értékekből választ, meghatározza az ajánlatok eredményét: a két oszlop közötti maximális értéket választja. Az első, kék oszlopok (lásd 7.8 ábra) az alábbi értékeket ábrázolják balról jobbra: az összeg, amelyet a válaszadó véletlenszerűen választott és pozitív eredményt hozott, a véletlenszerűen választott összeg, amely negatív eredménnyel zárult, az összeg, amelyet a válaszadó a két oszlop közül a legnagyobb érték alapján választott, és pozitív eredménnyel járt, valamint az összeg, amelyet a válaszadó a két oszlop közül a legnagyobb érték alapján választott, de negatív eredménnyel zárult.
A válság alatt, azonban az epsilon értéke nem kerül alkalmazásra, mert egy határértéket (threshold) határozunk meg. A válságos időszakban a válaszadók elfogadási küszöbértéke 50%-kal nő, így az összes összeg, amit kínálnak, szinte biztosan elfogadásra kerül. A piros oszlopok (lásd 7.9 ábra) az alábbiakat jelenítik meg: az összeg, amelyet a válaszadó elfogadott és pozitív eredményt hozott, valamint az összeg, amelyet a válaszadó elfogadott és negatív eredménnyel zárt. A példában látható, hogy válság alatt a válaszadó mindig az ajánlott összeg 100%-át elfogadja, miközben a felajánló nem tanul, mert előre meghatározott célja van, amit nem befolyásol a válság.
Ez az elemzés jól mutatja, hogyan módosítja a válság a gazdasági döntéshozatalt, és hogyan formálja át a tanulóügynökök viselkedését a dinamikusan változó környezetekben. Az Ultimátum Játék keretein belül a válság dinamikája lehetőséget ad arra, hogy jobban megértsük, hogyan befolyásolják a külső kényszerek az egyes ügynökök döntéseit. A válság előtt az ügynökök még képesek lehetnek igazságos kompromisszumokra, de amikor a válság bekövetkezik, sokkal hajlamosabbak a kockázatkerülő, de biztos döntésekre.
A gazdasági szimulációkban, például az Ultimátum Játékban, az ügynökök viselkedését a tanulási algoritmusok (például a Fiktív Játék és a Megerősítéses Tanulás) alakítják. A válságos helyzetekben a válaszadók elfogadási küszöbértéke emelkedik, ami arra utal, hogy a döntéshozatali folyamatok nemcsak a játékosok stratégiáit, hanem a szociális és gazdasági környezetet is tükrözik. A válság idején a szorosabb, biztosabb döntések előtérbe kerülnek, míg a stabilabb időszakokban a választásokat inkább a kockázat és a hosszú távú előnyök befolyásolják.
Ez a jelenség figyelembevételével, az Ultimátum Játék nem csupán egy egyszerű matematikai vagy gazdasági modell, hanem egy erőteljes eszköz arra, hogy megértsük, hogyan reagálnak az ügynökök (emberek, társadalmak, vállalatok) a külső hatásokra. A gépi tanulás alkalmazása lehetővé teszi számunkra, hogy ezek a reakciók még komplexebbé váljanak, és hogy az ügynökök dinamikusan alkalmazkodjanak a környezeti változásokhoz.
Ezek a tanulmányok nemcsak a gazdaságban játszott szerepüket tárják fel, hanem új lehetőségeket is biztosítanak arra, hogy a válságok idején a döntéshozatali modelleket jobban megértsük. A modellezés során fontos figyelembe venni a viselkedési modelleket, amelyek az ügynökök tanulási algoritmusain keresztül valósulnak meg, hiszen ezek segíthetnek az emberek és intézmények válaszreakcióinak előrejelzésében.
Hogyan oldja meg Julia a kétnyelvű programozás problémáját?
A kétnyelvű programozás problémája egyre inkább előtérbe kerül, különösen azok számára, akik komplex alkalmazásokat fejlesztenek, és szükségük van a magas szintű dinamikus nyelvek rugalmasságára a prototípusokhoz, miközben elkerülik a lassúságot a végleges alkalmazásban. Erre a célra a Python vagy az R nyelvek ideálisak a gyors prototípusokhoz, mivel könnyen implementálhatóak és lehetőséget adnak az interaktív fejlesztésre. Azonban az ilyen nyelvek nem alkalmasak nagy adathalmazok vagy igényes számítási környezetek kezelésére. A végleges alkalmazásnak tehát alacsony szintű, statikus nyelvekre, például C/C++-ra van szüksége, hogy hatékonyan dolgozhasson a kritikus teljesítményigényű részekkel.
A Julia nyelv lehetőséget ad arra, hogy kiküszöbölje a kétnyelvű programozás hátrányait. Bár első pillantásra úgy tűnhet, hogy a Julia hasonló a Pythonhoz és más értelmezett nyelvekhez, valójában egy lefordított nyelv, amely optimalizált gépi kódot generál a futtatás előtt. Ez azt jelenti, hogy amikor először hívunk meg egy függvényt, a fordító először megpróbálja meghatározni a változók típusát, majd egy optimalizált, lefordított gépi kódot generál, amelyet a processzor közvetlenül futtat. Ennek következményeként a Julia alkalmazása a kezdeti hívások során lassabb lehet, mivel a kódot először le kell fordítani, de ezt követően a gépi kódot közvetlenül hajtja végre, így gyorsabbá válik.
A Julia egy „opcionálisan típusos” nyelv, amely lehetővé teszi, hogy a programozó explicit módon meghatározza a változók típusát, de nem kötelező ezt megtenni. Ezzel szemben a statikusan típusos nyelvek, mint a C/C++, előírják a változók típusainak pontos meghatározását a kód írásakor, míg a dinamikusan típusos nyelvek, mint a Python, futás közben képesek az adattípusok automatikus meghatározására. A Julia esetében a típusokat az első futtatáskor automatikusan kitalálja a fordító, és a különböző típusok kombinációira optimalizált metódusokat generál.
A párhuzamos számítások is fontos szerepet játszanak a Julia nyújtotta előnyökben, különösen az ügynökalapú modellek (ABM) futtatásánál. A világ, amelyet az ügynökalapú modellek modelleznek, egy összetett rendszer, ahol sok, egymással összefüggő esemény zajlik egyidejűleg. A párhuzamos számítás lehetőséget ad arra, hogy ezeket az eseményeket egyszerre kezeljük, és jelentősen csökkentsük a számítási időt, különösen akkor, ha a problémákat kisebb részekre oszthatjuk fel. A Julia támogatja a különböző párhuzamos számítási lehetőségeket, beleértve a több szálon való futtatást, ahol a különböző folyamatok megosztott memória területen dolgoznak, a diszkrét számításokat, amikor külön gépeken futnak a folyamatok, és a GPU számításokat, amelyek lehetővé teszik a párhuzamos feldolgozást a grafikus kártyák segítségével.
Ügynökalapú modellek fejlesztésekor fontos, hogy a modellezett ügynököknek saját reprezentációjuk legyen. Az egyszerűbb modellek esetén elegendő lehet egy egyszerű ügynöktípus, amely tárolja az ügynök jellemzőit és irányítja a viselkedését. A bonyolultabb modellek esetén az ügynöktípusok összetettebbek lehetnek, például különböző szinteken vagy típusokon alapuló egyéneket reprezentálhatnak. Emellett szükség van frissítő függvényekre is, amelyek képesek frissíteni a modellt különböző szinteken: (a) az ügynök állapotát az ő környezetéhez és más ügynökökhöz viszonyítva, (b) az ügynök állapotát az időhöz viszonyítva, és (c) a környezet állapotát az időhöz és az ügynökökhöz viszonyítva.
Egy egyszerű ügynökalapú modell felépítésekor a Julia segítségével egy composite típus (struktúra) használatával hozhatunk létre egy-egy ügynököt. Ez a composite típus egy névvel ellátott mezők gyűjteménye, amelyek hasonlóak az objektum-orientált nyelvekben alkalmazott osztályokhoz, de nem tartalmaznak metódusokat. Az ügynök típusát úgy definiálhatjuk, hogy az tárolja az ügynök azonosítóját és kétdimenziós helyzetét. Ezen kívül, ha az ügynökök pozícióját módosítani szeretnénk, akkor mutable (módosítható) struktúrákat kell alkalmaznunk, mivel az alapértelmezett típusok (immutable típusok) nem engednek változtatásokat a tulajdonságokban.
A Julia lehetőséget biztosít arra, hogy hatékonyan optimalizáljuk a teljesítményt, különösen a composite típusok és azok mezőinek definíciójában. A típusok hierarchikus rendszerben szerveződnek, és a concrete típusok, mint az Int64 vagy String, lehetővé teszik, hogy konkrét példányokat hozzunk létre. Ezzel szemben az abstract típusok, mint a Number vagy Real, csak a típusokat csoportosítják, de nem tartalmaznak konkrét értékeket. Az optimális teljesítmény eléréséhez elengedhetetlen, hogy a composite típusok mezői concrete típusokat tartalmazzanak, mivel így a fordító képes lesz hatékonyan optimalizálni a kódot.
A programozók számára fontos figyelmet fordítani a típusok helyes használatára, hogy elkerüljük a teljesítményproblémákat. Bár a Julia támogatja az absztrakt típusok használatát, a concrete típusok használata elengedhetetlen a gyors és hatékony végrehajtás érdekében.
Miért fontos a tengeri turizmus fejlődése a Közel-Keleten?
Hogyan formálódott a fantasztikus kések története: Ehlers és Hibben különleges együttműködése
Hogyan értékelhetjük a heveny hasi fájdalmat és annak lehetséges okait?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский