【问题标题】:How to call cplex .mod and .data from Java如何从 Java 调用 cplex .mod 和 .data
【发布时间】:2019-07-19 18:47:59
【问题描述】:

我有一个在 IBM ILOG CPLEX Optimization Studio 中建模和编写的优化问题。我想从 Java 中调用 .mod 和 .dat。我找到了一些例子来做到这一点。但是,我遇到了一些错误。

我的代码如下所示。我还添加了所有 cplex 和 opl 库

package cplexJava;
import ilog.concert.*;
import ilog.cplex.*;
import ilog.opl.*;


public class main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
              model();
    }
     public static void model() {
          int status = 127;                                                       

              IloOplFactory.setDebugMode(true);                                     
              IloOplFactory oplF = new IloOplFactory();                             
              IloOplErrorHandler errHandler = oplF.createOplErrorHandler();         
              IloOplModelSource modelSource = oplF.createOplModelSource("D:/Cplex project/Example_2/Example_2.mod");                                            
              IloOplSettings settings = oplF.createOplSettings(errHandler);         
              IloOplModelDefinition def = oplF.createOplModelDefinition(modelSource,settings);
              IloCplex cplex = oplF.createCplex();                                  
              cplex.setOut(null);                                                   
              IloOplModel opl = oplF.createOplModel(def, cplex);                    
              IloOplDataSource dataSource = oplF.createOplDataSource("D:/Cplex project/Example_2/Example_2.dat");                                            
              opl.addDataSource(dataSource);                                        
              opl.generate();                                                       
              if (cplex.solve())                                                    
              {                                                                     
                  System.out.println("OBJECTIVE: " + opl.getCplex().getObjValue()); 
                  opl.postProcess();                                                
                  opl.printSolution(System.out);                                    
              }                                                                     
              else                                                                  
              {                                                                     
                  System.out.println("No solution!");                               
              }                                                                     
              oplF.end();                                                           
                      status = 0;                                                   

            System.exit(status);
     }
}

在我的代码中,错误来自oplF.createCplex()cplex.solve()。当我尝试运行它时,这是我得到的错误。 尽管我已经添加了 cplexopl 库,但我无法弄清楚为什么会从 oplF.createCplex()cplex.solve() 得到错误

【问题讨论】:

    标签: java cplex


    【解决方案1】:

    实际上,您的 IDE 会告诉您问题所在:可能会抛出 IloExceptions 而您没有处理它们。您需要用 try catch 块包围您的代码,或者您的主方法应该在签名中包含“throws IloException”:

    package cplexJava;
    import ilog.concert.*;
    import ilog.cplex.*;
    import ilog.opl.*;
    
    
    public class main {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            model();
        }
        public static void model() {
            int status = 127;
            try {
    
                IloOplFactory.setDebugMode(true);
                IloOplFactory oplF = new IloOplFactory();
                IloOplErrorHandler errHandler = oplF.createOplErrorHandler();
                IloOplModelSource modelSource = oplF.createOplModelSource("D:/Cplex project/Example_2/Example_2.mod");
                IloOplSettings settings = oplF.createOplSettings(errHandler);
                IloOplModelDefinition def = oplF.createOplModelDefinition(modelSource,settings);
                IloCplex cplex = oplF.createCplex();
                cplex.setOut(null);
                IloOplModel opl = oplF.createOplModel(def, cplex);
                IloOplDataSource dataSource = oplF.createOplDataSource("D:/Cplex project/Example_2/Example_2.dat");
                opl.addDataSource(dataSource);
                opl.generate();
                if (cplex.solve())
                {
                    System.out.println("OBJECTIVE: " + opl.getCplex().getObjValue());
                    opl.postProcess();
                    opl.printSolution(System.out);
                }
                else
                {
                    System.out.println("No solution!");
                }
                oplF.end();
            } catch (IloException ilx) {
                // log error message or something like that
            }
            status = 0;
    
            System.exit(status);
        }
    }
    

    请使用首字母大写的类名和全小写的包名。

    【讨论】:

      【解决方案2】:

      对于 OPL Java API,您应该只需要 oplall.jar

      设置

      在我的带有 Eclipse 3.6 的 x86-64 Linux 机器上,已经完成了,就像这样(希望对你来说也是类似的):

      1. 右键单击您的 Java 项目并选择属性
      2. 选择左侧的“Java Build Path”和右侧的“库”选项卡
      3. 单击“添加外部 JAR...”按钮并选择 COS_INSTALL_DIR/opl/lib/oplall.jar(其中 COS_INSTALL_DIR 是您安装 CPLEX Optimization Studio 的位置)
      4. 点击确定

      另一件事是确保您的LD_LIBRARY_PATH 环境变量设置为COS_INSTALL_DIR/opl/bin/x86-64_linux。 (注意:在 Windows 上,我认为您应该设置 PATH 环境变量。)您可以在 Eclipse 中设置它,如下所示:

      1. 在菜单中选择“运行 > 运行配置...”
      2. 在左侧,选择您的 java 应用程序
      3. 在右侧,选择环境选项卡并单击“新建...”按钮
      4. 在名称字段中输入 LD_LIBRARY_PATH(在 Windows 上尝试 PATH
      5. 在值字段中输入COS_INSTALL_DIR/opl/bin/x86-64_linux(同样,COS_INSTALL_DIR 是您安装 CPLEX Optimization Studio 的位置)
      6. 点击确定

      修复编译器错误

      设置完成后,您可能会注意到仍然出现编译器错误(红色的小波浪线表明了这一点)。将鼠标悬停在那些上面,您将看到一个快速修复列表: 1) 添加 throws 声明; 2)用try/catch包围。选择其中一个来解决问题。在所有红色波浪线消失后,您应该能够运行您的程序了。

      如果您不熟悉在 Eclipse 中修复编译器错误,也许可以通过 this Eclipse 教程获得帮助。有时您必须选择“Project > Clean”来强制重新编译。

      【讨论】:

      • 非常感谢 Rkersh。我完全按照你的建议做了,但它仍然不能解决我的问题。我的 oplall.jar 路径是 C:\Program Files\IBM\ILOG\CPLEX_Studio128\opl\lib\oplall.jar,我的库路径是 C:\Program Files\IBM\ILOG\CPLEX_Studio128\opl\bin\x64_win64。
      • 您必须告诉我们剩下的问题是什么(或打开一个新问题)。另外:删除 import ilog.cplex.*;import ilog.concert.*;` 语句。
      • @DanielJunglas 我已经删除了 import ilog.cplex.*;和 ilog.concert。但是,我仍然有红色的编译器错误。另外,我无法按照上面的帖子所示运行它。
      • 您正面临一些标准的 Java 错误消息(与 CPLEX 无关)。产生编译错误的函数可能会引发ilog.concert.IloException 类型的异常。所以你必须要么捕获这些异常,要么声明你的函数来抛出它们。一个简单的解决方法是在你的函数声明中添加throws ilog.concert.IloException。更好的办法可能是捕获这些异常并以某种方式处理它们。最好的办法当然是回到 Java 课程/书籍,阅读异常并了解为什么会出现错误
      • 我在上面的回答中的 FIX COMPILER ERRORS 部分添加了更多内容。希望这会有所帮助。
      【解决方案3】:

      我也遇到了同样的问题。

      经过反复试验,我意识到对于 macos,正确的名称是 DYLD_LIBRARY_PATH

      Referral link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多