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 函数输出,很麻烦。
3. 现在的新版本对中文支持的不好,有时候
配置需要重命名为英文
才能运行。
也有优点:
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;
Python+cplex运筹优化学习笔记(一)
首先呢,说明一下,本文只是自己在学习过程中运用到的例子,然后规整总结一下,随便写写自己所做的一些笔记。小白学习,有不对的地方还望大家批评指正。
1、例子介绍
# The MIP problem solved in this example is:
# object(目标函数):Maximize x1 + 2 x2 + 3 x3 + x4
# Subject to(约束):
# r1: - x1 + x2 + x3 + 10 x