using System.Collections; using System.Collections.Generic; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace MLAgents { /// /// The Heuristic Brain type allows you to hand code an Agent's decision making process. /// A Heuristic Brain requires an implementation of the Decision interface to which it /// delegates the decision making process. /// When yusing a Heuristic Brain, you must give it a Monoscript of a Decision implementation. /// [CreateAssetMenu(fileName = "NewHeuristicBrain", menuName = "ML-Agents/Heuristic Brain")] public class HeuristicBrain : Brain { [SerializeField] [HideInInspector] public Decision decision; #if UNITY_EDITOR [HideInInspector] public MonoScript decisionScript; #endif [SerializeField] [HideInInspector] public string c_decision; public void OnValidate() { #if UNITY_EDITOR if (decisionScript != null) { c_decision = decisionScript.GetClass().Name; } else { c_decision = ""; } #endif } /// protected override void Initialize() { if ((c_decision != null) && decision == null) { decision = CreateInstance(c_decision) as Decision; decision.brainParameters = brainParameters; } } ///Uses the Decision Component to decide that action to take protected override void DecideAction() { if (decision == null) { throw new UnityAgentsException( "The Brain is set to Heuristic, but no decision script attached to it"); } foreach (Agent agent in agentInfos.Keys) { agent.UpdateVectorAction(decision.Decide( agentInfos[agent].stackedVectorObservation, agentInfos[agent].visualObservations, agentInfos[agent].reward, agentInfos[agent].done, agentInfos[agent].memories)); } foreach (Agent agent in agentInfos.Keys) { agent.UpdateMemoriesAction(decision.MakeMemory( agentInfos[agent].stackedVectorObservation, agentInfos[agent].visualObservations, agentInfos[agent].reward, agentInfos[agent].done, agentInfos[agent].memories)); } agentInfos.Clear(); } } }