Determinante "valore" nella simulazione microeconomica multi-agente

1

Sto cercando di determinare un modo oggettivo per un agente interessato a calcolare il prezzo di acquisto / vendita ottimale per le merci in una simulazione multi-agente non dissimile da Sugarscape ( link ). La simulazione è la seguente:

Ogni agente ha una scorta di cibo F, una scorta di denaro G, una certa quantità di "energia", E, e una posizione (x, y) su una griglia quadrata. Spostarsi da una casella a una piazza vicina spende A unità di energia, e l'energia è naturalmente spesa ad una velocità di unità B per giorno di simulazione. Un agente ha a disposizione le seguenti opzioni durante ogni giorno: consumare un'unità di cibo per aumentare la sua energia per unità di Q; trasferirsi in un altro luogo (purché abbia energia sufficiente), "foraggio" per il cibo (consumare unità di energia P per ottenere una [possibilmente sconosciuta] quantità di cibo), o commerciare con un agente vicino per un prezzo reciprocamente accettabile.

L'obiettivo di ciascun agente è di massimizzare la sua "funzione di utilità" U (E, F, G) senza riguardo per quella di altri agenti.

Subito, questo sembra dare una base "valore d'uso" del cibo: Vuse = U (E + Q, F - 1, G) - U (E, F, G), ma se questa era l'intera storia , questo non sarebbe un problema interessante.

Sembra che la soluzione più generale (ma esponenziale) sia simile a questa:

Function SearchActions(State S):
    Add(consume food) to action set
    Add(forage for food) to action set
    For each other agent A
        For each possible trading price P
            Add(trade with A at price P) to action set
    For each action X in action set
        S' = Apply X to S
        SearchActions(S')
    Return optimal X
End function

Tuttavia, la difficoltà maggiore viene spazzata sotto il tappeto da "per ogni possibile prezzo", perché il prezzo che l'agente A acquisterà / venderà per se stesso dipende da un calcolo identico ... ad es.

Il mio calcolo del valore dipende da ciò che posso ottenere dall'utilizzarlo io stesso, o da quello che qualcun altro pagherà per questo ... ma quello che pagheranno dipende da cosa pagherò per questo.

Come si fa a tagliare questo nodo?

So che questo problema è stato risolto prima ... ma non riesco a trovare alcun riferimento ad esso, per non parlare di eventuali implementazioni effettive. Il più vicino che ho ricevuto è stato un articolo su " Pianificazione strategica "in SugarScape , ma sembra solo fornire i risultati della pianificazione, piuttosto che spiegare come viene eseguita la pianificazione.

    
posta Milton Manfried 03.03.2014 - 03:17
fonte

2 risposte

1

La chiave per questo è il costo di estrazione di ciascun agente. Presumibilmente, in qualsiasi momento, alcuni agenti saranno più vicini ad una miniera di cibo rispetto ad altri.

Il costo del mining è energia + tempo. Un agente più lontano da una miniera avrà quindi un costo maggiore perché dovrà usare più energia e tempo per viaggiare lì.

Ogni agente dovrà determinare il suo prezzo di acquisto massimo in base al suo attuale costo di estrazione e al suo attuale stock di energia, cibo e denaro. Viceversa, ogni agente dovrà determinare il prezzo minimo di vendita basato su quegli stessi quattro fattori.

Uno scambio avviene quando il prezzo di acquisto di un agente è superiore al prezzo di vendita di un altro agente.

Come si impostano i prezzi allora? Allo stesso modo in cui lo facciamo noi umani. Un agente che cerca di vendere offrirà un prezzo superiore al suo prezzo di vendita minimo. Un agente che cerca di acquistare proporrà un acquisto a un prezzo inferiore rispetto al suo prezzo di acquisto minimo. I due negozieranno quindi fino a quando (o se) verrà raggiunto un prezzo accettabile per entrambi.

    
risposta data 03.03.2014 - 21:22
fonte
0

Ho la mia implementazione di Sugarscape ed ecco come ho affrontato il problema. La mia implementazione con il codice sorgente è disponibile all'indirizzo link . Nota, l'implementazione richiede l'installazione di JRE per l'esecuzione all'interno del browser. In alternativa puoi eseguirlo localmente usando Jave AppletViewer.

Ecco la mia opinione su questo problema in base alla mia implementazione. Gli agenti hanno due fonti di cibo, Sugar & Spezia. Hanno anche requisiti di consumo (metabolismo) per entrambi gli articoli. Un valore interno è determinato da ciascun agente in base al numero di cicli in cui le scorte attuali consentiranno loro di sopravvivere. Quindi se l'agente ha i seguenti valori di base,

Agent x has 15 units of sugar and needs to consume 3 sugar units to survive each cycle.
Agent x has 30 units of spice and needs to consume 2 spice units to survive each cycle.

I loro calcoli vanno come descritto di seguito,

Sugar Metabolic Rate (SuM) = 15 / 3 = 5.
Spice Metabolic Rate (SpM) = 30 / 2 = 15.

Time Until Death = Minimum of (SuM, SpM)

Marginal Rate of Substitution (MRS) = SpM / SuM

... I risultati MRS inferiori a 1 indicano una preferenza per le spezie, i risultati maggiori di 1 indicano invece una preferenza per lo zucchero.

Calcola eccedenza:

if( MRS > 1  )
{   surplus = SpiceStocks - (SpiceMetabolism * TUD);
    //If surplus <= metabolism Then Set surplus to Zero
    surplus = surplus > (SpiceMetabolism * 2) ? surplus : 0;
} 
else if( MRS < 1  )
{   surplus = SugarStocks - (SugarMetabolism * TUD);
    //If surplus <= metabolism Then Set surplus to Zero
    surplus = surplus > (SugarMetabolism * 2) ? surplus : 0;
}
else
    surplus = 0;    //MRS == 1, 

Una volta determinati questi calcoli, viene creato un elenco di potenziali partner commerciali esaminando le celle adiacenti per gli agenti con una MRS diversa.

L'elenco è ordinato in base allo scarto MRS tra l'agente e l'amplificatore; ogni partner commerciale.

Uno scambio viene consumato con il partner commerciale che ha il gap di MRS più alto in relazione al nostro agente. Le negoziazioni multiple fino a quando il surplus disponibile è consumato possono essere consentite all'interno di ciascun ciclo.

L'eccedenza da negoziare è la minore delle 2 eccedenze tra agente e partner commerciale.

BarterPrice = Squareroot( Agent MRS * Trading Partner MRS );

So che questa risposta è un po 'in ritardo, ma spero che aiuti la prossima persona a cercare di implementare questa meravigliosa simulazione.

    
risposta data 13.06.2015 - 18:40
fonte