首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >操作顺序(以安培表示)

操作顺序(以安培表示)
EN

Stack Overflow用户
提问于 2013-06-04 06:45:45
回答 1查看 278关注 0票数 1

我在我的模型文件中有以下问题:我希望CPLEX求解器首先在括号中执行操作,然后被乘以。和通常的数学一样..。但是当我使用这个约束运行我的模型文件时:

代码语言:javascript
运行
复制
subject to c4a {e in E, k in K, o in O}:
f[k,o] = 0
==>     
    delta[e,k,o] - p[k,e] * (sum{l in K}(b[l,e]*(1-f[l,o]))) = 0 
else  
    delta[e,k,o] = 0;

其中E,K,O是集合;δ,f是二进制变量;而rest是参数。我遇到了我之前用这个括号描述的问题:"(1-fl,o)“。当我尝试解析示例数据文件时,我收到以下错误:

代码语言:javascript
运行
复制
CPLEX 11.2.0: logical constraint _slogcon[1] is not an indicator constraint.
expand _slogcon[1];
subject to c4a['1_2',2,'o1']:f[2,'o1'] == 0 ==> delta['1_2',2,'o1'] - (3 - f[2,'o1'] - f[3,'o1'] - 
f[4,'o1']) == 0 else delta['1_2',2,'o1'] == 0;

在这里,您可以看到CPLEX求解器将括号中第一个元素乘以bl,e,然后尝试将它们相加。我的问题是:如何避免这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-05 00:05:32

AMPL中的expand命令简化了约束表达式。特别是,它结合了like terms。例如:

代码语言:javascript
运行
复制
var x;
var y;
subject to c: 2 * (x + y) + 3 * x = 0;
expand c;

打印

代码语言:javascript
运行
复制
subject to c:
    5*x + 2*y = 0;

在您的示例中,AMPL使用加法/减法的乘法distributivitya * (b - c) = a * b - a * c。这是必要的,因为CPLEX和许多其他求解器只接受某种形式的约束表达式,例如线性表达式a1 * x1 + a2 * x2 + ... + an * xn,并且没有方法向其传递任意表达式树(至少使用CPLEX中的C API )。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16907067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档