# Simulated annealing Algorithm

Hello, I am trying to implement a basic simulated annealing Algorithm and test it on some benchmarks but when I test it on Rosenbrock Function I got some errors ( MethodError: objects of type Int64 are not callable ) any help ?

``````function simulated_annealing(cost,
s0,
neighbor,
temperature,
iterations,
keep_best,
trace)

# Set our current state to the specified intial state.
s = s0

# Set the best state we've seen to the intial state.
best_s = s0

# We always perform a fixed number of iterations.
for i = 1:iterations
t = temperature(i)
s_n = neighbor(s)
if trace println("\$i: s = \$s") end
if trace println("\$i: s_n = \$s_n") end
y = cost(s)
y_n = cost(s_n)
if trace println("\$i: y = \$y") end
if trace println("\$i: y_n = \$y_n") end
if y_n <= y
s = s_n
if trace println("Accepted") end
else
p = exp(- ((y_n - y) / t))
if trace println("\$i: p = \$p") end
if rand() <= p
s = s_n
if trace println("Accepted") end
else
s = s
if trace println("Rejected") end
end
end
if trace println() end
if cost(s) < cost(best_s)
best_s = s
end
end

if keep_best
best_s
else
s
end
end
``````

Function to test :

``````function rosenbrock(x, y)
(1 - x)^2 + 100(y - x^2)^2
end

function neighbors(z)
[rand_uniform(z[1] - 1, z[1] + 1), rand_uniform(z[2] - 1, z[2] + 1)]
end

solution = simulated_annealing(z -> rosenbrock(z[1], z[2]),
[0, 0],
neighbors,
1,
10000,
true,
false)
``````

You call `simulated_annealing` with parameter `temperatur = 1::Int64` and therefore this line

``````t = temperature(i)
``````

creates the error.

I got it . but i tried to use log_temperature before and it doesn’t work .

I mean i tried it in this way

``````load("simulated_annealing.jl")

function rosenbrock(x, y)
(1 - x)^2 + 100(y - x^2)^2
end

function neighbors(z)
[rand_uniform(z[1] - 1, z[1] + 1), rand_uniform(z[2] - 1, z[2] + 1)]
end

srand(1)

solution = simulated_annealing(z -> rosenbrock(z[1], z[2]),
[0, 0],
neighbors,
log_temperature,
10000,
true,
false)
``````

And what is `log_temperature` ?

1 / log(t)

I would prefer code as explanation, for copy&paste.
I have to guess that

``````log_temperature(t) = 1 / log(t)
``````

and how you call `simulated_annealing` now. Please a MWE: Please read: make it easier to help you!

Yes this is what i mean

``````load("simulated_annealing.jl")

function rosenbrock(x, y)
(1 - x)^2 + 100(y - x^2)^2
end

function neighbors(z)
[rand_uniform(z[1] - 1, z[1] + 1), rand_uniform(z[2] - 1, z[2] + 1)]
end

srand(1)
log_temperature(t) = 1 / log(t)
solution = simulated_annealing(z -> rosenbrock(z[1], z[2]),
[0, 0],
neighbors,
log_temperature,
10000,
true,
false)
``````

Can you just put all the code into one nice big textfile
so that we can run your code to see what error message you get?
This will make it easy for us to debug your program.

We are tired of guessing.

1 Like

`ERROR: UndefVarError: rand_uniform not defined`

You have something for that for me to copy/paste?

``````function simulated_annealing(cost,
s0,
neighbor,
temperature,
iterations,
keep_best,
trace)

# Set our current state to the specified intial state.
s = s0

# Set the best state we've seen to the intial state.
best_s = s0

# We always perform a fixed number of iterations.
for i = 1:iterations
t = temperature(i)
s_n = neighbor(s)
if trace println("\$i: s = \$s") end
if trace println("\$i: s_n = \$s_n") end
y = cost(s)
y_n = cost(s_n)
if trace println("\$i: y = \$y") end
if trace println("\$i: y_n = \$y_n") end
if y_n <= y
s = s_n
if trace println("Accepted") end
else
p = exp(- ((y_n - y) / t))
if trace println("\$i: p = \$p") end
if rand() <= p
s = s_n
if trace println("Accepted") end
else
s = s
if trace println("Rejected") end
end
end
if trace println() end
if cost(s) < cost(best_s)
best_s = s
end
end

if keep_best
best_s
else
s
end
end
``````
``````# Find a solution of the Rosenbrock function using SA.

function rosenbrock(x, y)
(1 - x)^2 + 100(y - x^2)^2
end

function neighbors(z)
[rand_uniform(z[1] - 1, z[1] + 1), rand_uniform(z[2] - 1, z[2] + 1)]
end

srand(1)
log_temperature(t) = 1 / log(t)
solution = simulated_annealing(z -> rosenbrock(z[1], z[2]),
[0, 0],
neighbors,
log_temperature,
10000,
true,
false)
``````

Yes, sorry i thought that you just need the code and you will test. yes i got this error

Exactly, I need the code for `rand_uniform`. It’s not defined and not part of `Random`.

If your question is “why this error?” than: because its not defined.

The error is in your definition of Rosenbrock. `100(y - x^2)^2` this is interpreted as calling a function called 100. You can write it as `100*(y - x^2)^2`

Actually, no. In Julia, this is interpreted as multiplication, since `100` cannot be a function name.

3 Likes