gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:16:53 45 4
gpt4 key购买 nike

我想知道如何使用 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 标记了这个问题,所以你已经具备了在这里找出答案的要素。

如果你 checkout this page ,您会看到 OR-Tools 解决了线性程序,以及其他一些优化问题。

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

您提到的第二个目标---Minimize(x^2 + y^2)---不能用 OR-Tools 解决,因为它是非线性的:那些平方项使它成为二次项。要解决这个问题,您需要一些可以做的事情 quadratic programming , second-order cone programming , 或 quadratically constrained quadratic programming .所有这些方法都包括线性规划作为一个子集。我推荐用于解决此类问题的工具是 cvxpy ,它提供了一个强大而优雅的界面。 (或者,您可以将二次近似为线性分段,但您会遇到更多限制。)

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

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

关于python - 如何在 or-tools 中定义复杂的目标函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59360870/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com