Example #1
0
        public double GetRotationLength()
        {
            List <int> solarIndices = new List <int>();
            List <int> lunarIndices = new List <int>();

            double toSolarTotalWeight = 0;
            double toLunarTotalWeight = 0;

            for (int i = 0; i < _process.StateSpace.Count; ++i)
            {
                MoonkinState st = (MoonkinState)_process.StateSpace[i];
                if (st.EclipseEnergy == -100)
                {
                    lunarIndices.Add(i);
                    toSolarTotalWeight += _process.StateWeight[i];
                }
                else if (st.EclipseEnergy == 100)
                {
                    solarIndices.Add(i);
                    toLunarTotalWeight += _process.StateWeight[i];
                }
            }

            double[] toSolarDurations = _process.GetAverageTimeToEnd(st => ((MoonkinState)st).EclipseEnergy == 100);
            double[] toLunarDurations = _process.GetAverageTimeToEnd(st => ((MoonkinState)st).EclipseEnergy == -100);

            double lunarToSolarDuration = 0;
            double solarToLunarDuration = 0;

            foreach (int idx in lunarIndices)
            {
                lunarToSolarDuration += toSolarDurations[idx] * (_process.StateWeight[idx] / toSolarTotalWeight);
            }
            foreach (int idx in solarIndices)
            {
                solarToLunarDuration += toLunarDurations[idx] * (_process.StateWeight[idx] / toLunarTotalWeight);
            }

            return(lunarToSolarDuration + solarToLunarDuration);
        }
Example #2
0
        public void MarkovProcessTest1()
        {
            //S0:
            //A => S0 0.5
            //  => S1 0.5
            //S1:
            //B => S0 1

            Ability A = new Ability()
            {
                Damage = 100, Duration = 2
            };
            Ability B = new Ability()
            {
                Damage = 200, Duration = 1
            };

            State <Ability> S0 = new State <Ability>()
            {
                Name = "S0"
            };
            State <Ability> S1 = new State <Ability>()
            {
                Name = "S1"
            };

            S0.Transitions = new List <StateTransition <Ability> >()
            {
                new StateTransition <Ability>()
                {
                    Ability = A, TargetState = S0, TransitionDuration = A.Duration, TransitionProbability = 0.5
                },
                new StateTransition <Ability>()
                {
                    Ability = A, TargetState = S1, TransitionDuration = A.Duration, TransitionProbability = 0.5
                },
            };
            S1.Transitions = new List <StateTransition <Ability> >()
            {
                new StateTransition <Ability>()
                {
                    Ability = B, TargetState = S0, TransitionDuration = B.Duration, TransitionProbability = 1.0
                },
            };
            List <State <Ability> > stateSpace = new List <State <Ability> >()
            {
                S0, S1
            };

            MarkovProcess <Ability> mp = new MarkovProcess <Ability>(stateSpace);

            Assert.AreEqual(mp.StateWeight[0], 2.0 / 3.0, 0.000000000001, "S0");
            Assert.AreEqual(mp.StateWeight[1], 1.0 / 3.0, 0.000000000001, "S1");
            Assert.AreEqual(mp.AverageTransitionDuration, 5.0 / 3.0, 0.000000000001, "time");

            double averageDamage = 0.0;

            foreach (KeyValuePair <Ability, double> kvp in mp.AbilityWeight)
            {
                averageDamage += kvp.Key.Damage * kvp.Value;
            }
            Assert.AreEqual(averageDamage, 100.0 * 4.0 / 3.0, 0.000000000001, "damage");

            Assert.AreEqual(averageDamage / mp.AverageTransitionDuration, 80.0, 0.000000000001, "dps");

            double[] stateLengths = mp.GetAverageTimeToEnd(st => (st.Name == "S1"));

            Assert.AreEqual(stateLengths[0], 4.0, "time to end");
        }
        public void MarkovProcessTest1()
        {
            //S0:
            //A => S0 0.5
            //  => S1 0.5
            //S1:
            //B => S0 1

            Ability A = new Ability() { Damage = 100, Duration = 2 };
            Ability B = new Ability() { Damage = 200, Duration = 1 };

            State<Ability> S0 = new State<Ability>() { Name = "S0" };
            State<Ability> S1 = new State<Ability>() { Name = "S1" };

            S0.Transitions = new List<StateTransition<Ability>>()
            {
                new StateTransition<Ability>() { Ability = A, TargetState = S0, TransitionDuration = A.Duration, TransitionProbability = 0.5 },
                new StateTransition<Ability>() { Ability = A, TargetState = S1, TransitionDuration = A.Duration, TransitionProbability = 0.5 },
            };
            S1.Transitions = new List<StateTransition<Ability>>()
            {
                new StateTransition<Ability>() { Ability = B, TargetState = S0, TransitionDuration = B.Duration, TransitionProbability = 1.0 },
            };
            List<State<Ability>> stateSpace = new List<State<Ability>>() { S0, S1 };

            MarkovProcess<Ability> mp = new MarkovProcess<Ability>(stateSpace);

            Assert.AreEqual(mp.StateWeight[0], 2.0 / 3.0, 0.000000000001, "S0");
            Assert.AreEqual(mp.StateWeight[1], 1.0 / 3.0, 0.000000000001, "S1");
            Assert.AreEqual(mp.AverageTransitionDuration, 5.0 / 3.0, 0.000000000001, "time");

            double averageDamage = 0.0;
            foreach (KeyValuePair<Ability, double> kvp in mp.AbilityWeight)
            {
                averageDamage += kvp.Key.Damage * kvp.Value;
            }
            Assert.AreEqual(averageDamage, 100.0 * 4.0 / 3.0, 0.000000000001, "damage");

            Assert.AreEqual(averageDamage / mp.AverageTransitionDuration, 80.0, 0.000000000001, "dps");

            double[] stateLengths = mp.GetAverageTimeToEnd(st => (st.Name == "S1"));

            Assert.AreEqual(stateLengths[0], 4.0, "time to end");
        }