私は、利己的なエージェントが、Sugarscapeと同じようにマルチエージェントシミュレーションで商品の最適な売買価格を計算するための客観的な方法を決定しようとしています( http://en.wikipedia.org/wiki/Sugarscape )。シミュレーションは次のとおりです。
各エージェントには、食料の在庫F、お金の在庫G、一定量の「エネルギー」E、および正方形のグリッド上の位置(x、y)があります。ある正方形から隣接する正方形に移動すると、A単位のエネルギーが消費され、エネルギーはシミュレーション日あたりB単位の割合で自然に消費されます。エージェントには、毎日次のオプションがあります。1単位の食物を消費して、そのエネルギーをQ単位増やします。別の場所に移動する(十分なエネルギーがある場合)、食料を「採餌」する([おそらく未知の]量の食料を得るためにP単位のエネルギーを消費する)、または相互に合意できる価格で近隣のエージェントと取引する。
各エージェントの目標は、他のエージェントの「効用関数」U(E、F、G)を最大化することです。
すぐに、これは食品の基本的な「使用価値」を与えるようです:Vuse = U(E + Q、F-1、G) E、F、G)、しかしこれが全体の話であるならば、これは興味深い問題ではありません。
最も一般的な(ただし指数関数的な)ソリューションは次のようになります。
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
ただし、エージェントAが売買する価格自体は同じ計算に依存しているため、大きな問題は「可能な価格ごとに」敷物の下で一掃されます。
私の価値の計算は、私がそれを自分で使用することから何を得ることができるか、または他の誰かがそれに対して何を支払うかによって異なります...しかし、彼らがそれに対して支払うものは、私がそれに対して支払うものによって異なります。
この結び目をどのように切るのですか?
私はこの問題が以前に解決されたことを知っています...しかし、実際の実装は言うまでもなく、それへの参照を見つけることができません。私が最も近いのは---(SugarScapeの "Strategic Planning" に関する論文ですが、計画がどのように行われるかを説明するのではなく、計画の結果を示すだけのようです。
これの鍵は、各エージェントのマイニングコストです。おそらく、いつでも、一部のエージェントは他のエージェントよりも食品鉱山に近いでしょう。
採掘のコストはエネルギー+時間です。したがって、鉱山から遠く離れたエージェントは、そこに移動するためにより多くのエネルギーと時間を使用する必要があるため、コストが高くなります。
各エージェントは、自身の現在の採掘コストと現在のエネルギー、食料、およびお金の在庫に基づいて、最大購入価格を決定する必要があります。逆に、各エージェントは、同じ4つの要素に基づいて、最小販売価格を決定する必要があります。
取引は、あるエージェントの購入価格が別のエージェントの販売価格よりも高い場合に発生します。
では、どのように価格を設定しますか?私たち人間と同じように。販売しようとしているエージェントは、最低販売価格よりも高い価格でオファーします。購入しようとしているエージェントは、最低購入価格よりも低い価格で購入を提案します。その後、両者が合意できる価格に達するまで(または到達した場合)、2人は交渉します。
私はSugarscapeの独自の実装を持っており、これが私が問題に対処した方法です。ソースコードを使用した私の実装は http://sugarscape.sourceforge.net/ にあります。実装では、ブラウザ内で実行するためにJREインストールが必要であることに注意してください。または、JaveAppletViewerを使用してローカルで実行することもできます。
これが私の実装に基づいたこの問題に対する私の見解です。エージェントには、砂糖とスパイスの2つの食料源があります。また、両方のアイテムの消費要件(代謝)もあります。内部値は、現在の在庫で存続できるサイクル数に基づいて、各エージェントによって決定されます。したがって、エージェントに次の基本値がある場合、
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.
彼らの計算は以下のようになります、
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
... MRSの結果が1未満の場合はスパイスの好みを示し、1より大きい場合は逆に砂糖の好みを示します。
余剰を計算する:
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,
これらの計算が決定されると、異なるMRSを持つエージェントの隣接セルを調べることにより、潜在的なトレーディングパートナのリストが作成されます。
リストは、エージェントと各トレーディングパートナ間のMRSギャップによってソートされます。
取引は、エージェントとの関係でMRSギャップが最も大きい取引先との間で消費されます。利用可能な余剰が消費されるまでの複数の取引は、各サイクル内で許可される場合があります。
取引される余剰は、代理人と取引相手の間の2つの余剰のうち低い方です。
BarterPrice = Squareroot( Agent MRS * Trading Partner MRS );
私はこの答えが少し遅れていることを知っていますが、それがこの素晴らしいシミュレーションを実装しようとしている次の人に役立つことを願っています。