我正在尝试使成分的总和最小化。
例如,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);
}
}
}
答案 0 :(得分:0)
我根据数据做了18个功能。
因此,您已经创建了18个独立的问题,并通过获得18个解决方案来解决了这些问题。这不是要走的路。
请注意,您的问题只有三个变量。这可能描述了单个产品如何混合,但是您似乎有18个产品。您必须描述问题中的所有问题。假设有3种成分和18种产品,这意味着单个问题中的3 * 18个变量。
只有这样,您才可以表达有关总差异的目标。
这可能会也可能不会有帮助。无论如何,您没有编程问题。相反,您正在努力解决问题。您的LP问题听起来像是经典问题,找到类似的东西,并找出您的LP有何不同。