Linear programming helps find the best solution when you want to maximize or minimize something, like cost or profit, under certain limits.
Linear programming (linprog) in SciPy
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
SciPy
from scipy.optimize import linprog result = linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='highs')
c is the coefficients of the objective function to minimize.
A_ub and b_ub define inequality constraints (A_ub * x ≤ b_ub).
Examples
SciPy
from scipy.optimize import linprog c = [-1, -2] result = linprog(c)
SciPy
c = [-1, -2] A_ub = [[2, 1], [1, 1]] b_ub = [20, 16] result = linprog(c, A_ub=A_ub, b_ub=b_ub)
SciPy
c = [3, 2] A_eq = [[1, 1]] b_eq = [10] bounds = [(0, None), (0, None)] result = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds)
Sample Program
This program finds the values of x and y that minimize the cost 3x + 4y while keeping within the limits 2x + y ≤ 14 and x + 2y ≤ 14, with x and y not negative.
SciPy
from scipy.optimize import linprog # Objective: minimize cost = 3x + 4y c = [3, 4] # Constraints: # 2x + y <= 14 # x + 2y <= 14 A_ub = [[2, 1], [1, 2]] b_ub = [14, 14] # x and y must be >= 0 bounds = [(0, None), (0, None)] result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs') if result.success: print(f"Optimal value: {result.fun}") print(f"x = {result.x[0]}") print(f"y = {result.x[1]}") else: print("No solution found")
Important Notes
Always check result.success to confirm a solution was found.
Use bounds to set limits on variables, like non-negativity.
The method='highs' is recommended for better performance and accuracy.
Summary
Linear programming finds the best solution under limits.
Use linprog from scipy.optimize to solve these problems.
Define the objective, constraints, and variable bounds clearly.
Practice
1. What is the main purpose of the
linprog function in scipy.optimize?easy
Solution
Step 1: Understand the purpose of linear programming
Linear programming is used to find the best (optimal) solution under given linear constraints and objectives.Step 2: Identify what
Thelinprogdoeslinprogfunction inscipy.optimizesolves linear programming problems by minimizing a linear objective function subject to linear constraints.Final Answer:
To find the best solution for a problem with linear constraints and objective -> Option AQuick Check:
Purpose oflinprog= find best solution [OK]
Hint: Remember: linprog solves linear optimization problems [OK]
Common Mistakes:
- Confusing linprog with plotting functions
- Thinking linprog handles nonlinear problems
- Assuming linprog generates random data
2. Which of the following is the correct way to import the
linprog function from scipy.optimize?easy
Solution
Step 1: Recall Python import syntax
To import a specific function from a module, usefrom module import function.Step 2: Apply to
The correct syntax islinproginscipy.optimizefrom scipy.optimize import linprog.Final Answer:
from scipy.optimize import linprog -> Option DQuick Check:
Correct import syntax = from scipy.optimize import linprog [OK]
Hint: Use 'from module import function' to import specific functions [OK]
Common Mistakes:
- Using 'import linprog from ...' which is invalid syntax
- Trying to import submodules as functions
- Using dot notation incorrectly in import statements
3. What will be the output of the following code snippet?
from scipy.optimize import linprog c = [-1, -2] A = [[2, 1], [1, 1]] b = [20, 16] res = linprog(c, A_ub=A, b_ub=b) print(res.x.round(2))
medium
Solution
Step 1: Understand the problem setup
The objective is to minimize -1*x1 - 2*x2, which is equivalent to maximizing x1 + 2*x2, with constraints 2*x1 + x2 <= 20 and x1 + x2 <= 16.Step 2: Solve constraints to find feasible maximum
The feasible region vertices include (10,0), which maximizes the objective (x1 + 2*x2 = 10) and satisfies both constraints (2*10 + 0 = 20 <= 20, 10 + 0 = 10 <= 16). Thus res.x.round(2) prints [10. 0.].Final Answer:
[10. 0.] -> Option BQuick Check:
Optimal solution = [10, 0] [OK]
Hint: Remember: linprog minimizes; negate objective to maximize [OK]
Common Mistakes:
- Forgetting linprog minimizes, not maximizes
- Mixing up constraint inequalities
- Ignoring variable bounds defaulting to non-negative
4. Identify the error in this code snippet that uses
linprog:from scipy.optimize import linprog c = [1, 2] A = [[-1, 1], [3, 4]] b = [1, 12] res = linprog(c, A_eq=A, b_eq=b) print(res.success)
medium
Solution
Step 1: Check constraint type usage
The code usesA_eqandb_eq, which define equality constraints, but the constraints given are inequalities (e.g., -1*x1 + x2 <= 1).Step 2: Correct constraint parameter
For inequality constraints,A_ubandb_ubshould be used instead ofA_eqandb_eq.Final Answer:
UsingA_eqwith inequality constraints instead ofA_ub-> Option CQuick Check:
Use A_ub for inequalities, A_eq for equalities [OK]
Hint: Use A_ub for inequalities, A_eq for equalities [OK]
Common Mistakes:
- Confusing equality and inequality constraint parameters
- Assuming linprog automatically detects constraint types
- Ignoring error messages about constraint shapes
5. You want to minimize the cost function
-
-
-
Which is the correct way to set up the
3x + 4y subject to constraints:-
x + 2y ≥ 8-
3x + y ≤ 15-
x, y ≥ 0Which is the correct way to set up the
linprog call in Python?hard
Solution
Step 1: Convert constraints to ≤ form for linprog
linprog requires constraints as A_ub * x ≤ b_ub. The first constraint x + 2y ≥ 8 can be rewritten as -x - 2y ≤ -8. The second constraint 3x + y ≤ 15 stays as is.Step 2: Set up matrices and bounds correctly
So A_ub = [[-1, -2], [-3, -1]], b_ub = [-8, -15]. Bounds for x and y are (0, None) each, so use bounds=[(0, None), (0, None)].Step 3: Match options to correct setup
c = [3, 4]; A_ub = [[-1, -2], [-3, -1]]; b_ub = [-8, -15]; res = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=[(0, None), (0, None)]) matches this setup exactly.Final Answer:
c = [3, 4]; A_ub = [[-1, -2], [-3, -1]]; b_ub = [-8, -15]; res = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=[(0, None), (0, None)]) -> Option AQuick Check:
Rewrite ≥ as negative ≤ and set bounds as list of tuples [OK]
Hint: Rewrite ≥ constraints as negative ≤ for linprog [OK]
Common Mistakes:
- Not converting ≥ constraints to ≤ form
- Using single tuple for bounds instead of list of tuples
- Mixing signs in constraint matrices
