如何在or-tools中定义复杂的目标函数?

Rom*_*ron 5 python linear-programming least-squares or-tools objective-function

我想知道如何使用 or-tools 定义复杂的目标函数(如果可能的话)。

下面的基本示例展示了如何使用 python 中的 Or-tools 解决基本线性问题:

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 
Run Code Online (Sandbox Code Playgroud)

在这个非常基本的示例中,目标函数是Minimize(0.5*x + 2*y)。例如,获取变量的最小二乘法Minimize(x^2 + y^2)或绝对值的语法是什么Minimize(abs(x) + y)

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

提前谢谢了,

罗曼

Ric*_*ard 3

您已将此问题标记为linear-programming,因此您已经具备了在此处找出答案的要素。

如果您查看此页面,您会发现 OR-Tools 可以解决线性规划以及其他一些优化问题。

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

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

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

您可以执行许多此类转换,数学程序员/运筹研究员的技能之一就是记住其中许多转换。