solve_limid.m

来自「麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!」· M 代码 · 共 69 行

M
69
字号
function [strategy, MEU, niter] = solve_limid(engine, varargin)% SOLVE_LIMID Find the (locally) optimal strategy for a LIMID% [strategy, MEU, niter] = solve_limid(inf_engine, ...)%% strategy{d} = stochastic policy for node d (a decision node)% MEU = maximum expected utility% niter = num iterations used%% The following optional arguments can be specified in the form of name/value pairs:% [default in brackets]%% max_iter - max. num. iterations [ 1 ]% tol - tolerance required of consecutive MEU values, used to assess convergence [1e-3]% order - order in which decision nodes are optimized [ reverse numerical order ]%% e.g., solve_limid(engine, 'tol', 1e-2, 'max_iter', 10)bnet = bnet_from_engine(engine);% default valuesmax_iter = 1;tol = 1e-3;D = bnet.decision_nodes;order = D(end:-1:1);args = varargin;nargs = length(args);for i=1:2:nargs  switch args{i},   case 'max_iter', max_iter  = args{i+1};    case 'tol',      tol = args{i+1};    case 'order',    order = args{i+1};    otherwise,      error(['invalid argument name ' args{i}]);         endendCPDs = bnet.CPD;ns = bnet.node_sizes;N = length(ns);evidence = cell(1,N);strategy = cell(1, N);iter = 1;converged = 0;oldMEU = 0;while ~converged & (iter <= max_iter)  for d=order(:)'    engine = enter_evidence(engine, evidence, 'exclude', d);    [m, pot] = marginal_family(engine, d);    %pot = marginal_family_pot(engine, d);    [policy, score] = upot_to_opt_policy(pot);        e = bnet.equiv_class(d);    CPDs{e} = set_fields(CPDs{e}, 'policy', policy);    engine = update_engine(engine, CPDs);    strategy{d} = policy;  end    engine = enter_evidence(engine, evidence);  [m, pot] = marginal_nodes(engine, []);  %pot = marginal_family_pot(engine, []);  [dummy, MEU] = upot_to_opt_policy(pot);      if approxeq(MEU, oldMEU, tol)    converged = 1;  end  oldMEU = MEU;  iter = iter + 1;endniter = iter - 1;

⌨️ 快捷键说明

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