7

apache-commonsのSimplexソルバーを使用して次の線形問題を解決しようとしています。org.apache.commons.math3.optim.linear.SimplexSolverApache共通SimplexSolver ObjectiveFunctionは行列の値の合計を最大化する

http://mathurl.com/ovh582z

n
Lの数は、各行の合計値

のグローバル限界行
mの数である。これは、私がこれまで持っているものである。

List<LinearConstraint> constraints = new ArrayList<>(); 

double[][] A = calculateAValues(); 
// m = count of columns 
// constraint 1: the sum of values in all column must be <= 1 
for(int i = 0; i < m; i++) { 
    double[] v = new double[n]; 
    for(int j=0; j < n; j++) { 
     v[j] = 1; 
    } 
    constraints.add(new LinearConstraint(v, Relationship.LEQ, 1)); 
} 
// n = count of rows 
// constraint 2: sum of a_i,j in all row must be <= L (Limit) 
for(int i = 0; i < n; i++) { 
    double[] v = new double[m]; 
    for(int j=0; j < m; j++) { 
     v[j] = A[i][j]; 
    } 
    constraints.add(new LinearConstraint(v, Relationship.LEQ, L)); 
} 

double[] objectiveCoefficients = new double[n * m]; 
for(int i = 0; i < n * m; ++i) { 
    objectiveCoefficients[i] = 1; 
} 

LinearObjectiveFunction objective = new LinearObjectiveFunction(objectiveCoefficients, 0); 
LinearConstraintSet constraintSet = new LinearConstraintSet(constraints); 

SimplexSolver solver = new SimplexSolver(); 
PointValuePair solution = solver.optimize(objective, constraintSet, GoalType.MAXIMIZE); 
return solution.getValue(); 

目的の機能が正しく機能しない他にも欠けているかもしれません。これまでの私の試みはUnboundedSolutionExceptionでした。

答えて

3

エラーは線形制約の係数配列にあるようです。

あなたはn*mの変数を持っています。したがって、制約と目的関数の係数配列は、長さがn*mでなければなりません。残念ながら、SimplexSolverは、目的関数の配列よりも短い場合、制約配列を静かに展開します。したがって、あなたのコードでは、無制限のソリューションにつながる正しい制約が指定されていませんでした。

制約1:すべての列の値の和は< = 1

for(int j=0; j<m; j++) 
{ 
    double[] v = new double[n*m]; 
    for(int i=0; i<n; i++) 
     v[i*n + j] = 1; 
    constraints.add(new LinearConstraint(v, Relationship.LEQ, 1)); 
} 

制約2でなければならない:a_iを合計は、全ての行でjは< = L(リミット)

なければなりません
// n = count of rows 
for(int i=0; i<n; i++) 
{ 
    double[] v = new double[n*m]; 
    for(int j=0; j<m; j++) 
     v[i*n + j] = A[i][j]; 
    constraints.add(new LinearConstraint(v, Relationship.LEQ, L)); 
} 

目的coffecifients:

double[] objectiveCoefficients = new double[n * m]; 
Arrays.fill(objectiveCoefficients, 1.0); 
LinearObjectiveFunction objective = LinearObjectiveFunction(objectiveCoefficients, 0); 

制約x_ij <= 1がすでにあるため、制約2. で満たされている多分それはまた、明示的にNonNegativeConstraintを使用して0 <= x_ijための制約を指定する事がより明確になります:

SimplexSolver solver = new SimplexSolver(); 
PointValuePair solution = solver.optimize(objective, constraintSet, 
    GoalType.MAXIMIZE, new NonNegativeConstraint(true)); 
関連する問題