⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parallel_protocol.m

📁 基于贝叶斯网络的源程序
💻 M
字号:
function [bel, niter] = parallel_protocol(engine, evidence, pot_type, local_kernel, msg)bnet = bnet_from_engine(engine);ns = bnet.node_sizes;onodes = find(~isemptycell(evidence));ndoms = length(engine.gdl.doms);prod_of_msg = cell(1, ndoms);bel = cell(1, ndoms);old_bel = cell(1, ndoms);converged = 0;iter = 1;while ~converged & (iter <= engine.max_iter)    % each node multiplies all its incoming msgs and computes its local belief  old_bel = bel;  for i=1:ndoms    prod_of_msg{i} = mk_initial_pot(pot_type, engine.gdl.doms{i}, ns, bnet.cnodes, onodes);    nbrs = engine.gdl.nbrs{i};    for j=nbrs(:)'      prod_of_msg{i} = multiply_by_pot(prod_of_msg{i}, msg{j,i});    end    bel{i} = normalize_pot(multiply_by_pot(local_kernel{i}, prod_of_msg{i}));  end  if ~isempty(engine.fid)    for i=1:ndoms      tmp = pot_to_marginal(bel{i});      %fprintf(engine.fid, '%9.7f ', tmp.T(1));      fprintf(engine.fid, '%9.7f ', tmp.U(1));    end    %fprintf(engine.fid, '  U ');    %for i=1:ndoms    %  tmp = pot_to_marginal(bel{i});    %  fprintf(engine.fid, '%9.7f ', tmp.U(1));    %end    fprintf(engine.fid, '\n');  end  % converged?  if iter==1    converged = 0;  else    converged = 1;    for i=1:ndoms      if ~approxeq_pot(bel{i}, old_bel{i}, engine.tol)	converged = 0;	break;      end    end  end  if ~converged    old_msg = msg;    % each node sends a msg to each of its neighbors    for i=1:ndoms      nbrs = engine.gdl.nbrs{i};      for j=nbrs(:)'	% multiply all incoming msgs except from j	temp = prod_of_msg{i};	temp = divide_by_pot(temp, old_msg{j,i});	% send msg from i to j	temp = multiply_by_pot(temp, local_kernel{i});	temp2 = marginalize_pot(temp, engine.gdl.sepset{i,j}, engine.maximize);	msg{i,j} = normalize_pot(temp2);      end    end  end  iter = iter + 1;endniter = iter-1;if 0for i=1:ndoms  prod_of_msg{i} = mk_initial_pot(pot_type, engine.gdl.doms{i}, ns, bnet.cnodes, onodes);  nbrs = engine.gdl.nbrs{i};  for j=nbrs(:)'    prod_of_msg{i} = multiply_by_pot(prod_of_msg{i}, msg{j,i});  end  bel{i} = normalize_pot(multiply_by_pot(local_kernel{i}, prod_of_msg{i}));endend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -