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));
        }
示例#2
0
        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));
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
 /// <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;
 }