首页 > 解决方案 > 如何从 Java 调用 cplex .mod 和 .data

问题描述

我有一个在 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()and cplex.solve()。当我尝试运行它时,这是我得到的错误。 在此处输入图像描述 我无法弄清楚为什么我会从中得到错误 oplF.createCplex()cplex.solve()尽管我已经添加了cplexandopl

标签: javacplex

解决方案


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

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


推荐阅读