添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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