Я работаю над библиотекой для изучения теоретико-игрового обучения. В этой настройке N
агенты объединяются и взаимодействуют со средой. Каждый агент выводит модель взаимодействия. Модель одного агента зависит от его 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
и т. д., но не смог выполнить одну операцию над каждым элементом кортежа. Я безуспешно пытался построить функцию с переменным числом аргументов по типу printf
.
Я знаю, что мог бы использовать шаблон haskell, но мне интересно, есть ли более приятное решение, которое я упускаю из виду. Будем очень признательны за любой указатель на какой-либо код, имеющий дело с конечным, но произвольным числом разнородных элементов.
N
действия и генерирующийN
сигналы. Агент может работать с любой средой, принимая правильное действие и генерируя правильный сигнал. Это не полностью гетерогенно, но пространства действия и сигнала являются произвольными конечными множествами. - person Nicolas Dudebout   schedule 20.09.2012