我想知道如何使用or工具定义一个复杂的目标函数(如果可能的话)。在
下面的基本示例显示了如何使用python中的Or工具来处理基本的线性问题:
solver = pywraplp.Solver('lp_pricing_problem', pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
# Define variables with a range from 0 to 1000.
x = solver.NumVar(0, 1000, 'Variable_x')
y = solver.NumVar(0, 1000, 'Variable_y')
# Define some constraints.
solver.Add(x >= 17)
solver.Add(x <= 147)
solver.Add(y >= 61)
solver.Add(y <= 93)
# Minimize 0.5*x + 2*y
objective = solver.Objective()
objective.SetCoefficient(x, 0.5)
objective.SetCoefficient(y, 2)
objective.SetMinimization()
status = solver.Solve()
# Print the solution
if status == solver.OPTIMAL:
print("x: {}, y: {}".format(x.solution_value(), y.solution_value())) # x: 17.0, y: 61.0
在这个非常基本的例子中,目标函数是Minimize(0.5*x + 2*y)
。
例如,要获得最小平方Minimize(x^2 + y^2)
或变量{
是否可以定义子函数并将其调用到目标函数中?还是我应该换一种方式?在
非常感谢
罗曼
您已经用
linear-programming
标记了这个问题,因此您已经具备了在这里找出答案的要素。在如果您查看this page,您将看到OR工具解决线性程序,以及其他一些优化问题。在
所以你提到的第一个目标函数,
Minimize(0.5*x + 2*y)
是可解的,因为它是线性的。在你提到的第二个目标-
Minimize(x^2 + y^2)
-不能用OR工具解决,因为它是非线性的:这些平方项使它成为二次的。要解决这个问题,您需要一些可以执行quadratic programming、second-order cone programming或quadratically constrained quadratic programming的操作。所有这些方法都将线性规划作为一个子集。我推荐用来解决这类问题的工具是cvxpy,它提供了一个强大而优雅的界面。(或者,可以将二次曲线近似为线性分段,但会产生更多约束。)你提到的最后一个目标是,即使
Minimize(c*abs(x) + y)
本身是非线性的,它也可以作为线性规划来求解。为此,我们将目标重写为min( c*(t1-t2) +y)
,并添加约束t1,t2>=0
。只要c
为正且最小化(或者c
为负且最大化),就可以实现。一个较长的解释是here。在你可以进行很多这样的转换,数学程序员/运算研究人员的一项技能就是记住其中的许多。在
相关问题 更多 >
编程相关推荐