您的位置:首页 > 编程语言

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

2016-12-08 01:34 543 查看
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; 

当然了, 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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: