예제 #1
0
        public void 遺伝によるコピーで作られたDecisionMakerは完全に同じ動きをする()
        {
            // Init parent
            var parentDecisionMaker = new ReinforcementDecisionMaker();
            var actions             = new List <IAction>();

            for (int i = 0; i < 100; i++)
            {
                actions.Add(LocomotionAction.GoStraight(i.ToString()));
            }
            parentDecisionMaker.Init(actions);
            parentDecisionMaker.DecideAction(_dummyStates[0], forceRandom: false, forceMax: true);


            // Init child
            var childDecisionMaker = new ReinforcementDecisionMaker();

            childDecisionMaker.Init(parentDecisionMaker);

            // Assertion
            foreach (var state in _dummyStates)
            {
                Assert.AreEqual(
                    parentDecisionMaker.DecideAction(state, forceRandom: false, forceMax: true)
                    .Name,     // choose from 100 choice
                    childDecisionMaker.DecideAction(state, forceRandom: false, forceMax: true).Name
                    );
            }
        }
예제 #2
0
        public void SubDecisionMakerを使って意思決定ができ遺伝もできる()
        {
            // Init parent
            var parentDecisionMaker = new ReinforcementDecisionMaker();
            var actions             = new List <IAction>();

            actions.AddRange(LocomotionAction.EightDirections());
            for (int i = 0; i < 100; i++)
            {
                actions.Add(
                    new SubDecisionMakerAction(new FollowPointDecisionMaker(State.BasicKeys.RelativeFoodPosition)));
            }
            parentDecisionMaker.Init(actions);
            parentDecisionMaker.DecideAction(_dummyStates[0], forceRandom: false, forceMax: true);

            // Init child
            var childDecisionMaker = new ReinforcementDecisionMaker();

            childDecisionMaker.Init(parentDecisionMaker);

            // Assertion
            foreach (var state in _dummyStates)
            {
                var parentAction = parentDecisionMaker.DecideAction(state, forceRandom: false, forceMax: true);
                var childAction  = childDecisionMaker.DecideAction(state, forceRandom: false, forceMax: true);
                Assert.AreEqual(
                    parentAction.Name,
                    childAction.Name
                    );

                // SubDecisionMakerActionは外に出ない
                Assert.IsInstanceOf <LocomotionAction>(parentAction);
                Assert.IsInstanceOf <LocomotionAction>(childAction);
            }
        }
예제 #3
0
        public void デシリアライズ後RestoreされたものはSubDMも含めて同じDecisionをする()
        {
            // Init parent
            var parentDecisionMaker = new ReinforcementDecisionMaker();
            var actions             = new List <IAction>();

            actions.Add(new SubDecisionMakerAction(new FollowPointDecisionMaker(State.BasicKeys.RelativeFoodPosition)));
            actions.AddRange(LocomotionAction.EightDirections());
            parentDecisionMaker.Init(actions);
            parentDecisionMaker.DecideAction(_dummyStates[0], forceRandom: false, forceMax: true);

            var saveDataClone      = EditorTestExtensions.DeepCloneByMsgPack(parentDecisionMaker.Save());
            var decisionMakerClone = saveDataClone.Instantiate() as ReinforcementDecisionMaker;

            decisionMakerClone.Restore(actions);

            // Random
            foreach (var state in _dummyStates)
            {
                Assert.AreEqual(
                    parentDecisionMaker.DecideAction(state, forceRandom: false, forceMax: true)
                    .Name,
                    decisionMakerClone.DecideAction(state, forceRandom: false, forceMax: true).Name
                    );
            }
            // Force SubDM
            foreach (var state in _dummyStates)
            {
                Assert.AreEqual(
                    parentDecisionMaker.DecideAction(state, forceRandom: false, forceMax: true, forceAction: 0)
                    .Name,     // choose from 100 choice
                    decisionMakerClone.DecideAction(state, forceRandom: false, forceMax: true, forceAction: 0).Name
                    );
            }
        }
예제 #4
0
        public void デシリアライズ後Restoreされたものは経験を引き継ぐ()
        {
            // Init parent
            var parentDecisionMaker = new ReinforcementDecisionMaker();
            var actions             = new List <IAction>();

            for (int i = 0; i < 100; i++)
            {
                actions.Add(LocomotionAction.GoStraight(i.ToString()));
            }
            parentDecisionMaker.Init(actions);
            parentDecisionMaker.DecideAction(_dummyStates[0], forceRandom: false, forceMax: true);
            parentDecisionMaker.Feedback(new List <float>()
            {
                3f
            });
            parentDecisionMaker.DecideAction(_dummyStates[0], forceRandom: false, forceMax: true);

            var saveDataClone      = EditorTestExtensions.DeepCloneByMsgPack(parentDecisionMaker.Save());
            var decisionMakerClone = saveDataClone.Instantiate() as ReinforcementDecisionMaker;


            var originalTrainer = TestHelper.GetFieldValue(parentDecisionMaker, "_trainer") as TemporalDifferenceQTrainer;
            var cloneTrainer    = TestHelper.GetFieldValue(decisionMakerClone, "_trainer") as TemporalDifferenceQTrainer;

            // Assertion
            Assert.AreEqual(originalTrainer.GetHistorySaveData().Count, 1);
            Assert.AreEqual(cloneTrainer.GetHistorySaveData().Count, 1);
            Assert.AreEqual(originalTrainer.GetHistorySaveData()[0].Instantiate().State, cloneTrainer.GetHistorySaveData()[0].Instantiate().State);
        }
