def search(problem, step, treshold):
    time = 0
    current_node = Node(problem.get_initial_state())
    while True:
        T = cooling_rate(time)
        if T < treshold:
            return current_node
        adjacents = current_node.get_adjacents(step)
        next = random.choice(adjacents)
        value_difference = problem.find_value(next.state) - problem.find_value(
            current_node.state)
        if value_difference > 0:
            current_node = next
        else:
            prob = math.exp(value_difference / T)
            if random.random() <= prob:
                current_node = next
        time += 1