首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于具有多个或无限多个解的线性规划问题,如何利用JOptimizer只得到一个可行解p‌r‌o‌b‌l‌e‌m?

对于具有多个或无限多个解的线性规划问题,如何利用JOptimizer只得到一个可行解p‌r‌o‌b‌l‌e‌m?
EN

Stack Overflow用户
提问于 2017-01-03 19:37:31
回答 1查看 576关注 0票数 1

JOptimizer是一个开源java库,帮助开发大多数决策支持系统。参见: joptimizer.com/我正在使用JOptimizer来获得线性规划问题的最佳解。见:jOptimizer.com/lineProgramming.html

我可以用它成功地得到大多数线性规划问题的答案。尽量减少3x+4y,这样2x+3y >= 8,5x+2y >= 12,x >= 0,y >= 0就可以使用JOptimizer来求解,如下所示。

代码语言:javascript
复制
import com.joptimizer.functions.ConvexMultivariateRealFunction;
import com.joptimizer.functions.LinearMultivariateRealFunction;
import com.joptimizer.optimizers.JOptimizer;
import com.joptimizer.optimizers.OptimizationRequest;
import org.apache.log4j.BasicConfigurator;

/**
 * @author K.P.L.Kanchana
 */

public class Main {

    public static void main(String[] args) throws Exception {

        // Objective function (plane)
        LinearMultivariateRealFunction objectiveFunction = new LinearMultivariateRealFunction(new double[] {3.0, 4.0}, 0); //minimize 3x+4y

        //inequalities (polyhedral feasible set G.X<H )
        ConvexMultivariateRealFunction[] inequalities = new ConvexMultivariateRealFunction[4];
        // x >= 0
        inequalities[0] = new LinearMultivariateRealFunction(new double[]{-1.0, 0.00}, 0.0);  // focus: -x+0 <= 0 
        // y >= 0
        inequalities[1] = new LinearMultivariateRealFunction(new double[]{0.0, -1.00}, 0.0);  // focus: -y+0 <= 0
        // 2x+3y >= 8
        inequalities[2] = new LinearMultivariateRealFunction(new double[]{-2.0, -3.00}, 8.0); // focus: -2x-3y+8 <= 0
        // 5x+2y >= 12
        inequalities[3] = new LinearMultivariateRealFunction(new double[]{-5.0, -2.00}, 12.0);// focus: -5x-2y+12 <= 0

        //optimization problem
        OptimizationRequest or = new OptimizationRequest();
        or.setF0(objectiveFunction);
        or.setFi(inequalities);
        //or.setInitialPoint(new double[] {0.0, 0.0});//initial feasible point, not mandatory
        or.setToleranceFeas(1.E-9);
        or.setTolerance(1.E-9);

        //optimization
        JOptimizer opt = new JOptimizer();
        opt.setOptimizationRequest(or);
        int returnCode = opt.optimize();

        double[] sol = opt.getOptimizationResponse().getSolution();

        System.out.println("Length: " + sol.length);
        for (int i=0; i<sol.length/2; i++){
            System.out.println( "X" + (i+1) + ": " + Math.round(sol[i]) + "\ty" + (i+1) + ": " + Math.round(sol[i+1]) );
        }
    }

}

但也存在一些具有多个或无限多个可行解的线性规划问题。例如,最大化4x+3Y服从8x+6y <= 25,3x+4y <= 15,x >= 0,y >= 0。当我试图像下面这样解决起诉JOptimizer时,它给出了一个错误。

代码语言:javascript
复制
import com.joptimizer.functions.ConvexMultivariateRealFunction;
import com.joptimizer.functions.LinearMultivariateRealFunction;
import com.joptimizer.optimizers.JOptimizer;
import com.joptimizer.optimizers.OptimizationRequest;

/**
 *
 * @author K.P.L.Kanchana
 */
public class test_4_alternateOptimum {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args){
//        BasicConfigurator.configure();

        // Objective function (plane)
        LinearMultivariateRealFunction objectiveFunction = new LinearMultivariateRealFunction(new double[] {-4.0, -3.0}, 0); // maximize 4x+3y

        //inequalities (polyhedral feasible set G.X<H )
        ConvexMultivariateRealFunction[] inequalities = new ConvexMultivariateRealFunction[4];
        // 8x+6y <= 25
        inequalities[0] = new LinearMultivariateRealFunction(new double[]{8.0, 6.0}, -25); // 8x+6y-25<=0
        // 3x+4y <= 15
        inequalities[1] = new LinearMultivariateRealFunction(new double[]{1.0, 4.0}, -15); // 3x+4y-15<=0
        // x >= 0
        inequalities[2] = new LinearMultivariateRealFunction(new double[]{-1.0, 0.0}, 0);
        // y >= 0
        inequalities[3] = new LinearMultivariateRealFunction(new double[]{0.0, -1.0}, 0);

