private static void ObjFunctermAdd(State s, CorrelatedQTable q, Dictionary <Tuple <Action, Action>, Decision> actDecisions, SumTermBuilder objectSum) { foreach (Action currentAction in Enum.GetValues(typeof(Action))) { foreach (Action player2Action in Enum.GetValues(typeof(Action))) { var policy = getActDecision(currentAction, player2Action, actDecisions); var qValue = q.getCurrPQvalue(s, currentAction, player2Action); objectSum.Add(policy * qValue); } } foreach (Action currentAction in Enum.GetValues(typeof(Action))) { foreach (Action player2Action in Enum.GetValues(typeof(Action))) { var policy = getActDecision(currentAction, player2Action, actDecisions); var player2Qv = q.getPlayer2Qval(s, currentAction, player2Action); objectSum.Add(policy * player2Qv); } } }
public static Tuple <double, double> GetValue(State s, CorrelatedQTable q) { var contxt = SolverContext.GetContext(); contxt.ClearModel(); var model = contxt.CreateModel(); var actDecisions = new Dictionary <Tuple <Action, Action>, Decision>(); foreach (Action currentAction in Enum.GetValues(typeof(Action))) { foreach (Action player2Action in Enum.GetValues(typeof(Action))) { var decision = new Decision(Domain.RealNonnegative, currentAction.ToString() + player2Action.ToString()); model.AddDecisions(decision); actDecisions.Add(new Tuple <Action, Action>(currentAction, player2Action), decision); } } var actDecisionSum = new SumTermBuilder(25); foreach (var decision in actDecisions.Values) { actDecisionSum.Add(decision); } model.AddConstraint("probSumConst", actDecisionSum.ToTerm() == 1.0); rationalconsts(s, q.getCurrPQvalue, actDecisions, model, "A"); rationalityConstrPlayer2(s, q.getPlayer2Qval, actDecisions, model, "B"); var objectSum = new SumTermBuilder(10); //Add my terms from my Q table to objective function ObjFunctermAdd(s, q, actDecisions, objectSum); model.AddGoal("MaximizeV", GoalKind.Maximize, objectSum.ToTerm()); var sol = contxt.Solve(new SimplexDirective()); if (sol.Quality != SolverQuality.Optimal) { contxt.ClearModel(); return(new Tuple <double, double>(1.0, 1.0)); } double Player1nextVal = 0.0; double Player2nextVal = 0.0; foreach (Action currentAction in Enum.GetValues(typeof(Action))) { foreach (Action player2Action in Enum.GetValues(typeof(Action))) { var policy = getActDecision(currentAction, player2Action, actDecisions); var qValue = q.getCurrPQvalue(s, currentAction, player2Action); Player1nextVal += policy.ToDouble() * qValue; var player2Qv = q.getPlayer2Qval(s, currentAction, player2Action); Player2nextVal += policy.ToDouble() * player2Qv; } } return(new Tuple <double, double>(Player1nextVal, Player2nextVal)); }