相关文章推荐
发财的蚂蚁  ·  python ...·  1 年前    · 
私奔的领结  ·  RestTemplate 最详解 - 知乎·  1 年前    · 

Gurobi-目标函数中定义高次函数

最近在使用Gurobi,今天想在目标函数中定义一个三次函数,按照常规写法不行,于是我在网上查了一下,最终找到了解决的方法。

m.setObjective((x - y) - x * x * x - 10 * y * y + 2 * z, GRB.MINIMIZE)

假设我们需要定义一个目标函数,里面含有三次项。如果按照上面的解法我们会得到报错

Error code 10003: Invalid argument to QuadExpr multiplication

经过查阅我发现Gurobi只能够定义两个数相乘,如果我们想定义一个三次函数,我们可以使用下面的方法。

# add constraint so that we can express the cubic
m.addConstr(xx == x * x)

我们可以在constraint中定义一个名为xx的数为x的平方,接着在目标函数中我们可以使用xx * x来表示三次方项。

那么既然我们可以表示三次方项了,有没有什么办法能够表示多次方项呢?答案是有的,我们可以使用

m.addGenConstrPow(x, y, 4)

就能够定义一个y=x^4,比较简单地表示出多次项。

最近在使用Gurobi,今天想在目标函数中定义一个三次函数,按照常规写法不行,于是我在网上查了一下,最终找到了解决的方法。经过查阅我发现Gurobi只能够定义两个数相乘,如果我们想定义一个三次函数,我们可以使用下面的方法。那么既然我们可以表示三次方项了,有没有什么办法能够表示多次方项呢?答案是有的,我们可以使用。假设我们需要定义一个目标函数,里面含有三次项。如果按照上面的解法我们会得到报错。我们可以在constraint中定义一个名为。的平方,接着在目标函数中我们可以使用。,比较简单地表示出多次项。
Gurobi 提供了线性项和二次项的直接表达方法,用户可以直接调用。但超过二次之后,有二种表达方式 (1)引入辅助变量,拆解为二次项表达。例如 x^5 可以引入几个辅助变量 y=xz,z=w^2, w=x^2,这样每项都是二次项或者线性项。 (2)直接调用 Gurobi 的 addGenConstrPoly() 函数 或者addGenConstrPow() 函数。那么 y = x^5 可以表达为 model.addGenConstrPoly(x, y, [1, 0, 0, 0, 0, 0]) 或者 mode
Gurobi处理非线性目标函数和约束的详细案例非线性项举例`Quadratic Programming``Quadratically Constrained Programming``Quadratically Constrained Quadratic Programming``Second-Order Cone Programming`其他Gurobi可以求解的非线性形式Gurobi代码实现一些闲言简单讲解完整模型构建注意事项参考文献 作者:刘兴禄,清华大学,清华伯克利深圳学院博士在读 文的图片(除
gurobi与python应用2指南见refman,或者google进gurobi官网借助翻译软件为文1.定义变量2.约束部分 指南见refman,或者google进gurobi官网借助翻译软件为文 1.定义变量 常见的定义变量是: m.addvars() // An highlighted block addVars ( *indices, lb=0.0, ub=float(’inf’), obj=0.0, vtype=GRB.CONTINUOUS, name="" ); 默认下界为0。 当下界比0
Unsupported type for LinExpr addition argument gurobipy.GurobiError: Unsupported type (<class 'numpy.ndarray'>) for LinExpr addition argument 这是因为约束表达式必须是数字形式 解决方法为:将数组转变为向量,再去调用求解 import numpy as np
在用SSD-Tensorflow训练自己数据的时候,遇到这样一个问题: InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [20] rhs shape= [84] [[Node: save/Assign_15 = Assign[T...
关于R语言报错:invalid argument to unary operator(一元运算符的无效参数)---ggplot2画图问题--解决Monte Carlo模拟输出
一个简单的整数规划问题: maxs.t.x+y+2zx+2y+3z≤4x+y≥1x,y,zbinary(78)(78)maxx+y+2zs.t.x+2y+3z≤4x+y≥1x,y,zbinary\begin{equation} \begin{aligned} & max & \quad x+y+2z \\ & s.t. & \\ & \quad & x+2y+3z \le 4 \\ & \q...
# Create variables x = m.addVar(lb=0, ub=1, vtype=gp.GRB.CONTINUOUS, name="x") y = m.addVar(lb=0, ub=1, vtype=gp.GRB.CONTINUOUS, name="y") # Set objective function m.setObjective((x**2 + y**2)**0.5, gp.GRB.MINIMIZE) # Optimize the model m.optimize() # Print the optimal solution print("Optimal solution:") print("x =", x.x) print("y =", y.x) 在上面的例子,我们定义了两个变量x和y,并将它们添加到模型。然后,我们设置目标函数为 $\sqrt{x^2+y^2}$。这是一个非线性函数,因为平方根运算是非线性的。最后,我们调用optimize()方法求解模型,并打印出最优解。 需要注意的是,Gurobi对非线性优化的支持是有限的,因此一些非线性问题可能需要使用其他工具进行求解。