Package aima.core.agent.impl.aprog

Source Code of aima.core.agent.impl.aprog.ModelBasedReflexAgentProgram

package aima.core.agent.impl.aprog;

import java.util.Set;

import aima.core.agent.Action;
import aima.core.agent.AgentProgram;
import aima.core.agent.Model;
import aima.core.agent.Percept;
import aima.core.agent.impl.DynamicState;
import aima.core.agent.impl.NoOpAction;
import aima.core.agent.impl.aprog.simplerule.Rule;

/**
* Artificial Intelligence A Modern Approach (3rd Edition): Figure 2.12, page
* 51.<br>
* <br>
*
* <pre>
* function MODEL-BASED-REFLEX-AGENT(percept) returns an action
*   persistent: state, the agent's current conception of the world state
*               model, a description of how the next state depends on current state and action
*               rules, a set of condition-action rules
*               action, the most recent action, initially none
*              
*   state  <- UPDATE-STATE(state, action, percept, model)
*   rule   <- RULE-MATCH(state, rules)
*   action <- rule.ACTION
*   return action
* </pre>
*
* Figure 2.12 A model-based reflex agent. It keeps track of the current state
* of the world using an internal model. It then chooses an action in the same
* way as the reflex agent.
*
* @author Ciaran O'Reilly
* @author Mike Stampone
*
*/
public abstract class ModelBasedReflexAgentProgram implements AgentProgram {
  //
  // persistent: state, the agent's current conception of the world state
  private DynamicState state = null;

  // model, a description of how the next state depends on current state and
  // action
  private Model model = null;

  // rules, a set of condition-action rules
  private Set<Rule> rules = null;

  // action, the most recent action, initially none
  private Action action = null;

  public ModelBasedReflexAgentProgram() {
    init();
  }

  /**
   * Set the agent's current conception of the world state.
   *
   * @param state
   *            the agent's current conception of the world state.
   */
  public void setState(DynamicState state) {
    this.state = state;
  }

  /**
   * Set the program's description of how the next state depends on the state
   * and action.
   *
   * @param model
   *            a description of how the next state depends on the current
   *            state and action.
   */
  public void setModel(Model model) {
    this.model = model;
  }

  /**
   * Set the program's condition-action rules
   *
   * @param ruleSet
   *            a set of condition-action rules
   */
  public void setRules(Set<Rule> ruleSet) {
    rules = ruleSet;
  }

  //
  // START-AgentProgram

  // function MODEL-BASED-REFLEX-AGENT(percept) returns an action
  public Action execute(Percept percept) {
    // state <- UPDATE-STATE(state, action, percept, model)
    state = updateState(state, action, percept, model);
    // rule <- RULE-MATCH(state, rules)
    Rule rule = ruleMatch(state, rules);
    // action <- rule.ACTION
    action = ruleAction(rule);
    // return action
    return action;
  }

  // END-AgentProgram
  //

  //
  // PROTECTED METHODS
  //

  /**
   * Realizations of this class should implement the init() method so that it
   * calls the setState(), setModel(), and setRules() method.
   */
  protected abstract void init();

  protected abstract DynamicState updateState(DynamicState state,
      Action action, Percept percept, Model model);

  protected Rule ruleMatch(DynamicState state, Set<Rule> rules) {
    for (Rule r : rules) {
      if (r.evaluate(state)) {
        return r;
      }
    }
    return null;
  }

  protected Action ruleAction(Rule r) {
    return null == r ? NoOpAction.NO_OP : r.getAction();
  }
}
TOP

Related Classes of aima.core.agent.impl.aprog.ModelBasedReflexAgentProgram

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.