-
Notifications
You must be signed in to change notification settings - Fork 0
/
comparison.py
56 lines (42 loc) · 1.92 KB
/
comparison.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import numpy as np
from itertools import product
from sim_anneal.anneal import Anneal
from sim_quantum_anneal.hamiltonian import HamiltonianSQA
from sim_quantum_anneal.problems import ising_couplings
from sim_quantum_anneal.quantum_anneal import QuantumAnneal
from sim_anneal.plot import plot_energy
from sim_quantum_anneal.plot import plot_energy_trotter_min, plot_energy_trotter_range
# Variables in our problem
N = 40
# Random couplings and external force
r = lambda: np.random.random()
J = np.zeros(shape=(N, N))
for i, j in product(range(N), range(N)):
J[i, j] = r() * 2 - 1 if r() < 0.5 and i != j else 0
def neighbour(sigma):
flip = np.ones(shape=(N,), dtype=int)
flip[np.random.randint(low=0, high=N)] = -1
return sigma * flip
problem_func = lambda state: ising_couplings(J=J, state=state)
# SIMULATED ANNEAL
simulation = Anneal(s_0=np.random.choice([-1, 1], size=N),
k_max=2000,
neighbour_func=neighbour,
energy_func=problem_func)
sa_solution, sa_history = simulation.simulate()
# SIMULATED QUANTUM ANNEAL
T = 0.1 # Ambient temperature
sqa = QuantumAnneal(hamiltonian=HamiltonianSQA(optimise=problem_func, T=T),
N=N,
P=20,
T=T, T_pre=2, T_n_steps=2,
gamma_start=10.0, gamma_end=0.001, gamma_n_steps=20)
energy, state, pre_history, sqa_history = sqa.simulate(pre_anneal=False)
print('Comparison Finished:')
print('SA', problem_func(sa_solution), sa_solution)
print('SQA', problem_func(state), state)
# plotting energy over time
plot_energy(energy_func=problem_func, history=sa_history, method="Simulated Annealing")
plot_energy(energy_func=problem_func, history=pre_history, method="Pre-Anneal")
plot_energy_trotter_min(energy_func=problem_func, history=sqa_history, method="Simulated Quantum Annealing")
plot_energy_trotter_range(energy_func=problem_func, history=sqa_history, method='SQA')