        //optimization problem
        OptimizationRequest or = new OptimizationRequest();
        or.setF0(objectiveFunction);
        or.setFi(inequalities);
        //or.setInitialPoint(new double[] {0.0, 0.0});//initial feasible point, not mandatory
        or.setToleranceFeas(1.E-9);
        or.setTolerance(1.E-9);

        //optimization
        JOptimizer opt = new JOptimizer();
        opt.setOptimizationRequest(or);
        try {
            int returnCode = opt.optimize();
        }
        catch (Exception ex) {
            ex.printStackTrace();
            return;
        }

        // get the solution
        double[] sol = opt.getOptimizationResponse().getSolution();

        // display the solution
        System.out.println("Length: " + sol.length);
        for (int i = 0; i < sol.length; i++) {
                System.out.println("answer " + (i+1) + ": " + (sol[i]));
        }
    }

}

我想通过使用JOptimizer在无限数量的解决方案中得到一个可行的解决方案来修正这个错误。但我不知道怎么做?JOptimizer库中有专用命令吗?有人能说说吗?所有必需的库,我的google驱动器上的依赖程序:https://drive.google.com/file/d/0B84k1fZRHSMdak00TjZKNXBKSFU/view?usp=sharing Java在这里可用:http://joptimizer.com/apidocs/index.html抱歉,如果这是一个奇怪的问题,并感谢大家花时间来考虑这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-04 15:50:54

我发现我的代码有问题。说实话,我得到了阿尔贝托·利夫拉托的帮助。据我所知,他是开发JOptimizer的人。我真的很感激他浪费时间去发现这个问题。正如他提到的,问题不是多个解决方案,而是高精度的问题,我向求解者提出要求。这是一个最好的做法,不要要求更高的精度,你真的需要。还请记住,不等式总是以G.x < h的形式出现,即严格小于(不少于htan或等于),因为JOptimizer实现了内部点方法求解器。

修正代码:

代码语言:javascript
复制
import com.joptimizer.functions.ConvexMultivariateRealFunction;
import com.joptimizer.functions.LinearMultivariateRealFunction;
import com.joptimizer.optimizers.JOptimizer;
import com.joptimizer.optimizers.OptimizationRequest;

/**
 *
 * @author K.P.L.Kanchana
 */
public class test_4_alternateOptimum {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args){
//        BasicConfigurator.configure();

        // Objective function (plane)
        LinearMultivariateRealFunction objectiveFunction = new LinearMultivariateRealFunction(new double[] {-4.0, -3.0}, 0); // maximize 4x+3y

        //inequalities (polyhedral feasible set G.X<H )
        ConvexMultivariateRealFunction[] inequalities = new ConvexMultivariateRealFunction[4];
        // 8x+6y < 25(no equal sign)
        inequalities[0] = new LinearMultivariateRealFunction(new double[]{8.0, 6.0}, -25); // 8x+6y-25<0
        // 3x+4y < 15
        inequalities[1] = new LinearMultivariateRealFunction(new double[]{1.0, 4.0}, -15); // 3x+4y-15<0
        // x > 0
        inequalities[2] = new LinearMultivariateRealFunction(new double[]{-1.0, 0.0}, 0);
        // y > 0
        inequalities[3] = new LinearMultivariateRealFunction(new double[]{0.0, -1.0}, 0);

        //optimization problem
        OptimizationRequest or = new OptimizationRequest();
        or.setF0(objectiveFunction);
        or.setFi(inequalities);
        //or.setInitialPoint(new double[] {0.0, 0.0});//initial feasible point, not mandatory
        or.setToleranceFeas(JOptimizer.DEFAULT_FEASIBILITY_TOLERANCE / 10); // Here was the issue
        or.setTolerance(JOptimizer.DEFAULT_TOLERANCE / 10);  // Here was the issue

        //optimization
        JOptimizer opt = new JOptimizer();
        opt.setOptimizationRequest(or);
        try {
            int returnCode = opt.optimize();
        }
        catch (Exception ex) {
            ex.printStackTrace();
            return;
        }

        // get the solution
        double[] sol = opt.getOptimizationResponse().getSolution();

        // display the solution
        System.out.println("Length: " + sol.length);
        for (int i = 0; i < sol.length; i++) {
                System.out.println("answer " + (i+1) + ": " + (sol[i]));
        }
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41451074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档