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 ); } }
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); } }
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 ); } }
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); }
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); }
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 ); } }
public DummyRemoteDecisionMaker() { Fetcher = new DummyFetcher(); Actions = new List <IAction>() { LocomotionAction.GoStraight("test") }; }
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 ); } }
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 ); } }
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 ); } }
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 ); } }
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); }
public LocomotionAction(LocomotionAction src) : base(src) { Direction = src.Direction; }
public static List <IAction> EightDirections() { return(new List <IAction>(LocomotionAction.EightDirectionsAsLocomotionActions() .Select(locomotionAction => new WalkingLocomotionAction(locomotionAction)).ToList())); }
public WalkingLocomotionAction(LocomotionAction baseAction) : base("Walking" + baseAction.Name) { BaseAction = baseAction; }