Bird
Raised Fist0
SciPydata~10 mins

Linear programming (linprog) in SciPy - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Linear programming (linprog)
Define objective function coefficients c
Define inequality constraints A_ub and b_ub
Define equality constraints A_eq and b_eq (optional)
Call linprog solver with inputs
Solver finds optimal solution x
Check solver success and output results
Linear programming solves a problem by defining an objective and constraints, then finding the best solution using linprog.
Execution Sample
SciPy
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)
This code finds values for two variables that maximize the objective under given constraints.
Execution Table
StepActionInput/ConditionResult/Output
1Define objective coefficients cc = [-1, -2]Objective: minimize -1*x1 - 2*x2
2Define inequality constraints A_ub and b_ubA = [[2,1],[1,1]], b = [20,16]Constraints: 2x1 + x2 <= 20, x1 + x2 <= 16
3Call linprog solverlinprog(c, A_ub=A, b_ub=b)Solver starts optimization
4Solver iterates to find feasible solutionChecking constraints and objectiveIntermediate solutions tested
5Solver finds optimal solutionOptimal x foundx = [0.0, 16.0]
6Check solver successres.success == TrueOptimization successful
7Print solutionprint(res.x)[0.0, 16.0]
8ExitOptimization completeBest solution found within constraints
💡 Solver stops after finding optimal solution that satisfies all constraints.
Variable Tracker
VariableStartAfter Step 3After Step 5Final
c[-1, -2][-1, -2][-1, -2][-1, -2]
A[[2,1],[1,1]][[2,1],[1,1]][[2,1],[1,1]][[2,1],[1,1]]
b[20,16][20,16][20,16][20,16]
res.xNoneNone[0.0, 16.0][0.0, 16.0]
res.successNoneNoneTrueTrue
Key Moments - 3 Insights
Why are the coefficients in c negative when we want to maximize?
linprog only minimizes, so to maximize we minimize the negative of the objective. See Step 1 and Step 3 in execution_table.
What does A_ub and b_ub represent in the problem?
They represent inequality constraints of the form A_ub * x <= b_ub. This is shown in Step 2 where constraints are defined.
How do we know the solver found a valid solution?
res.success is True as shown in Step 6, indicating the solver found a solution meeting all constraints.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at Step 5, what is the value of res.x?
A[10.0, 5.0]
B[0.0, 16.0]
C[8.0, 8.0]
D[5.0, 10.0]
💡 Hint
Check the 'Result/Output' column at Step 5 in execution_table.
At which step does the solver confirm the optimization was successful?
AStep 6
BStep 4
CStep 3
DStep 7
💡 Hint
Look for 'res.success == True' in the execution_table.
If we change c to [1, 2] instead of [-1, -2], what happens to the optimization goal?
AIt still maximizes the original objective
BIt maximizes the negative objective
CIt minimizes the original objective
DIt minimizes the negative objective
💡 Hint
Recall linprog minimizes the objective; changing sign changes maximize to minimize.
Concept Snapshot
Linear programming with linprog:
- Define objective coefficients c (minimize c·x)
- Define inequality constraints A_ub·x <= b_ub
- Optionally define equality constraints A_eq·x = b_eq
- Call linprog(c, A_ub=A_ub, b_ub=b_ub)
- Check res.success and res.x for solution
- To maximize, minimize negative objective
Full Transcript
Linear programming uses linprog to find the best values for variables that minimize an objective function while respecting constraints. We start by defining the objective coefficients as c, constraints as A_ub and b_ub, then call linprog. The solver tries different values to find the minimum of c·x that satisfies constraints. Since linprog only minimizes, to maximize we use negative coefficients. The solver returns res.x with the best solution and res.success to confirm success. This step-by-step process helps understand how linprog works.

Practice

(1/5)
1. What is the main purpose of the linprog function in scipy.optimize?
easy
A. To find the best solution for a problem with linear constraints and objective
B. To perform nonlinear regression analysis
C. To generate random linear equations
D. To plot linear graphs

Solution

  1. Step 1: Understand the purpose of linear programming

    Linear programming is used to find the best (optimal) solution under given linear constraints and objectives.
  2. Step 2: Identify what linprog does

    The linprog function in scipy.optimize solves linear programming problems by minimizing a linear objective function subject to linear constraints.
  3. Final Answer:

    To find the best solution for a problem with linear constraints and objective -> Option A
  4. Quick Check:

    Purpose of linprog = 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
A. import scipy.optimize.linprog
B. import linprog from scipy.optimize
C. from scipy import linprog.optimize
D. from scipy.optimize import linprog

Solution

  1. Step 1: Recall Python import syntax

    To import a specific function from a module, use from module import function.
  2. Step 2: Apply to linprog in scipy.optimize

    The correct syntax is from scipy.optimize import linprog.
  3. Final Answer:

    from scipy.optimize import linprog -> Option D
  4. Quick 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
A. [0. 0.]
B. [10. 0.]
C. [8. 8.]
D. [0. 16.]

Solution

  1. 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.
  2. 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.].
  3. Final Answer:

    [10. 0.] -> Option B
  4. Quick 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
A. Objective coefficients should be negative to minimize
B. Missing variable bounds argument
C. Using A_eq with inequality constraints instead of A_ub
D. Incorrect import statement

Solution

  1. Step 1: Check constraint type usage

    The code uses A_eq and b_eq, which define equality constraints, but the constraints given are inequalities (e.g., -1*x1 + x2 <= 1).
  2. Step 2: Correct constraint parameter

    For inequality constraints, A_ub and b_ub should be used instead of A_eq and b_eq.
  3. Final Answer:

    Using A_eq with inequality constraints instead of A_ub -> Option C
  4. Quick 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 3x + 4y subject to constraints:
- x + 2y ≥ 8
- 3x + y ≤ 15
- x, y ≥ 0
Which is the correct way to set up the linprog call in Python?
hard
A. 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)])
B. 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))
C. 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))
D. 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)])

Solution

  1. 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.
  2. 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)].
  3. 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.
  4. 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 A
  5. Quick 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