[英]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()
得到错误,尽管我已经添加了cplex
和opl
库
实际上,您的 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 机器上,这是完成的,就像这样(希望它对你来说是相似的):
COS_INSTALL_DIR/opl/lib/oplall.jar
(其中COS_INSTALL_DIR
是您安装 CPLEX Optimization Studio 的位置)要做的另一件事是确保您的LD_LIBRARY_PATH
环境变量设置为COS_INSTALL_DIR/opl/bin/x86-64_linux
。 (注意:在 Windows 上,我认为您应该设置PATH
环境变量。)您可以在 Eclipse 中设置它,如下所示:
LD_LIBRARY_PATH
(在 Windows 上尝试PATH
)COS_INSTALL_DIR/opl/bin/x86-64_linux
(同样,其中COS_INSTALL_DIR
是您安装 CPLEX Optimization Studio 的位置)修复编译器错误
完成设置后,您可能会注意到您仍然会遇到编译器错误(红色小波浪线表示这一点)。 将鼠标悬停在这些上面,您将看到一个快速修复列表:1) 添加 throws 声明; 2) 用 try/catch 环绕。 选择其中之一来解决问题。 在所有红色波浪线消失后,您应该能够运行您的程序。
如果您不熟悉在 Eclipse 中修复编译器错误,也许这个Eclipse 教程有帮助。 有时您必须选择“Project > Clean”来强制重新编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.