繁体   English   中英

如何从 Java 调用 cplex .mod 和 .data

[英]How to call cplex .mod and .data from Java

我有一个在 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() 当我尝试运行它时,这是我得到的错误。 在此处输入图片说明 我不明白为什么我从oplF.createCplex()cplex.solve()得到错误,尽管我已经添加了cplexopl

实际上,您的 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);
    }
}

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

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

设置

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

  1. 右键单击您的 Java 项目并选择属性
  2. 选择左侧的“Java Build Path”和右侧的 Libraries 选项卡
  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 中修复编译器错误,也许这个Eclipse 教程有帮助。 有时您必须选择“Project > Clean”来强制重新编译。

我也面临同样的问题。

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

推荐链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM