如何计算使总和最小化的点?

Posted

技术标签:

【中文标题】如何计算使总和最小化的点?【英文标题】:How to calculate a point which minimizes total? 【发布时间】:2019-01-27 04:07:09 【问题描述】:

我正在尽量减少成分的总和。

例如,A产品和B产品中维生素A的总量必须超过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);


【问题讨论】:

我无法理解您的问题。如果能举个例子就更好了。对于您使用的 18 分,您期望的答案是什么。 @AshraffAliWahab 谢谢!为了找到约束下每个函数的最小值,我使用的方法是通过将每个函数计算为目标函数并使用单纯形法计算得到18个点。但我想知道的是满足所有约束并最小化差异总和的一点。 (重点总结:18 分-> 1 分) 我建议先写下数学模型。一旦您对模型感到满意(并且您相当确定它的正确性),请使用您最喜欢的工具在代码中实现它。 @ErwinKalvelagen 谢谢!我正在尝试使用您建议的方式解决我的问题,但是很难设置数学模型,因为我已经很久没有做数学了:( 【参考方案1】:

我根据数据做了18个函数。

因此,您创建了 18 个独立问题并解决了它们,获得了 18 个解决方案。这不是要走的路。

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

只有这样,你才能表达一个关于差异总和的目标。


这可能对您有所帮助,也可能无济于事。无论如何,你没有编程问题。相反,您正在努力解决问题。您的 LP 问题听起来很经典,找到类似的问题并找出您的 LP 有何不同。

【讨论】:

谢谢!我有 3 种产品和 18 种成分。我将混合 3 种产品。组合时,18 种成分中的每一种都必须超过某个值。使用单纯形法的现有示例很难应用到我的问题。

以上是关于如何计算使总和最小化的点?的主要内容,如果未能解决你的问题,请参考以下文章

最小唯一数组总和

交换两个数组的元素使之总和的差值最小

找到所需的最小元素数,以使它们的总和等于或超过 S

将给定的一组数字 N 分成两组,以使它们的总和之差最小?

Code Chef MINPOLY(计算几何+dp)

计算用户在Java中输入的一系列数字的总和、算术平均值、最小值和最大值? [关闭]