예제 #5
0
        private float HeuristicPenaltyWalking(State lastState, State nowState)
        {
            var penalty        = 1f;
            var movement       = LocomotionAction.GetLastMovement(lastState, nowState);
            var targetStepSize = nowState.GetAsFloat(State.BasicKeys.BodyScale);

            var overDistance = movement.magnitude - targetStepSize;

            if (0f < overDistance)
            {
                // オーバーランはペナルティ
                var overPenalty = targetStepSize - overDistance;
                if (overPenalty > 0f)
                {
                    penalty *= overPenalty;
                }
                else
                {
                    // マイナスだと逆方向になるので0
                    penalty = 0f;
                }
            }

            return(penalty);
        }
예제 #6
0
        public void デシリアライズ後Restoreされたものは同じDecisionをする()
        {
            // Init parent
            var parentDecisionMaker = new ReinforcementDecisionMaker();
            var actions             = new List <IAction>();

            for (int i = 0; i < 100; i++)
            {
                actions.Add(LocomotionAction.GoStraight(i.ToString()));
            }
            parentDecisionMaker.Init(actions);
            parentDecisionMaker.DecideAction(_dummyStates[0], forceRandom: false, forceMax: true);

            var saveDataClone      = EditorTestExtensions.DeepCloneByMsgPack(parentDecisionMaker.Save());
            var decisionMakerClone = saveDataClone.Instantiate() as ReinforcementDecisionMaker;

            // Assertion
            foreach (var state in _dummyStates)
            {
                Assert.AreEqual(
                    parentDecisionMaker.DecideAction(state, forceRandom: false, forceMax: true)
                    .Name,     // choose from 100 choice
                    decisionMakerClone.DecideAction(state, forceRandom: false, forceMax: true).Name
                    );
            }
        }
예제 #7
0
 public DummyRemoteDecisionMaker()
 {
     Fetcher = new DummyFetcher();
     Actions = new List <IAction>()
     {
         LocomotionAction.GoStraight("test")
     };
 }
예제 #8
0
        public void 左に餌があるときはちゃんとそちらに向かう()
        {
            var decisionMaker = createDummy();
            var tmpState      = new State();

            for (var y = -1; y <= 1; y++)
            {
                tmpState [State.BasicKeys.RelativeFoodPosition] = new DenseVector(new double[] { -2, y * 100, 0.5f });
                var action = decisionMaker.DecideAction(tmpState);
                Assert.AreEqual(
                    LocomotionAction.GoLeft().Name,
                    action.Name
                    );
            }
        }
예제 #9
0
        public void 反対側にちゃんと向かう()
        {
            var decisionMaker = createDummy(isNegative: true);
            var tmpState      = new State();

            for (var y = -1; y <= 1; y++)
            {
                tmpState[State.BasicKeys.RelativeFoodPosition] = new DenseVector(new double[] { 0.5f, y * 100, 2 });
                var action = decisionMaker.DecideAction(tmpState);
                Assert.AreEqual(
                    LocomotionAction.GoBack().Name,
                    action.Name
                    );
            }
        }
예제 #10
0
        public void 左にエネルギーがあるときはちゃんとそちらに向かう()
        {
            var decisionMaker = createDummy();
            var tmpState      = TempState();

            for (var y = -1; y <= 1; y++)
            {
                tmpState[State.BasicKeys.TotalFoodEnergyEachDirection][6] = 1f;
                var action = decisionMaker.DecideAction(tmpState);
                Assert.AreEqual(
                    LocomotionAction.GoLeft().Name,
                    action.Name
                    );
            }
        }
예제 #11
0
        public void 反対側をちゃんと選ぶ()
        {
            var decisionMaker = createDummy(isNegative: true);
            var tmpState      = TempState();

            for (var y = -1; y <= 1; y++)
            {
                tmpState[State.BasicKeys.TotalFoodEnergyEachDirection][0] = 1f;
                var action = decisionMaker.DecideAction(tmpState);
                Assert.AreEqual(
                    LocomotionAction.GoBack().Name,
                    action.Name
                    );
            }
        }
예제 #12
0
        public void RewardTest()
        {
            //Arrange
            var action       = LocomotionAction.GoStraight("test");
            var lastPosition = new Vector3(1, 2, 3);
            var nowPosition  = new Vector3(3, 4, 5);
            var lastState    = new State();

            lastState[State.BasicKeys.Position] =
                new DenseVector(new double[] { lastPosition.x, lastPosition.y, lastPosition.z });
            lastState[State.BasicKeys.Rotation] = new DenseVector(new double[] { 0, 0, 0, 0 });
            var nowState = new State();

            nowState[State.BasicKeys.Position] =
                new DenseVector(new double[] { nowPosition.x, nowPosition.y, nowPosition.z });

            //Act
            var reward = action.Reward(lastState, nowState);

            //Assert
            Assert.AreEqual(reward, 2.0f);
        }
예제 #13
0
 public LocomotionAction(LocomotionAction src) : base(src)
 {
     Direction = src.Direction;
 }
예제 #14
0
 public static List <IAction> EightDirections()
 {
     return(new List <IAction>(LocomotionAction.EightDirectionsAsLocomotionActions()
                               .Select(locomotionAction => new WalkingLocomotionAction(locomotionAction)).ToList()));
 }
예제 #15
0
 public WalkingLocomotionAction(LocomotionAction baseAction) : base("Walking" + baseAction.Name)
 {
     BaseAction = baseAction;
 }