如何在OR工具中定义复杂的目标函数?



我想知道如何使用 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)或变量Minimize(abs(x) + y)的绝对值的语法是什么?

是否可以定义一个子函数并将其调用到目标函数中?还是我应该以另一种方式进行?

提前非常感谢,

罗曼

你已经用linear-programming标记了这个问题,所以你已经有了在这里找出答案的成分。

如果您查看此页面,您将看到OR-Tools可以解决线性程序,以及其他一些优化问题。

所以你提到的第一个目标函数,Minimize(0.5*x + 2*y)是可解的,因为它是线性的。

你提到的第二个目标---Minimize(x^2 + y^2)---不能用OR-Tools解决,因为它是非线性的:这些平方项使它成为二次的。为了解决这个问题,你需要一些可以做二次规划、二阶锥体规划或二次约束二次规划的东西。所有这些方法都包括线性规划作为子集。我推荐的用于解决此类问题的工具是cvxpy,它提供了一个强大而优雅的界面。(或者,您可以将二次近似为线性分段,但会产生更多约束。

你提到的最后一个目标,Minimize(c*abs(x) + y)可以作为线性规划求解abs(x)即使它本身是非线性的。为此,我们将目标重写为min( c*(t1-t2) +y)并将约束t1,t2>=0.只要c是正的并且您正在最小化(或者c是负数并且您正在最大化(,这就可以工作。这里有一个更长的解释。

您可以执行许多这样的转换,数学程序员/操作研究人员的技能之一是记住其中的许多转换。

相关内容

  • 没有找到相关文章

最新更新