我试图找到一种更好的办法,即我目前的办法,来管理一个连续的Markov链的目前状态。 国家病媒使用的是(状态、可变性)乳房,其概率为浮动。
需要优化的算法中,有以下业务:
- every iteration starts with a current state vector
- computes the reachable states for every current one in vector and store all of them in a temporary list together with the probability of going there
- for every element in this new list it calculates the new state vector by iterating over the possible transitions (mind that there can be many transitions which lead to the same state but found from different source states)
实际采用
因此,从根本上来说,为了建设新的病媒,每个过渡阶段的正常价值都是计算出来的,因此,病媒状态的恢复,增加了目前过渡的可能性,结果又被储存。
这种做法似乎迄今为止已经奏效,但我却试图应对在非常大的空间病媒(500k-1mil State)中起主导作用的系统,尽管仓促使储存和检索工作不断复杂化,但蒸汽实际上开始减缓许多工作。
例如,我们从一个拥有100克国家的病媒开始,对每一个国家来说,我们都是对可以接触的国家(通常为“......”);1 以便我们获得100k*(可以接触到的国家)的过渡清单。 然后,每一次过渡都是用来计算新的概率矢量。
不幸的是,我需要从整个可达到的清单中找到一种正常价值,而不实际计算下一个胎盘,但无论如何,正如我通过貌相看到的那样,这并不是算法的瓶颈。 每次过渡计算时都存在瓶颈。
用于计算现有病媒的过渡清单(pi
):
HTable.fold (fun s p l ->
if check s f2 then (0., s, p, [s, 1.0]) :: l
else if not (check s f1) then (0., s, p, [s, 1.0]) :: l
else
let ts = P.rnext s in
if List.length ts = 0 then (0., s, p, [s, 1.0]) :: l
else
let lm = List.fold_left (fun a (s,f) -> f +. a) 0. ts in
(lm, s, p, ts) :: l) pi []
而这一职能是通过通过过渡名单来调整新的<代码>pi,并使所有这些功能正常化:
let update_pi s v =
try
let t = HTable.find pi s in
HTable.replace pi s (v +. t)
with Not_found -> HTable.add pi s v
in
HTable.clear pi;
List.iter (fun (llm, s, p, ts) ->
if llm = 0. then
update_pi s p
else begin
List.iter (fun (ss, pp) ->
update_pi ss (p *. (pp /. lm))
) ts;
if llm < lm then update_pi s (p *. (1. -. (llm /. lm)))
end
) u;
我应当找到一个最适合Im行动的数据结构,问题在于,根据目前的做法,我必须做一回事,为每个过渡阶段制定一套办法,但是,由于经常费用非常昂贵,因此,太多的反饥饿行动会杀害业绩。