python - 如何在 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
是消极的并且您正在最大化),这就会起作用。更长的解释在这里。
您可以执行许多这样的转换,数学程序员/运筹学研究人员的一项技能就是记住其中的许多。
推荐阅读
- javascript - json调用不同文件后获取对象
- c - 在 Makefile 中使用 patsubst 添加项目的路径
- sql-server - SSIS - SharePoint - 未找到网络路径
- javascript - .value on form group shows numeric values as null or ""
- angular - 为什么 router.navigate() 返回 false?
- r - 将行分配/拆分为相等大小的组,每组达到特定阈值
- python - 从 Zip 文件中读取 .xdoc Word 文档?
- sql - Why date formats are different in APEX and Oracle SQL Developer?
- python - 查找从一个 csv 列到另一个 csv 列的单词频率
- java - 如何使用 twitter4j 在 java 中仅获取 1 个 json 对象?