here is a google OR-tool example to optimize a function:
from ortools.linear_solver import pywraplp
def LinearProgrammingExample():
"""Linear programming sample."""
# Instantiate a Glop solver, naming it LinearExample.
solver = pywraplp.Solver.CreateSolver('GLOP')
if not solver:
return
# Create the two variables and let them take on any non-negative value.
x = solver.NumVar(0, solver.infinity(), 'x')
y = solver.NumVar(0, solver.infinity(), 'y')
print('Number of variables =', solver.NumVariables())
# Constraint 0: x + 2y <= 14.
solver.Add(x + 2 * y <= 14.0)
# Constraint 1: 3x - y >= 0.
solver.Add(3 * x - y >= 0.0)
# Constraint 2: x - y <= 2.
solver.Add(x - y <= 2.0)
print('Number of constraints =', solver.NumConstraints())
# Objective function: 3x + 4y.
solver.Maximize(3 * x + 4 * y)
# Solve the system.
status = solver.Solve()
if status == pywraplp.Solver.OPTIMAL:
print('Solution:')
print('Objective value =', solver.Objective().Value())
print('x =', x.solution_value())
print('y =', y.solution_value())
else:
print('The problem does not have an optimal solution.')
print('\nAdvanced usage:')
print('Problem solved in %f milliseconds' % solver.wall_time())
print('Problem solved in %d iterations' % solver.iterations())
LinearProgrammingExample()
but instead of optimizing 3x+4y, I would like to optimize 3x**2+4y. How to set the power of x ? I tried x*x, ** or np.power but x is an object. it is not working. any solution ?
>Solution :
In the example you provided, the objective function is being set using the Maximize() method of the solver, which expects a linear expression as its argument. To set the objective function to be 3x^2 + 4y, you will need to create a new expression that represents x^2, and then add that to the existing expression for 4y.
One way to do this is by using the Square() method of the solver to square the variable x, then you can multiply it by 3 and add it to the 4y expression.
Here’s an example of how you can modify the LinearProgrammingExample() function to optimize 3x^2 + 4y:
def LinearProgrammingExample():
"""Linear programming sample."""
# Instantiate a Glop solver, naming it LinearExample.
solver = pywraplp.Solver.CreateSolver('GLOP')
if not solver:
return
# Create the two variables and let them take on any non-negative value.
x = solver.NumVar(0, solver.infinity(), 'x')
y = solver.NumVar(0, solver.infinity(), 'y')
# Constraint 0: x + 2y <= 14.
solver.Add(x + 2 * y <= 14.0)
# Constraint 1: 3x - y >= 0.
solver.Add(3 * x - y >= 0.0)
# Constraint 2: x - y <= 2.
solver.Add(x - y <= 2.0)
# Objective function: 3x^2 + 4y
obj = 3 * solver.Square(x) + 4 * y
solver.Maximize(obj)
# Solve the system.
status = solver.Solve()
if status == pywraplp.Solver.OPTIMAL:
print('Solution:')
print('Objective value =', solver.Objective().Value())
print('x =', x.solution_value())
print('y =', y.solution_value())
else:
print('The problem does not have an optimal solution.')
print('\nAdvanced usage:')
print('Problem solved in %f milliseconds' % solver.wall_time())
print('Problem solved in %d iterations' % solver.iterations())
In this example, I’ve used solver.Square(x) to create a new variable x^2, and multiplied it by 3 to create the objective function. Finally, I used solver.Maximize(obj) to set the objective function to be maximized.
Keep in mind that this may cause some problems in the optimization, as nonlinear objectives can be harder to solve than linear objectives, and the solution may not be optimal, or may not exist at all. And in some cases, it might be better to transform the problem to an equivalent one where it can be linearized.