我想知道如何使用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
在这个非常基本的示例中,目标函数为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
为负数且正在使之最大化),此方法就起作用。更长的解释在这里。
您可以执行许多这样的转换,而数学程序员/操作研究人员的技能之一就是记住其中的许多转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句