Simulated annealing helps find the best answer when there are many possibilities. It tries different solutions and slowly focuses on the best one.
Simulated annealing (dual_annealing) 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 dual_annealing result = dual_annealing(func, bounds) # func: function to minimize # bounds: list of (min, max) tuples for each variable
The func should take a list or array and return a number to minimize.
bounds define the search space for each variable.
Examples
SciPy
def f(x): return (x[0] - 1)**2 + (x[1] + 2)**2 bounds = [(-5, 5), (-5, 5)] result = dual_annealing(f, bounds) print(result.x, result.fun)
SciPy
def sphere(x): return sum(xi**2 for xi in x) bounds = [(-10, 10)] * 3 result = dual_annealing(sphere, bounds) print(result.x, result.fun)
Sample Program
This program finds the minimum of a simple 2D function using simulated annealing. It searches between -10 and 10 for both variables.
SciPy
from scipy.optimize import dual_annealing def objective(x): # Simple function with minimum at (3, -1) return (x[0] - 3)**2 + (x[1] + 1)**2 bounds = [(-10, 10), (-10, 10)] result = dual_annealing(objective, bounds) print(f"Best solution: {result.x}") print(f"Minimum value: {result.fun}")
Important Notes
Simulated annealing can find good solutions even if the problem has many local minima.
Results may slightly vary each run because of randomness.
Set bounds carefully to limit the search space and speed up the process.
Summary
Simulated annealing tries many solutions and slowly focuses on the best one.
Use dual_annealing from scipy.optimize to minimize functions with bounds.
It works well for complex problems with many possible answers.
Practice
1. What is the main purpose of using
dual_annealing in scipy.optimize?easy
Solution
Step 1: Understand the purpose of dual_annealing
dual_annealingis an optimization method used to find the minimum of a function, especially when the function is complex and has many local minima.Step 2: Identify the correct use case
Among the options, only finding the minimum value of a function within bounds matches the purpose ofdual_annealing.Final Answer:
To find the minimum value of a function within given bounds -> Option AQuick Check:
Optimization = Find minimum [OK]
Hint: dual_annealing is for minimizing functions with bounds [OK]
Common Mistakes:
- Confusing optimization with sorting or statistics
- Thinking dual_annealing generates random numbers
- Assuming it calculates averages
2. Which of the following is the correct way to import
dual_annealing from scipy.optimize?easy
Solution
Step 1: Recall Python import syntax
The correct syntax to import a function from a module isfrom module import function.Step 2: Match syntax to options
from scipy.optimize import dual_annealing matches the correct syntax:from scipy.optimize import dual_annealing. Other options have incorrect syntax.Final Answer:
from scipy.optimize import dual_annealing -> Option AQuick Check:
Correct import syntax = from scipy.optimize import dual_annealing [OK]
Hint: Use 'from module import function' to import dual_annealing [OK]
Common Mistakes:
- Using 'import function from module' which is invalid
- Trying to import submodules incorrectly
- Using dot notation in import statements wrongly
3. What will be the output of the following code snippet?
from scipy.optimize import dual_annealing
def f(x):
return (x[0] - 3)**2 + (x[1] + 1)**2
bounds = [(-5, 5), (-5, 5)]
result = dual_annealing(f, bounds)
print(round(result.fun, 2))medium
Solution
Step 1: Understand the function and bounds
The functionf(x)calculates the sum of squares of(x[0]-3)and(x[1]+1). The minimum is atx[0]=3andx[1]=-1, where the function value is 0.Step 2: dual_annealing finds the minimum within bounds
The bounds allowx[0]=3andx[1]=-1. So the optimizer should find the minimum function value close to 0. The print statement rounds the result to 2 decimals.Final Answer:
0.00 -> Option BQuick Check:
Minimum value = 0.00 [OK]
Hint: Minimum of squared distance function is zero at target point [OK]
Common Mistakes:
- Assuming the minimum is outside bounds
- Confusing function value with input values
- Expecting an error due to function shape
4. Identify the error in the following code using
dual_annealing:
from scipy.optimize import dual_annealing
def f(x):
return x**2
bounds = [(-2, 2)]
result = dual_annealing(f, bounds)
print(result.x)medium
Solution
Step 1: Check function input type
dual_annealingpasses an array (even if one variable), butf(x)expects a scalarx. This mismatch causes an error.Step 2: Verify bounds and imports
Bounds as a list of tuples is correct.dual_annealingrequires bounds. No numpy import needed here.Final Answer:
Function f expects a scalar but dual_annealing passes an array -> Option CQuick Check:
Function input type mismatch = Function f expects a scalar but dual_annealing passes an array [OK]
Hint: dual_annealing passes array input; function must accept array [OK]
Common Mistakes:
- Assuming bounds format is wrong
- Thinking numpy import is mandatory here
- Ignoring input type mismatch
5. You want to minimize the function
f(x) = (x[0]-2)^2 + (x[1]-3)^2 but only allow x[0] between 0 and 1, and x[1] between 2 and 4. Which code correctly uses dual_annealing to find the minimum within these bounds?hard
Solution
Step 1: Understand the function and bounds
The function minimum is atx[0]=2,x[1]=3. But bounds restrictx[0]to [0,1] andx[1]to [2,4]. So the optimizer must search within these bounds.Step 2: Check code options for correct bounds and usage
The codebounds = [(0, 1), (2, 4)] result = dual_annealing(f, bounds)correctly sets bounds as [(0,1), (2,4)] and passes them todual_annealing. The codebounds = [(2, 3), (3, 4)] result = dual_annealing(f, bounds)has wrong bounds. The codebounds = [(0, 2), (2, 3)] result = dual_annealing(f, bounds)has wrong bounds. The codebounds = [(0, 1), (2, 4)] result = dual_annealing(f)misses bounds argument.Final Answer:
bounds = [(0, 1), (2, 4)] result = dual_annealing(f, bounds) -> Option DQuick Check:
Correct bounds and function call = bounds = [(0, 1), (2, 4)] result = dual_annealing(f, bounds) [OK]
Hint: Bounds must match variable limits and be passed to dual_annealing [OK]
Common Mistakes:
- Using wrong bounds that exclude minimum
- Not passing bounds argument to dual_annealing
- Confusing variable order in bounds
