目录
1 C++调用Cplex的在VS2010中的配置及示例代码演示
1 C++调用Cplex的在VS2010中的配置及示例代码演示
1.1 cplex在vs2010中的配置
- 正常建立一个控制台项目
- 在【项目--属性】下,作如下设置:
- 【C/C++】--【常规】--【附加库目录】,添加如下两个库目录:
你的安装位置\concert\include |
你的安装位置\cplex\include |
- 【C/C++】--【预处理器】--【预处理器定义】,粘贴如下内容:
WIN32 NDEBUG _CONSOLE _LIB IL_STD |
- 【连接器】--【附加库目录】,选中如下两个路径:
你的安装路径\concert\lib\x86_windows_vs2010\stat_mda 你的安装路径\cplex\lib\x86_windows_vs2010\stat_mda |
- 【连接器】--【附加依赖项】,复制以下内容:
concert.lib cplex1261.lib ilocplex.lib |
1.2 测试示例
1.2.1 测试用例
1.2.2 测试代码
//**************************************************************//
// the test version of Cplex with C++
// time 2019-09-28
// author A & R
//*************************************************************//
#include <ilcplex/ilocplex.h>
#include<cstdlib>
#include<iostream>
ILOSTLBEGIN //#define ILOSTLBEGIN using namespace std;
int main(int argc, char **argv)
{
IloEnv env;//construct an Cplex environment env, which belongs to a handle class IloEnv;
try{
IloModel model(env);// define the varies "env"
IloNumVarArray vars(env);// define the varies vars(env), the x1, x2, x3 can be expressed with vars(0), vars(1), vars(2)
// define the bounds of varies
vars.add(IloNumVar(env, 0.0, 40.0));
vars.add(IloNumVar(env));
vars.add(IloNumVar(env));
//objective to optimize:
model.add(IloMaximize(env, vars[0]+2*vars[1]+3*vars[2]));//opjective: Maximize the x1+2*x2+3*x3;
//subject to:
model.add(-vars[0]+vars[1]+vars[2]<=20);
model.add(vars[0]-3*vars[1]+vars[2]<=30);
//expection processing, refer to "C++ try&catch"
IloCplex cplex(model);
if(!cplex.solve()){
env.error()<<"Failed to optimize LP."<<endl;
throw(-1);
}
IloNumArray vals(env);
env.out() << "solution status = "<< cplex.getStatus() << endl;
env.out() << "Solution value=" << cplex.getObjective() << endl;
cplex.getValues(vals, vars);
env.out() << "Values = " << vals << endl;
}
// cathch functions, refer to "C++ try&catch"
catch(IloException&e){
cerr << "Concert exception caught:" << e << endl;
}
catch(...){
cerr << "Unknown exception caught" << endl;
}
env.end();
//return 0;
system("PAUSE");
return EXIT_SUCCESS;
}
1.2.3 运行结果
2 C#调用Cplex在VS2010下的配置
2.1 C#配置Cplex
这个配置比较简单,直接添加两个引用即可
你的Cplex安装目录\cplex\bin\x86_win32\ILOG.CPLEX.dll" 你的Cplex安装目录\cplex\bin\x86_win32\ILOG.Concert.dll" |
2.2 算例测试及代码
2.2.1 算例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ILOG.Concert;
using ILOG.CPLEX;
namespace csCplex
{
class Program
{
static void Main(string[] args)
{
try
{
//1 先创建一个Cplex空模型
Cplex cplexModel = new Cplex();
//2 生成决策变量并赋值
INumVar[][] deVar = new INumVar[1][];
double[] lowerBound = { 0.0, 0.0, 0.0};
double[] upBound = { 40.0, double.MaxValue,double.MaxValue };
string[] deVarName = { "x1", "x2", "x3"};
//包含两个变量,下界,上界,变量名称
INumVar[] X = cplexModel.NumVarArray(3, lowerBound, upBound, deVarName);
deVar[0] = X;
//定义模型目标函数的系数
double[] objCoff = { 1.0, 2.0, 3.0 };
cplexModel.AddMaximize(cplexModel.ScalProd(X, objCoff));
//3 添加约束条件
IRange[][] rng = new IRange[1][];
rng[0] = new IRange[2];
//添加小于等于约束
rng[0][0] = cplexModel.AddLe(
cplexModel.Sum(cplexModel.Prod(-1.0, X[0]), cplexModel.Prod(1.0, X[1]),cplexModel.Prod(1.0, X[2])),
20, "约束1");
rng[0][1] = cplexModel.AddLe(
cplexModel.Sum(cplexModel.Prod(1.0, X[0]), cplexModel.Prod(-3.0, X[1]), cplexModel.Prod(1.0, X[2])),
30, "约束2");
//4 导出模型
cplexModel.ExportModel("C#调用Cplex演示示例模型.lp");
//5 求解模型
if (cplexModel.Solve())
{
int nvars = cplexModel.GetValues(deVar[0]).Length;
for (int i = 0; i < nvars; i++)
{
cplexModel.Output().WriteLine("x" + i + "=" + cplexModel.GetValues(deVar[0])[i]);
}
}
cplexModel.End();
}
catch(ILOG.Concert.Exception e)
{
System.Console.WriteLine("concert exception:" + e);
}
finally
{
System.Console.WriteLine("模型求解完毕");
}
}
}
}
2.2.3 运行结果
3 Java语言调用Cplex的配置与示例演示
注意java的位数要与Cplex的位数一致,64位与32位不兼容
3.1 配置
- 添加环境变量
您的Cplex安装路径\cplex\bin\x86_win32\cplex1261.dll 您的Cplex安装路径\cplex\lib\cplex.jar |
- 设置构建路径,【你的java项目,右键】--【Bulid Path】--【Condigure Build Path..】--【Existing Project into Workspce】--【Next】
- 【Add External jars】,选择你安装位置下的\cplex\lib\cplex.jar
- 配置库
3.2 代码示例
package javaCplex;
import ilog.concert.*;
import ilog.cplex.*;
public class jCplex {
public static void main(String[] args) {
// TODO Auto-generated method stub
double[] lb = { 0.0, 0.0, 0.0};
double[] ub = { 40.0, Double.MAX_VALUE, Double.MAX_VALUE};
try {
IloCplex cplex = new IloCplex();
IloNumVar[] x = cplex.numVarArray(3, lb, ub);
double[] objvals = { 1.0, 2.0, 3.0 };
cplex.addMaximize(cplex.scalProd(x, objvals));
cplex.addLe(cplex.sum(cplex.prod(-1.0, x[0]), cplex.prod(1.0, x[1]), cplex.prod(1.0,
x[2])), 20);
cplex.addLe(cplex.sum(cplex.prod(1.0, x[0]), cplex.prod(-3.0, x[1]), cplex.prod(1.0,
x[2])), 30);
if (cplex.solve()) {
cplex.output().println("Solution status = " + cplex.getStatus());
cplex.output().println("Solution value = " + cplex.getObjValue());
double[] val = cplex.getValues(x);
int ncols = cplex.getNcols();
for (int j = 0; j < ncols; ++j)
cplex.output().println("Column: " + j + " Value = " + val[j]);
}
cplex.end();
} catch (IloException e) {
System.err.println("Concert exception '" + e + "' caught");
}
}
}
3.3 注意事项
如果java64位Cplex是32位时,会报错误
java.lang.UnsatisfiedLinkError: ....\cplex\bin\x86_win32\cplex1261.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform java.library.path must point to the directory containing the CPLEX shared library try invoking java with java -Djava.library.path=... Exception in thread "main" java.lang.UnsatisfiedLinkError: ilog.cplex.Cplex.CPXopenCPLEX([I)J at ilog.cplex.Cplex.CPXopenCPLEX(Native Method) at ilog.cplex.CplexI.init(CplexI.java:6608) at ilog.cplex.CplexI.<init>(CplexI.java:629) at ilog.cplex.IloCplex.<init>(IloCplex.java:10194) at ilog.cplex.IloCplex.<init>(IloCplex.java:10209) at javaCplex.jCplex.main(jCplex.java:12) |
4 Matlab调用Cplex的配置与示例
4.1 配置
4.1.1 设置路径
注意保持Matlab与Cpex的位数一致性,会报类似【未定义函数或变量 'cplexlink1261']的错误
32位的配置:
64位同上
使用help函数验证是否配置成功
4.1.2 下载yalmip及配置
- yalmip的最新下载网址
- 下载解压将其复制到Matlab安装目录的toolbox路径下
- 设置路径
配置完后,关闭并重启Matlab,测试:
>> which issymmetric
>> which ishemitian
>> which issymmetric
4.2 算例编写
% 清除工作区
clear;clc;close all;
% 创建决策变量
x = sdpvar(1,3);
%创建约束
C = [
-x(1) + x(2) + x(3) <= 20
x(1) - 3 * x(2) + x(3) <= 30
0 <= x(1) <= 40
];
% 配置
ops = sdpsettings('verbose',0);
% 目标函数
z = -(x(1) + 2 * x(2) + 3 * x(3)); % 注意这是求解最大值,默认是求最小值,所以要加上负号
% 求解
reuslt = optimize(C,z);
if reuslt.problem == 0 % problem =0 代表求解成功
value(x)
-value(z) % 反转
else
disp('求解出错');
end
4.3 算例结果演示
5 python配置Cplex
5.1 配置
这个比较简单,直接找到安装目录下的cplex\python\2.7\x86_win32下找到Cplex文件夹,将其赋值到python27的安装目录下的Lib\site-packages下,打开python控制台,输入如下代码:
import cplex
help(cplex)
如果可以看到帮助文档则说明配置成功,
此外本人还做了python37的测试,发现32位的Cplex不能在64位的python37上匹配成功
5.2 编码示例
# -*- coding: utf-8 -*-
import cplex
from cplex.exceptions import CplexError
# data common to all populateby functions
my_obj = [1.0, 2.0, 3.0]
my_ub = [40.0, cplex.infinity, cplex.infinity]
my_lb = [0.0, 0.0, 0.0]
my_ctype = "CCC"
my_colnames = ["x1", "x2", "x3"]
my_rhs = [20.0, 30.0]
my_rownames = ["r1", "r2"]
my_sense = "LL"
def populatebyrow(prob):
prob.objective.set_sense(prob.objective.sense.maximize)
prob.variables.add(obj=my_obj, lb=my_lb, ub=my_ub, types=my_ctype,
names=my_colnames)
rows = [[["x1", "x2", "x3"], [-1.0, 1.0, 1.0]],
[["x1", "x2", "x3"], [1.0, -3.0, 1.0]]
]
prob.linear_constraints.add(lin_expr=rows, senses=my_sense,
rhs=my_rhs, names=my_rownames)
try:
my_prob = cplex.Cplex()
handle = populatebyrow(my_prob)
my_prob.solve()
except CplexError as exc:
print(exc)
print()
# solution.get_status() returns an integer code
print("Solution status = ", my_prob.solution.get_status(), ":")
# the following line prints the corresponding string
print(my_prob.solution.status[my_prob.solution.get_status()])
print("Solution value = ", my_prob.solution.get_objective_value())
numcols = my_prob.variables.get_num()
numrows = my_prob.linear_constraints.get_num()
slack = my_prob.solution.get_linear_slacks()
x = my_prob.solution.get_values()
print('x: ')
print(x)
5.3 结果演示
6 总结
- 对于C++和C#,都是在VS环境下进行的开发,不存在32位和64位的兼容问题
- java和Matlab以及Python37建议使用64位的Cpex版本
- Matlab在效率上还是比较低的
7 参考博文
- C++调用Cplex例子(程序基本来源于getting started with Cplex)
- .net(C#)调用cplex求解简单线性规划问题
- 如何在java中调用cplex (Cplex in Java)
- python 下使用 cplex
- yalmip使用指南
- Matlab中的YALMIP工具箱 混合整数规划
- yalmip优化工具箱
更多精彩,也可关注本人微信公众帐号【学而立行】,欢迎一起学习,共同进步!