Exemple #1
0
            public static double GetValue(State s, FoeQTable q)
            {
                var context = SolverContext.GetContext();
                var model   = context.CreateModel();

                var actionDecisions = new List <Decision>();

                foreach (var action in Enum.GetNames(typeof(Action)))
                {
                    var decision = new Decision(Domain.RealNonnegative, action);
                    model.AddDecision(decision);
                    actionDecisions.Add(decision);
                }

                var valueDecision = new Decision(Domain.Real, "value");

                model.AddDecision(valueDecision);

                model.AddConstraint("probSumConst", actionDecisions[0] + actionDecisions[1] + actionDecisions[2] + actionDecisions[3] + actionDecisions[4] == 1.0);

                int constCount = 0;

                foreach (Action oppPlayer in Enum.GetValues(typeof(Action)))
                {
                    var qConstraintValues = new List <double>();

                    foreach (Action currentPlayer in Enum.GetValues(typeof(Action)))
                    {
                        qConstraintValues.Add(q.GetQValue(s, currentPlayer, oppPlayer));
                    }

                    model.AddConstraint("Const" + constCount, qConstraintValues[0] * actionDecisions[0] + qConstraintValues[1] * actionDecisions[1] + qConstraintValues[2] * actionDecisions[2] + qConstraintValues[3] * actionDecisions[3] + qConstraintValues[4] * actionDecisions[4] >= valueDecision);

                    ++constCount;
                }

                model.AddGoal("MaximizeV", GoalKind.Maximize, valueDecision);

                context.Solve(new SimplexDirective());

                context.ClearModel();

                return(valueDecision.GetDouble());
            }
        private static void RunFoeQ()
        {
            var S   = new StateSet();
            var A   = new JointActionSet();
            var P   = new Transition(S, A);
            var Q_A = new FoeQTable();
            var R   = new Rewards();

            var ERR = new Dictionary <int, double>();

            var j = 0;

            while (j <= 1000000)
            {
                //Initialize state according to Figure 4
                var initialState = new State(2, 1, BallPossessor.B);
                var gameOver     = false;
                var currentState = new State(3, 1, BallPossessor.B);

                var actions = A.GetNextJointAction();

                var playerAAction = actions.CurrentPlayerAction;
                var playerBAction = actions.OpposingPlayerAction;

                while (!gameOver)
                {
                    if (j % 20000 == 0)
                    {
                        Console.WriteLine(j);
                    }

                    var q_fig_4_initial = Q_A.GetQValue(initialState, Action.South, Action.Stick);

                    var nextState = P.GetNextState(currentState, new JointAction(playerAAction, playerBAction));

                    var playerAReward = R.GetPlayerAReward(nextState);
                    var playerBReward = R.GetPlayerBReward(nextState);

                    if (playerAReward != 0.0 || playerBReward != 0.0)
                    {
                        gameOver = true;
                    }

                    Q_A.UpdateQValue(currentState, nextState, playerAAction, playerBAction, playerAReward);

                    if (currentState.Equals(initialState) && playerAAction == Action.South && playerBAction == Action.Stick)
                    {
                        var q_fig_4 = Q_A.GetQValue(initialState, Action.South, Action.Stick);
                        var diff    = Math.Abs(q_fig_4 - q_fig_4_initial);

                        ERR.Add(j, diff);
                    }

                    currentState = nextState;

                    actions = A.GetNextJointAction();

                    playerAAction = actions.CurrentPlayerAction;
                    playerBAction = actions.OpposingPlayerAction;

                    ++j;
                }
            }

            using (StreamWriter sw = File.CreateText("output.csv"))
            {
                foreach (var kvp in ERR)
                {
                    sw.WriteLine(kvp.Key + "," + kvp.Value);
                }
            }
        }