如何计算总积分最小的点?

时间:2018-08-21 02:16:57

标签: java optimization linear-programming least-squares simplex

我正在尝试使成分的总和最小化。

例如,A产品和B产品中维生素A的总量必须超过C。此外,应将过量的维生素C减至最少。

我根据数据做了18个功能。 (维生素,碳水化合物,蛋白质〜等)

我使用apache simplexor来获取每个函数的最小值。 (我将所有函数添加到约束中,并通过将每个函数添加到目标函数进行计算。)

我得到以下result,但是,我想要一个能使差异总和最小的点。(difference = min-C)

我的英语不好,希望您能理解我的问题。 谢谢您阅读我的问题。

这是我的代码。

public class Simplex3D {
public static void cal(double[] a, double[] b, double[] c, double[] d) {
    //a, b, and c are the coefficient of functions 
    //d is the amount of ingredient that should be exceeded.
    System.out.println();
    Collection<LinearConstraint> constraints = new ArrayList<LinearConstraint>();
    constraints.add(new LinearConstraint(new double[] { 0, 1,0 }, Relationship.GEQ, 0));
    constraints.add(new LinearConstraint(new double[] { 1, 0,0 }, Relationship.GEQ, 0));
    constraints.add(new LinearConstraint(new double[] { 0, 0,1 }, Relationship.GEQ, 0));
    //x, y, z >=0
    constraints.add(new LinearConstraint(new double[] { a[5]*100, b[5]*100, c[5]*100 }, Relationship.GEQ, d[5]));
    constraints.add(new LinearConstraint(new double[] { a[16]*100, b[16]*100, c[16]*100 }, Relationship.GEQ, d[16]));
    constraints.add(new LinearConstraint(new double[] { a[4]*100, b[4]*100, c[4]*100 }, Relationship.GEQ, d[4]));
    for(int i=0;i<18;i++) {

    LinearObjectiveFunction f = new LinearObjectiveFunction(new double[] { a[i]*100, b[i]*100,c[i]*100 }, 0);
    // create and run the solver
    SimplexSolver solver = new SimplexSolver();
    //solver.optimize(f, constraints, GoalType.MINIMIZE, new NonNegativeConstraint(true));
    PointValuePair solution = solver.optimize(f, new LinearConstraintSet(constraints), GoalType.MINIMIZE, new NonNegativeConstraint(true));

    // get the solution
    double x = solution.getPoint()[0];
    double y = solution.getPoint()[1];
    double z = solution.getPoint()[2];
    double min = solution.getValue();
    double diff= min-d[i];

    System.out.println("x: "+x+" y: "+y+" z: "+z+" min: "+min+" diff: "+diff);
}
}

}

1 个答案:

答案 0 :(得分:0)

  

我根据数据做了18个功能。

因此,您已经创建了18个独立的问题,并通过获得18个解决方案来解决了这些问题。这不是要走的路。

请注意,您的问题只有三个变量。这可能描述了单个产品如何混合,但是您似乎有18个产品。您必须描述问题中的所有问题。假设有3种成分和18种产品,这意味着单个问题中的3 * 18个变量。

只有这样,您才可以表达有关总差异的目标。


这可能会也可能不会有帮助。无论如何,您没有编程问题。相反,您正在努力解决问题。您的LP问题听起来像是经典问题,找到类似的东西,并找出您的LP有何不同。