public void ConsiderTest( [Range(0.0f, 10.0f, 2.5f)] float xval1, [Range(0.0f, 10.0f, 2.5f)] float xval2) { // NEVER use the derived class to call // Consider otherwise the machinery in the base // class is never called! IOption option = new ConstantUtilityOption(); option.DefaultUtility = xval1; (option as Option).SetAction(new MockAction()); var cd1 = new OptionConsideration1(); var cd2 = new OptionConsideration2(); option.AddConsideration(cd1); option.AddConsideration(cd2); _optionContext.XVal1 = xval1; _optionContext.XVal2 = xval2; cd1.Consider(_optionContext); cd2.Consider(_optionContext); var cUtil1 = cd1.Utility; var cUtil2 = cd2.Utility; var cUtilL = new List <Utility>(); cUtilL.Add(cUtil1); cUtilL.Add(cUtil2); option.Consider(_optionContext); Assert.That(option.Utility.Value, Is.EqualTo(xval1.Clamp01()).Within(1e-6f)); }
public void ThinkRecursionDetectionTest() { _aic.ClearAll(); var s = new Scheduler(); // The main AI var ta = new AiTransition("TransitionToCircularAi", "circularAi", _aic); var circularAi = new UtilityAi("circularAi", _aic); var coreBehaviour = new Behaviour("cb", _bc); coreBehaviour.Selector = new MaxUtilitySelector(); var circularOption = new ConstantUtilityOption("recursive", _oc); circularOption.DefaultUtility = new Utility(1f, 1f); circularOption.SetAction("TransitionToCircularAi"); Assert.That(coreBehaviour.AddOption("recursive"), Is.True); Assert.That(circularAi.AddBehaviour(coreBehaviour.NameId), Is.True); var dm = new DecisionMaker(circularAi, _toon, s); Assert.Throws <DecisionMakerBase.PotentialCircularDependencyException>(dm.Think); try { dm.Think(); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
public void ConstructorTest() { var option = new ConstantUtilityOption(); Assert.IsNotNull(option); Assert.That(option.Weight, Is.EqualTo(1.0f).Within(1e-6f)); }
public void SelectTest1(float uval1, float uval2) { var r = new Behaviour(); r.Selector = new MaxUtilitySelector(); r.AddOption(new ConstantUtilityOption()); var option1 = new ConstantUtilityOption(); option1.SetAction(new MockAction()); option1.DefaultUtility = uval1; var option2 = new ConstantUtilityOption(); option2.SetAction(new MockAction()); option2.DefaultUtility = uval2; Assert.That(r.AddOption(option1), Is.True); Assert.That(r.AddOption(option2), Is.True); IAction cAction; cAction = uval2 > uval1 ? option2.Action : option1.Action; // When all options have equal utility the first one // is selected. Does this make sense? Perhaps... IAction aAction = r.Select(_customContext); Assert.That(cAction == aAction); }
public void BehaviourSelectionTest() { var ai = new UtilityAi(); var context = new UaiContext(); var b1 = new Behaviour(); b1.NameId = "b1"; var b2 = new Behaviour(); b2.NameId = "b2"; var consideration1 = new BehaviourConsideration1(); var consideration2 = new BehaviourConsideration2(); b1.AddConsideration(consideration1); b2.AddConsideration(consideration2); var a1 = new MockAction(); a1.NameId = "a1"; var fo1 = new ConstantUtilityOption(); fo1.SetAction(a1); b1.AddOption(fo1); var a2 = new MockAction(); a2.NameId = "a2"; var fo2 = new ConstantUtilityOption(); fo2.SetAction(a2); b2.AddOption(fo2); ai.AddBehaviour(b1); ai.AddBehaviour(b2); context.Val1 = 1.0f; context.Val2 = 0.0f; var sel1 = ai.Select(context); Assert.That(sel1 == a1); context.Val1 = 0.0f; context.Val2 = 1.0f; var sel2 = ai.Select(context); Assert.That(sel2 == a2); }
protected override void DefineOptions() { O = new Option(OptionDefs.Drink, Options); O.SetAction(ActionDefs.Drink); O.AddConsideration(ConsiderationDefs.Thirst); O = new Option(OptionDefs.Eat, Options); O.SetAction(ActionDefs.Eat); O.AddConsideration(ConsiderationDefs.Hunger); O = new Option(OptionDefs.Shower, Options); O.SetAction(ActionDefs.Shower); O.AddConsideration(ConsiderationDefs.Shower); O = new Option(OptionDefs.Sleep, Options); O.SetAction(ActionDefs.Sleep); O.AddConsideration(ConsiderationDefs.Tiredness); O = new Option(OptionDefs.Toilet, Options); O.SetAction(ActionDefs.Toilet); O.AddConsideration(ConsiderationDefs.Bladder); O = new Option(OptionDefs.Exercise, Options); O.SetAction(ActionDefs.PhysicalExercise); O.AddConsideration(ConsiderationDefs.HowUnfit); O.AddConsideration(ConsiderationDefs.Energy); O.Measure = new MultiplicativePseudoMeasure(); O = new Option(OptionDefs.Work, Options); O.SetAction(ActionDefs.Work); O.AddConsideration(ConsiderationDefs.Greed); O = new Option(OptionDefs.Read, Options); O.SetAction(ActionDefs.Read); O.AddConsideration(ConsiderationDefs.Curiosity); O = new ConstantUtilityOption(OptionDefs.Idle, Options); O.SetAction(ActionDefs.Idle); O.DefaultUtility = new Utility(0.01f, 1f); }
/// <summary> /// Initializes a new instance of the <see cref="T:Crystal.ConstantUtilityOption"/> class. /// </summary> /// <param name="other">The other.</param> ConstantUtilityOption(ConstantUtilityOption other) : base(other) { Weight = other.Weight; DefaultUtility = other.DefaultUtility; }