ILOG CPLEX OPL 编程手册,使用心得与简单例子

CPLEX 自己的编程语言本来没打算学,这边导师说我若用OPL编写程序,他可以帮我改程序,于是就查了查。


OPL 的帮助文档很长很全,看上面几个例子就会简单的建模编程了。网上有国内东北大学一位老师的几个课件可以找到,跟OPL自己的帮助文档差不多,但因为是中文,不像帮助文档那么冗长,更适合学习。

我自己也找到几个有用的学习资料

1. Ilog manual1: http://download.csdn.net/download/robert_chen1988/10118785

2. Ilog manual2: http://download.csdn.net/download/robert_chen1988/10118790

3. java 调用 cplex 使用手册:http://download.csdn.net/download/robert_chen1988/10119473


使用体会:

1. 语法规则很怪异。参数跟求解变量必须严格指定;有一个 dexpr 函数可以表示变量之间的组合.

2. 不易调试程序。试了试调试程序,不能够断点,若要想知道某个变量在运行时值,必须用 writeln 函数输出,很麻烦。


也有优点:

1. 非常容易表示分段线性函数。 OPL有专门的 Piecewise 函数来表示分段线性函数, 这一点 Matlab 做不到。

2. 非常容易表示一些逻辑关系。 OPL有一个 => 符号,可以方便表示逻辑关系,就不用写出数学表达式了。 例如 x>0 时, y=0,用OPL语言表示为:x>0 => y==0; 

3. 可以用 maxl 或 minl 直接表示一个 max 或 min 的表达式,只要表达式里面都是线性,cplex 可以自动将这个非线性表达式转化为线性。


当然了, CPLEX本身功能强大,甚至可以求解二次凸规划问题了。目前来看,若不需要 Piecewise 函数, 其他功能可以 通过 Yalmip 工具箱调用 CPLEX 求解,就用不着 OPL 编程了。


一个简单的例子:

\begin{align} &\max\quad &&x_1 + 2x_2 +3x_3\nonumber\\ &s.t.&&\nonumber\\ & &&-x_1 + x_2 + x_3 \leq 20\nonumber\\ & &&x_1 - 3x_2 + x_3 \leq 30\nonumber\\ & &&0\leq x_1\leq 40\nonumber \end{align}


Ilog OPL 的代码:

dvar float x1 in 0..40;
dvar float x2;
dvar float x3;

maximize x1 + 2*x2 +3*x3;

subject to{
	-x1 + x2 + x3 <= 20;
	x1 - 3*x2 + x3 <= 30;
}

运行结果:

// solution (optimal) with objective 202.5
// Quality There are no bound infeasibilities.
// There are no reduced-cost infeasibilities.
// Maximum Ax-b  residual             = 0
// Maximum c-B'pi residual            = 0
// Maximum |x|                        = 42.5
// Maximum |slack|                    = 0
// Maximum |pi|                       = 2.75
// Maximum |red-cost|                 = 3.5
// Condition number of unscaled basis = 3.0e+000
// 


x1 = 40;
x2 = 17.5;
x3 = 42.5;


你可能感兴趣的:(数学优化,Cplex/Gurobi)