public double[][] ReinforcementLearning()
	{
		int step = 1;
		State currState = this.game.StartState;

		double[][] allUtils = new double[this.game.States.length][this.game.States[0].length];
		
		while(step < 100000)
		{	
			currState.TimeStep = currState.TimeStep + 1;
			ACTION selectedAction = this.selectAction(currState);
			currState.CountActionTaken(selectedAction);
			State nextState = this.getSuccessorState(currState, selectedAction);
			this.TDUpdate(currState, nextState, selectedAction);
		
			currState = nextState;
			if(currState.IsTerminal)
			{
				currState = this.game.StartState;
			}
			
			step++;
		}
		
		for(int i = 0; i < this.game.States.length; i++)
		{
			for(int j = 0; j < this.game.States[0].length; j++)
			{
				allUtils[i][j] = this.game.States[i][j].GetUtility();
			}
		}
		
		return allUtils;
	}