Thought it’d be fun to try simulated annealing on the maximum digit sum for ab for a, b ≤ K. In the above diagram K = 100, hence giving a discrete search space of 10,000 values.

Though it is quite easy to brute force search the digit sum, simulated annealing offers a more scalable solution for large K. Below is an implementation in Python:

```
def digit_sum(number):
s = 0
while number:
s += number % 10
number /= 10
return s

def compute_energy(base, exponent):
return -(digit_sum(base ** exponent))

def simulated_annealing(start_temp, cooling_rate, max_base, max_exponent, max_iter):
initial_base = np.random.randint(1, max_base + 1)
initial_exponent = np.random.randint(1, max_exponent + 1)
initial_energy = compute_energy(initial_base, initial_exponent)
iter = 0
while iter < max_iter:
new_base = np.random.randint(1, max_base + 1)
new_exponent = np.random.randint(1, max_exponent + 1)
new_energy = compute_energy(new_base, new_exponent)
if new_energy < initial_energy:
initial_energy = new_energy
start_temp *= (1 - cooling_rate)
elif new_energy == initial_energy:
start_temp *= (1 - cooling_rate / 5)
elif new_energy > initial_energy:
if np.exp((initial_energy - new_energy) / start_temp) > np.random.random():
initial_energy = new_energy
start_temp *= (1 - cooling_rate)
else:
start_temp *= (1 - cooling_rate / 5)
iter += 1
return -(initial_energy)

```