运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex

目录

1 C++调用Cplex的在VS2010中的配置及示例代码演示

1.1 cplex在vs2010中的配置

1.2 测试示例

1.2.1 测试用例

1.2.2 测试代码

1.2.3 运行结果

2 C#调用Cplex在VS2010下的配置

2.1 C#配置Cplex

2.2 算例测试及代码

2.2.1 算例代码

2.2.3 运行结果

3 Java语言调用Cplex的配置与示例演示

3.1 配置

3.2 代码示例

3.3 注意事项

4 Matlab调用Cplex的配置与示例

4.1 配置

4.1.1 设置路径

4.1.2 下载yalmip及配置

4.2 算例编写

4.3 算例结果演示

5 python配置Cplex

5.1 配置

5.2 编码示例

5.3 结果演示

6 总结

7 参考博文


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 测试用例

\\&max = x_{1}+2x_{2}+3x_{3} \\&-x_{1}+x_{2}+x_{3}\leqslant 20 \\ &x_{1}-3x_{2}+x_{3}\leqslant 30\\x1\leqslant40

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及配置

配置完后,关闭并重启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 参考博文


更多精彩,也可关注本人微信公众帐号【学而立行】,欢迎一起学习,共同进步!


 

  • 10
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小薛引路

喜欢的读者,可以打赏鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值