Sharedor-tools.ipynbOpen in CoCalc
Author: Harald Schilly
Views : 13

OR-Tools on CoCalc

OR-Tools is fast and portable software for combinatorial optimization.

Kernel: Python 3 system-wide

https://developers.google.com/optimization

In [1]:
# example taken from https://developers.google.com/optimization/lp/glop # showcases that Google's GLOP solver works
In [2]:
from ortools.linear_solver import pywraplp # Instantiate a Glop solver, naming it LinearExample. solver = pywraplp.Solver('LinearProgrammingExample', pywraplp.Solver.GLOP_LINEAR_PROGRAMMING) # 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. constraint0 = solver.Constraint(-solver.infinity(), 14) constraint0.SetCoefficient(x, 1) constraint0.SetCoefficient(y, 2) # Constraint 1: 3x - y >= 0. constraint1 = solver.Constraint(0, solver.infinity()) constraint1.SetCoefficient(x, 3) constraint1.SetCoefficient(y, -1) # Constraint 2: x - y <= 2. constraint2 = solver.Constraint(-solver.infinity(), 2) constraint2.SetCoefficient(x, 1) constraint2.SetCoefficient(y, -1) # Objective function: 3x + 4y. objective = solver.Objective() objective.SetCoefficient(x, 3) objective.SetCoefficient(y, 4) objective.SetMaximization() # Solve the system. solver.Solve() opt_solution = 3 * x.solution_value() + 4 * y.solution_value() print('Number of variables =', solver.NumVariables()) print('Number of constraints =', solver.NumConstraints()) # The value of each variable in the solution. print('Solution:') print('x = ', x.solution_value()) print('y = ', y.solution_value()) # The objective value of the solution. print('Optimal objective value =', opt_solution)
Number of variables = 2 Number of constraints = 3 Solution: x = 5.999999999999998 y = 3.9999999999999996 Optimal objective value = 33.99999999999999
In [5]:
import numpy as np assert np.allclose(6, x.solution_value()) assert np.allclose(4, y.solution_value()) assert np.allclose(34, opt_solution)
In [6]:
from ortools.linear_solver import pywraplp # Create the mip solver with the CBC backend. solver = pywraplp.Solver('simple_mip_program', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING) infinity = solver.infinity() # x and y are integer non-negative variables. x = solver.IntVar(0.0, infinity, 'x') y = solver.IntVar(0.0, infinity, 'y') print('Number of variables =', solver.NumVariables()) # x + 7 * y <= 17.5. solver.Add(x + 7 * y <= 17.5) # x <= 3.5. solver.Add(x <= 3.5) print('Number of constraints =', solver.NumConstraints()) # Maximize x + 10 * y. solver.Maximize(x + 10 * y) result_status = solver.Solve() # The problem has an optimal solution. assert result_status == pywraplp.Solver.OPTIMAL # The solution looks legit (when using solvers others than # GLOP_LINEAR_PROGRAMMING, verifying the solution is highly recommended!). assert solver.VerifySolution(1e-7, True) print('Solution:') print('Objective value =', solver.Objective().Value()) print('x =', x.solution_value()) print('y =', y.solution_value()) print('\nAdvanced usage:') print('Problem solved in %f milliseconds' % solver.wall_time()) print('Problem solved in %d iterations' % solver.iterations()) print('Problem solved in %d branch-and-bound nodes' % solver.nodes())
Number of variables = 2 Number of constraints = 2 Solution: Objective value = 23.0 x = 3.0 y = 2.0 Advanced usage: Problem solved in 15.000000 milliseconds Problem solved in 1 iterations Problem solved in 0 branch-and-bound nodes
In [ ]: