如何在SCIP程序中访问熵表达式处理器?含ZIMPL与PySCIPOpt示例
在SCIP中使用熵函数作为目标函数
ZIMPL实现
对于目标函数 ( h = \sum_{n=1}^4 -p_n \log(p_n) ),ZIMPL可直接用内置log函数构建每个熵项,SCIP的表达式处理器会自动处理 ( p_n=0 ) 时 ( 0 \times \log(0) = 0 ) 的数值合理性。补全后的代码如下:
param N := 4; set Nset := {1 .. N}; var p[Nset] >=0 <=1; maximize h: sum<n> in Nset: -p[n] * log(p[n]);
PySCIPOpt实现
PySCIPOpt需用quicksum累加熵项,通过模型对象的log方法构建对数表达式。补全后的代码如下:
from pyscipopt import Model, quicksum N=4 model=Model('entropy') p=[] for n in range(N): p.append(model.addVar(lb=0.0, ub=1.0, name='p(%s)' % n)) model.setObjective(quicksum(-p[n] * model.log(p[n]) for n in range(N)), sense='maximize')
补充说明
- SCIP表达式处理器会自动处理 ( p_n=0 ) 的特殊情况,无需额外添加约束或判断;
- 上述代码使用自然对数,若需以2为底的熵,只需给每个熵项乘以 ( 1/\log(2) ) 完成转换。
内容的提问来源于stack exchange,提问作者usertcl
相关产品推荐
相关产品推荐

