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

时间:2019-07-19 18:47:59

标签: java cplex

我有一个在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()。当我尝试运行它时,这是我得到的错误。 enter image description here 尽管我已经添加了oplF.createCplex()cplex.solve()库,但我不知道为什么从cplexopl收到错误消息

4 个答案:

答案 0 :(得分:1)

实际上,您的IDE告诉您问题出在哪里:可能引发了IloException,而您不处理它们。您需要用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);
    }
}

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

答案 1 :(得分:0)

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

设置

在装有Eclipse 3.6的x86-64 Linux计算机上,这是完成的,就像这样(希望对您来说很相似):

  1. 右键单击您的Java项目,然后选择“属性”
  2. 在左侧选择“ Java构建路径”,在右侧选择“库”标签
  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)环绕尝试/捕捉。选择其中一个来解决问题。在所有红色波浪线都消失之后,您应该可以运行您的程序。

答案 2 :(得分:0)

我已经删除了导入的ilog.cplex。*;和ilog.concert。 但是,我仍然有红色的编译器错误。另外,我无法运行它。

enter image description here

答案 3 :(得分:0)

我也面临着同样的问题。

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

Referral link