示例如何使用clp-java

时间:2017-06-03 17:51:02

标签: java android optimization linear-programming

我想在我的Android应用中使用cpl-java构建一个新的线性编程模型。

我的功能是E + T + U + URam,我想最小化这个功能,但我不知道如何使用这个库以及如何添加我的约束, 我的约束:

E<0 and T<0 and U<0.25 and URam<0.25

这是我的代码

com.quantego.clp.CLP model = new CLP();

    CLPVariable energy = model.addVariable().free();
    CLPVariable executionTime = model.addVariable().free();
    CLPVariable cpuUsage = model.addVariable().free();
    CLPVariable ramUsage = model.addVariable().free();

    CLPExpression expression = model.createExpression().add(energy).add(executionTime).add(cpuUsage)
            .add(ramUsage);

    System.out.println("expression : " + expression.toString());
    TreeMap<CLPVariable, Double> energyMap = new TreeMap<>();
    energyMap.put(energy, 5.1);

    TreeMap<CLPVariable, Double> exeTimeMap = new TreeMap<>();
    exeTimeMap.put(executionTime, 5.0);

    TreeMap<CLPVariable, Double> cpuusageMap = new TreeMap<>();
    cpuusageMap.put(cpuUsage, 0.2);

    TreeMap<CLPVariable, Double> ramusageMap = new TreeMap<>();
    ramusageMap.put(ramUsage, 0.9);

    model.addConstraint(energyMap, CLPConstraint.TYPE.LEQ, 0);
    model.addConstraint(exeTimeMap, CLPConstraint.TYPE.LEQ, 0);
    model.addConstraint(cpuusageMap, CLPConstraint.TYPE.LEQ, 0.25);
    model.addConstraint(ramusageMap, CLPConstraint.TYPE.LEQ, 0.25);    

1 个答案:

答案 0 :(得分:0)

根据您的描述,我推断您希望最小化决策变量E,T,U,URam的总和,受变量边界的限制。由于没有链接这些决策变量的约束,因此最佳解决方案是将所有变量设置为其下限。

从变量的名称来看,我猜测下限实际上是零而不是负无穷大。将所有变量设置为零将最小化E + T + U + URam,这将产生零目标值。如果您希望负无穷大作为下限,那么当前所述的优化问题将是无限制的。

clp-java中的广泛表述如下:

CLP model = new CLP().verbose(1);
CLPVariable energy = model.addVariable();
CLPVariable executionTime = model.addVariable();
CLPVariable cpuUsage = model.addVariable();
CLPVariable ramUsage = model.addVariable();    
model.createExpression().add(energy,executionTime,cpuUsage,ramUsage).asObjective();
model.createExpression().add(energy).leq(0);
model.createExpression().add(executionTime).leq(0);
model.createExpression().add(cpuUsage).leq(0.25);
model.createExpression().add(ramUsage).leq(0.25);
model.minimize();

这会解决您的问题吗?