2017-01-02 126 views
-2

我要解決的問題是:如何解決線性規劃問題,使用JOptimizer Java API提供備選最優解決方案?

/** Maximize 4x+3Y 
* Subject to 
* 8x+6y <= 25 
* 3x+4y <= 15 
* x,y >= 0 
*/ 

理論上這個問題的最佳LP解決方案具有無限#。

所有需要的庫,在我的谷歌提供的依賴關係驅動: https://drive.google.com/file/d/0B84k1fZRHSMdak00TjZKNXBKSFU/view?usp=sharing

我的代碼:

package testJOptimizer; 

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])); 
     } 
    } 

} 
+2

這是一個數學問題或編程問題?如果數學,那麼你在錯誤的網站。如果編程,告訴我們你試過什麼,並解釋你有什麼問題。現在,它看起來像是「爲我工作」的問題,這絕對是StackOverflow的焦點話題。 – Andreas

+0

作爲一個數學問題,答案爲'0 <= Y <= 45/14','X =(25-6y)/ 8',最大化'4X + 3y'在'12.5'。正如你所說:*無限制#個解決方案。* – Andreas

+0

這是一個數學問題,需要用java解決。我使用了JOptimizer庫和我創建的類的數量,這使得使用JOptimizer變得很容易。 –

回答

0

,我發現我的代碼的問題。說實話,我從alberto trivellato得到了一些幫助。據我所知,他是開發JOptimizer的人。我真的很感激他浪費時間去發現問題。 正如他所提到的這個問題不是用多種解決方案,而是以高精度向解決者求助。不要求比你真正需要的更高精度是一個最佳實踐。還要記住,不等式總是以G.x < h的形式出現,即嚴格小於(不少於htan或EQUAL),因爲JOptimizer實現了一個內點法解算器。

更正代碼:

package testJOptimizer; 

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); // There was the issue 
     or.setTolerance(JOptimizer.DEFAULT_TOLERANCE/10); // There 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])); 
     } 
    } 

}