如何在ortools中定义复杂的目标函数?

2024-04-19 06:04:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何使用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)或变量{}的绝对值,需要什么语法?在

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

非常感谢

罗曼


Tags: 工具函数add目标定义variablesolutionsolver
1条回答
网友
1楼 · 发布于 2024-04-19 06:04:46

您已经用linear-programming标记了这个问题,因此您已经具备了在这里找出答案的要素。在

如果您查看this page,您将看到OR工具解决线性程序,以及其他一些优化问题。在

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

你提到的第二个目标-Minimize(x^2 + y^2)-不能用OR工具解决,因为它是非线性的:这些平方项使它成为二次的。要解决这个问题,您需要一些可以执行quadratic programmingsecond-order cone programmingquadratically constrained quadratic programming的操作。所有这些方法都将线性规划作为一个子集。我推荐用来解决这类问题的工具是cvxpy,它提供了一个强大而优雅的界面。(或者,可以将二次曲线近似为线性分段,但会产生更多约束。)

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

你可以进行很多这样的转换,数学程序员/运算研究人员的一项技能就是记住其中的许多。在

相关问题 更多 >