在IBM CPLEX中使用对数函数在目标函数中。

huangapple go评论66阅读模式
英文:

Using logarithmic in the objective function in IBM CPLEX

问题

我的目标函数在IBM CPLEX中如下所示:

objective = opt_model.sum(math.log(r_vars[0,0]*(3*w_vars[0]-1))+math.log(r_vars[1,0]*(3*w_vars[0]-1)))
opt_model.maximize(objective)

变量 w_vars 的值可以在范围 [0,1] 内,而 r_vars 的值可以在范围 [1,100] 内。但是我收到以下错误信息:

TypeError: 必须是实数而不是 QuadExpr

我认为问题出在 math.log 函数的括号上。如何在IBM CPLEX的目标函数中使用对数函数?或者对此有何看法?

英文:

My objective function in IBM CPLEX is as follows:

objective = opt_model.sum(math.log(r_vars[0,0]*(3*w_vars[0]-1))+math.log(r_vars[1,0]*(3*w_vars[0]-1)))
opt_model.maximize(objective)

The variable w_vars can get a value in the range [0,1] and the value of r_vars can be in the range of [1,100]. But I am getting this error:

TypeError: must be real number, not QuadExpr

I assume the problem is the result of the parentheses for the math.log function. How can I use a log function in the objective function in IBM CPLEX? Or any thoughts on this?

答案1

得分: 1

你可以依赖Cplex中的cpo进行操作,具体示例可以参考以下链接:

https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoononlinear.py

以下是一个简单的示例代码:

from docplex.cp.model import CpoModel

mdl = CpoModel(name='buses')
nbbus40 = mdl.integer_var(0, 1000, name='nbBus40')
nbbus30 = mdl.integer_var(0, 1000, name='nbBus30')
mdl.add(nbbus40 * 40 + nbbus30 * 30 >= 300)

# 非线性目标
mdl.minimize(mdl.exponent(nbbus40) * 500 + mdl.exponent(nbbus30) * 400)

msol = mdl.solve()

print(msol[nbbus40], "辆40座公交车")
print(msol[nbbus30], "辆30座公交车")

请注意,这是一个使用Cplex的示例代码,用于解决一个特定的问题。您可以根据您的需求进行相应的修改和定制。

英文:

What you could do is rely on cpo within Cplex

See

https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoononlinear.py

For a tiny example

from docplex.cp.model import CpoModel

mdl = CpoModel(name='buses')
nbbus40 = mdl.integer_var(0,1000,name='nbBus40')
nbbus30 = mdl.integer_var(0,1000,name='nbBus30')
mdl.add(nbbus40*40 + nbbus30*30 >= 300)

#non linear objective
mdl.minimize(mdl.exponent(nbbus40)*500 + mdl.exponent(nbbus30)*400)

msol=mdl.solve()

print(msol[nbbus40]," buses 40 seats")
print(msol[nbbus30]," buses 30 seats") 

huangapple
  • 本文由 发表于 2023年2月8日 09:52:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/75380673.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定