public void CanCalculateSuccessProbability() { var container = CreateContainer(); var log = container.GetInstance <ILog>(); var item = "Silver Embroidered"; var targetGrade = 2; var failstack = 0; var initialState = new EnhancementState(failstack) { Items = new [] { 50, 1, 0, 0, 0, }, }; var process = new EnhancementProcess(initialState) { Rewards = new List <IActionReward <EnhancementState> > { new SuccessProbabilityReward(targetGrade) } }; var policy = new JustEnhancePolicy(item, targetGrade); var value = process.GetOptimalValue(policy); log.Info($"Enhancement probability : {value}"); Assert.Equal(0.6391845543605477, value); }
public void CanUseDecisionProcess() { var container = CreateContainer(); var log = container.GetInstance <ILog>(); var item = "Gold accessory"; var targetGrade = 1; var failstack = 0; var initialState = new EnhancementState(failstack); var process = new EnhancementProcess(initialState) { Rewards = new List <IActionReward <EnhancementState> > { new NumberOfAttemptsReward(targetGrade) } }; var policy = new JustEnhancePolicy(item, targetGrade) { TrackNumberOfAttempts = true }; var value = process.GetOptimalValue(policy); log.Info($"Optimal value : {value}"); Assert.Equal(3.1213873601591193, value); }
public void CanGetExpectedNumberOfAttemptsViaProcess() { var container = CreateContainer(); var log = container.GetInstance <ILog>(); var item = "Silver Embroidered"; var targetGrade = 2; var failstack = 36; var initialState = new EnhancementState(failstack); initialState.Items[targetGrade - 1] = int.MaxValue; var process = new EnhancementProcess(initialState) { Rewards = new List <IActionReward <EnhancementState> > { new NumberOfAttemptsReward(targetGrade) } }; var policy = new JustEnhancePolicy(item, targetGrade) { TrackNumberOfAttempts = true }; var value = process.GetOptimalValue(policy); log.Info($"Optimal value : {value}"); Assert.Equal(2.0855537713302703, value); }
public EnhancementGraph(IDeterministicPolicy <EnhancementState> policy, EnhancementState initialState, int iterations) { var nextStates = new HashSet <EnhancementState> { initialState }; var allStates = new HashSet <EnhancementState>(); while (iterations-- > 0) { var nextNextStates = new HashSet <EnhancementState>(); foreach (var state in nextStates) { var from = _graph.Vertices.SingleOrDefault(v => v.Label == state.ToString()); if (from == null) { from = new StateVertex(state); _graph.AddVertex(from); } var action = policy[state]; if (action == null) { continue; } var actionStates = action[state].ToArray(); foreach (var s in actionStates) { var to = _graph.Vertices.SingleOrDefault(v => v.Label == s.ToString()); if (to == null) { to = new StateVertex(s); _graph.AddVertex(to); } _graph.AddEdge(new ActionEdge(action) { Source = from, Target = to, }); } nextNextStates.UnionWith(actionStates); } nextStates.Clear(); foreach (var s in nextNextStates) { if (allStates.Add(s)) { nextStates.Add(s); } } } }
private void Initialise(EnhancementStarted e) { _targetGrade = e.Grade + 1; _enumerator = RandomGenerator.Generate(Id).GetEnumerator(); _policy = new JustEnhancePolicy(e.Item, _targetGrade) { TrackNumberOfAttempts = true }; _state = new EnhancementState(e.Failstack); _state.Items[_targetGrade - 1] = int.MaxValue; }
/// <inheritdoc/> protected override void ConfigureStateMachine() { StateMachine = new StateMachine <State, Trigger>(State.Open); StateMachine.Configure(State.Open).Permit(Trigger.Started, State.Enhancing); StateMachine.Configure(State.Enhancing) .OnEntry(() => { var rand = Next(); var action = GetNextAction(); var total = 0.0; foreach (var state in action[_state]) { total += action[_state, state]; if (rand < total) { _state = state.Clone(); break; } } var success = _state.Items[_targetGrade] > 0; if (success) { SendCommand(new SucceedEnhancement(Id, _numberOfFailures)); } else { SendCommand(new FailEnhancement(Id)); } }) .PermitReentry(Trigger.Attempt); StateMachine.Configure(State.Enhancing).Permit(Trigger.Success, State.Complete); }
public void CanCalculateSuccessProbabilityWithTieredFailstack() { var container = CreateContainer(); var log = container.GetInstance <ILog>(); var item = "Silver Embroidered"; var targetGrade = 3; // var quantities = Enumerable.Range(3, 3).Select(i => 10 * i); // var quantities = new List<int> { 20, 24, 28, 32, 36, 40 }; var quantities = new List <int> { 10 }; // var quantities = new List<int> { 8, 12, 16, 24, 28, 32 }; var probabilities = new Dictionary <(int, int, int, int, int), double>(); var costs = new Dictionary <(int, int, int, int, int), double>(); var efficiency = new Dictionary <(int, int, int, int, int), double>(); foreach (var quantity in quantities) { var initialState = new EnhancementState() { Items = new [] { quantity, 0, 0, 0, 0, }, StoredFailstacks = new [] { 0, 0, 0, 0, }, }; var minFailstack = new[] { 10, 19, 28, 40 }; var maxFailstack = new[] { 10, 20, 30, 40 }; for (var grade = targetGrade; grade < minFailstack.Length; ++grade) { minFailstack[grade] = -1; maxFailstack[grade] = -1; } var it = new TierIterator(targetGrade, quantity, minFailstack, maxFailstack); do { // log.Info($"({it.Quantity}:{string.Join(',', it.Failstacks)})"); var key = (quantity, it.Failstacks[0], it.Failstacks[1], it.Failstacks[2], it.Failstacks[3]); var process = new EnhancementProcess(initialState) { Rewards = new List <IActionReward <EnhancementState> > { new SuccessProbabilityReward(targetGrade) } }; var costProcess = new EnhancementProcess(initialState) { Rewards = new List <IActionReward <EnhancementState> > { new FailstackReward() } }; var policy = new TieredFailstackPolicy(item, targetGrade, new Dictionary <int, int> { { 0, it.Failstacks[0] }, { 1, it.Failstacks[1] }, { 2, it.Failstacks[2] }, { 3, it.Failstacks[3] }, }) { Log = null }; probabilities[key] = process.GetOptimalValue(policy); costs[key] = -costProcess.GetOptimalValue(policy, 1); efficiency[key] = (int)(costs[key] / probabilities[key] / 100); // log.Info($"Enhancement probability for {quantity} items and failstack ({string.Join(',', it.Failstacks.ToList().Where(i => i > 0).ToList())}): {probabilities[key]} at {costs[key]}, efficiency : {efficiency[key]}"); it = it.Next(); }while (it != null); if (quantity == 10) { Assert.Equal(0.15627782835360016, probabilities[(10, 10, 19, 28, -1)]);
public StateVertex(EnhancementState state) { Label = state.ToString(); }