Java Apache common SimplexSolver ObjectiveFunction,用于最大化矩阵中的值之和

Java Apache common SimplexSolver ObjectiveFunction,用于最大化矩阵中的值之和,java,apache-commons,linear-programming,apache-commons-math,Java,Apache Commons,Linear Programming,Apache Commons Math,我试图使用ApacheCommons中的SimplexSolver解决以下线性问题:org.apache.commons.math3.optim.linear.SimplexSolver n是行数 m是列数 L是每行总和值的全局限制 这就是我到目前为止所做的: List constraints=new ArrayList(); double[]A=calculateAValues(); //m=列数 //约束1:所有列中的值之和必须误差似乎在线性约束的系数数组中 您有n*m变量,因此约束和目标

我试图使用ApacheCommons中的SimplexSolver解决以下线性问题:
org.apache.commons.math3.optim.linear.SimplexSolver

n
是行数
m
是列数
L
是每行总和值的全局限制

这就是我到目前为止所做的:

List constraints=new ArrayList();
double[]A=calculateAValues();
//m=列数

//约束1:所有列中的值之和必须误差似乎在线性约束的系数数组中

您有
n*m
变量,因此约束和目标函数的系数数组必须具有长度
n*m
。不幸的是,
SimplexSolver
会在约束数组比目标函数数组短的情况下无声地展开约束数组。因此,您的代码没有指定导致无边界解决方案的正确约束

约束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));
}
// 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));
}
double[] objectiveCoefficients = new double[n * m];
Arrays.fill(objectiveCoefficients, 1.0);
LinearObjectiveFunction objective = LinearObjectiveFunction(objectiveCoefficients, 0);
SimplexSolver solver = new SimplexSolver();
PointValuePair solution = solver.optimize(objective, constraintSet,
     GoalType.MAXIMIZE, new NonNegativeConstraint(true));