To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Revision:

root / _FullBNT / BNT / general / solve_limid.m @ 8:b5b38998ef3b

History | View | Annotate | Download (1.89 KB)

1
function [strategy, MEU, niter] = solve_limid(engine, varargin)
2
% SOLVE_LIMID Find the (locally) optimal strategy for a LIMID
3
% [strategy, MEU, niter] = solve_limid(inf_engine, ...)
4
%
5
% strategy{d} = stochastic policy for node d (a decision node)
6
% MEU = maximum expected utility
7
% niter = num iterations used
8
%
9
% The following optional arguments can be specified in the form of name/value pairs:
10
% [default in brackets]
11
%
12
% max_iter - max. num. iterations [ 1 ]
13
% tol - tolerance required of consecutive MEU values, used to assess convergence [1e-3]
14
% order - order in which decision nodes are optimized [ reverse numerical order ]
15
%
16
% e.g., solve_limid(engine, 'tol', 1e-2, 'max_iter', 10)
17

    
18
bnet = bnet_from_engine(engine);
19

    
20
% default values
21
max_iter = 1;
22
tol = 1e-3;
23
D = bnet.decision_nodes;
24
order = D(end:-1:1);
25

    
26
args = varargin;
27
nargs = length(args);
28
for i=1:2:nargs
29
  switch args{i},
30
   case 'max_iter', max_iter  = args{i+1}; 
31
   case 'tol',      tol = args{i+1}; 
32
   case 'order',    order = args{i+1}; 
33
   otherwise,  
34
    error(['invalid argument name ' args{i}]);       
35
  end
36
end
37

    
38
CPDs = bnet.CPD;
39
ns = bnet.node_sizes;
40
N = length(ns);
41
evidence = cell(1,N);
42
strategy = cell(1, N);
43

    
44
iter = 1;
45
converged = 0;
46
oldMEU = 0;
47
while ~converged & (iter <= max_iter)
48
  for d=order(:)'
49
    engine = enter_evidence(engine, evidence, 'exclude', d);
50
    [m, pot] = marginal_family(engine, d);
51
    %pot = marginal_family_pot(engine, d);
52
    [policy, score] = upot_to_opt_policy(pot);    
53
    e = bnet.equiv_class(d);
54
    CPDs{e} = set_fields(CPDs{e}, 'policy', policy);
55
    engine = update_engine(engine, CPDs);
56
    strategy{d} = policy;
57
  end  
58
  engine = enter_evidence(engine, evidence);
59
  [m, pot] = marginal_nodes(engine, []);
60
  %pot = marginal_family_pot(engine, []);
61
  [dummy, MEU] = upot_to_opt_policy(pot);    
62
  if approxeq(MEU, oldMEU, tol)
63
    converged = 1;
64
  end
65
  oldMEU = MEU;
66
  iter = iter + 1;
67
end
68
niter = iter - 1;