私はゲーム理論の学習を研究するために図書館で働いています。この設定では、N
エージェントがまとめられ、環境と対話します。各エージェントは、相互作用のモデルを導き出します。1つのエージェントのモデルは、そのN-1
対戦相手によって異なります。1
エージェントとエージェントのモデルを決定するコードを作成し2
、それを一般化しようとしています。これが私が持っているコードの一部です:
data System w x a s h h' = System { signaling :: SignalingWXAS w x a s
, dynamic :: DynamicXAS x a s
, strategy :: MockupStrategy x a s h h' }
data JointState w x a s h h' = JointState { worldState :: w
, state :: x
, mockupState :: MockupState a s h h' }
systemToMockup :: ( Bounded w, Ix w, Bounded x, Ix x
, Bounded a, Ix a, Bounded s, Ix s
, Bounded (h a), Ix (h a), Bounded (h' s), Ix (h' s)
, History h, History h'
) => System w x a s h h' -> Mockup a s h h'
systemToMockup syst = mock
where
mock z = norm $ statDist >>=? condit z >>= computeStatesAndAction >>= sig >>=$ extractSignal
statDist = ergodicStationary $ transition syst
condit z = just z . mockupState
sig = uncurryN $ signaling syst
strat = strategy syst
computeStatesAndAction joint = do
let w = worldState joint
let x = state joint
a <- strat x (mockupState joint)
return (w, x, a)
extractSignal (_, s) = s
と
data System2 w x1 a1 s1 h1 h1' x2 a2 s2 h2 h2' = System2 { signaling :: SignalingWXAS2 w x1 a1 s1 x2 a2 s2
, dynamic1 :: DynamicXAS x1 a1 s1
, dynamic2 :: DynamicXAS x2 a2 s2
, strategy1 :: MockupStrategy x1 a1 s1 h1 h1'
, strategy2 :: MockupStrategy x2 a2 s2 h2 h2' }
data JointState2 w x1 a1 s1 h1 h1' x2 a2 s2 h2 h2' = JointState2 { worldState :: w
, state1 :: x1
, mockupState1 :: MockupState a1 s1 h1 h1'
, state2 :: x2
, mockupState2 :: MockupState a2 s2 h2 h2' }
systemToMockups2 syst = (mock1, mock2)
where
mock1 z1 = norm $ statDist >>=? condit1 z1 >>= computeStatesAndActions >>= sig >>=$ extractSignal1
mock2 z2 = norm $ statDist >>=? condit2 z2 >>= computeStatesAndActions >>= sig >>=$ extractSignal2
statDist = ergodicStationary $ transition2 syst
condit1 z1 = just z1 . mockupState1
condit2 z2 = just z2 . mockupState2
sig = uncurryN $ signaling syst
strat1 = strategy1 syst
strat2 = strategy2 syst
computeStatesAndActions joint = do
let w = worldState joint
let x1 = state1 joint
let x2 = state2 joint
a1 <- strat1 x1 (mockupState1 joint)
a2 <- strat2 x2 (mockupState2 joint)
return (w, x1, a1, x2, a2)
extractSignal1 (_, s, _) = s
extractSignal2 (_, _, s) = s
私は、systemToMockupN
有限数のエージェントに対応できる関数定義を求めています。
エージェントは異種であるため、リストを直接使用することはできません。事前にサイズがわからないのでタプルは使えません。curryN
、などを使用してみuncurryN
ましたが、タプルのすべての要素に対して1つの操作を実行できませんでした。同様の方法で可変個引数関数を作成しようとしましたprintf
が、成功しませんでした。
テンプレートhaskellを使用できることは知っていますが、見落としているより良い解決策があるかどうか疑問に思っています。有限であるが任意の数の異種要素を処理するコードへのポインタは大歓迎です。