public void solve(){
		int m = this.y.length;
		double[] w = new double[m]; // weights
		Arrays.fill(w, 1.0);
		double[][] D = new double[this.T][m]; // distribution of row's pure strategy
		Arrays.fill(D[0], 1.0/((double)m));
		double sum = 0.0;
		
		for ( int t = 0; t < T; t++ ){
			int j = getMaxJ(D[t]);
			sum += getValue(D[t], j);
			double sumW = 0.0;
			for ( int i = 0; i < m; i++ ){
				w[i] = w[i]*Math.pow(1-this.epsilon, this.A[i][j]);
				sumW += w[i];
			};
			for ( int i = 0; i < m; i++ ){
				if ( t != T - 1){
					D[t+1][i] = w[i]/sumW;
				}
			}
		}
		
		this.value = sum/((double)T); // approximate value of the game with possible error of delta
		this.y = D[T-1]; // D_final
		
	}