GoogleのCirqのチュートリアルに記載されている、2Dの+/-イジングモデルの問題を解いてみる。
Tutorial — Cirq 0.1 documentation
前回まででイジングモデルを使ってシミュレーションが完成したので、次はパラメータを動かして、最小のエネルギーになるパラメータを探索する。
具体的には を0.0から1.0の間で0.2ずつ動かして、最小になる場所を探す。
h, jr, jc = random_instance(length) print('transverse fields: {}'.format(h)) print('row j fields: {}'.format(jr)) print('column j fields: {}'.format(jc)) min_val = 100.0 min_alpha = 0.0 min_beta = 0.0 min_gamma = 0.0 for alpha in np.arange(0.0, 1.0, 0.2): for beta in np.arange (0.0, 1.0, 0.2): for gamma in np.arange (0.0, 1.0, 0.2): qbit.clean() one_step(h, jr, jc, alpha, beta, gamma) energy_hist = collections.Counter() func = energy_func(3, h, jr, jc) for i in range(0, 1000): bits = [0 for i in range(length * length)] val = 0 for idx in range(length * length): bits[idx] = qbit.val(qubits[idx]) val = (val << 1) | bits[idx] val = func(bits) energy_hist[val] += 1 obj_value = obj_func(energy_hist) print('{}, {}, {} : Value of the objective function {}'.format(alpha, beta, gamma, obj_value)) if obj_value < min_val: min_val = obj_value min_alpha = alpha min_beta = beta min_gamma = gamma print('{}, {}, {} : Minimum Value of the objective function {}'.format(min_alpha, min_beta, min_gamma, min_val))
シミュレーションしてみる。
$ ./qbit_simulator ../test/test_cirq_tutorial.py transverse fields: [[1, -1, -1], [-1, 1, -1], [1, -1, -1]] row j fields: [[1, -1, 1], [1, 1, -1]] column j fields: [[-1, 1], [-1, -1], [-1, 1]] 0.0, 0.0, 0.0 : Value of the objective function -3.0 0.0, 0.0, 0.2 : Value of the objective function -3.0 0.0, 0.0, 0.4 : Value of the objective function -3.0 0.0, 0.0, 0.6000000000000001 : Value of the objective function -3.0 0.0, 0.0, 0.8 : Value of the objective function -3.0 0.0, 0.2, 0.0 : Value of the objective function -3.0 0.0, 0.2, 0.2 : Value of the objective function -3.0 0.0, 0.2, 0.4 : Value of the objective function -3.0 0.0, 0.2, 0.6000000000000001 : Value of the objective function -3.0 0.0, 0.2, 0.8 : Value of the objective function -3.0 ... 0.8, 0.6000000000000001, 0.0 : Value of the objective function 2.44 0.8, 0.6000000000000001, 0.2 : Value of the objective function 2.404 0.8, 0.6000000000000001, 0.4 : Value of the objective function 2.416 0.8, 0.6000000000000001, 0.6000000000000001 : Value of the objective function 2.328 0.8, 0.6000000000000001, 0.8 : Value of the objective function 2.438 0.8, 0.8, 0.0 : Value of the objective function 2.402 0.8, 0.8, 0.2 : Value of the objective function 2.432 0.8, 0.8, 0.4 : Value of the objective function 2.412 0.8, 0.8, 0.6000000000000001 : Value of the objective function 2.414 0.8, 0.8, 0.8 : Value of the objective function 2.518 0.0, 0.0, 0.0 : Minimum Value of the objective function -3.0
イジングモデルによって結果は変わるのだが、今回の場合は最小のエネルギーは-3.0になった。たぶん動いていると思う。