Openjij チュートリアルをdockerで
https://qiita.com/kaizen_nagoya/items/09a52b25d54091c8db6f
OpenJij チュートリアル
https://openjij.github.io/OpenJijTutorial/_build/html/ja/index.html
第二章の会話入力を一括入力にしようとファイル化。
openjij-ch2.py
import random
import numpy as np
import matplotlib.pyplot as plt
import openjij as oj
# 反強磁性1次元イジングモデル を作る.
N = 30
h = {0: -10}
J = {(i, i+1): 1 for i in range(N-1)}
# 最適解
correct_state = [(-1)**i for i in range(N)]
# TTS を計算するのに必要なp^R
pR = 0.99
# Samplerの引数のstep_num というパラメータに渡すリスト(step_num_list)
# step_num はアニーリング中のパラメータ(温度, 横磁場)を下げていくときの分割数
# なので増やせば増やすほどゆっくりアニーリングすることになってアニーリング時間が伸びる。
step_num_list = [10, 20, 30, 40]
# 各計算時間に対するTTSを格納しておくリスト
TTS_list = []
tau_list = [] # 計算時間を格納しておくリスト
iteration = 2000 # 確率を計算するために1回のアニーリングを行う回数
for step_num in step_num_list:
# beta_max と beta_min はSAのアルゴリズムで使うパラメータ.
# 確率p_sを計算するために500回計算する
sampler = oj.SASampler(beta_max=10.0, beta_min=0.01, step_num=step_num, iteration=iteration)
response = sampler.sample_ising(h, J)
# 返ってきた解であっている状態の数を数えて最適解を得た確率を計算する。
tau = response.info['execution_time']
ps = sum([1 if state == correct_state else 0 for state in response.states])/iteration
# ps=0だとTTSが無限大になってしまうのでそこは回避
if ps == 0:
continue
# TTSを計算する
TTS_list.append(np.log(1-pR)/np.log(1-ps)*tau)
tau_list.append(tau)
plt.plot(tau_list, TTS_list)
plt.xlabel('annealing time')
plt.ylabel('TTS')
result = oj.benchmark(
true_ground_states=[correct_state], ground_energy=0,
solver= lambda time_param, iteration: oj.SASampler(step_num=time_param, iteration=iteration).sample_ising(h,J),
time_param_list=step_num_list,
p_d=0.99
)
fig, (axL,axC,axR) = plt.subplots(ncols=3, figsize=(15,3))
plt.subplots_adjust(wspace=0.4)
fontsize = 10
axL.plot(result['time'], result['tts'])
axL.set_xlabel('annealing time', fontsize=fontsize)
axL.set_ylabel('TTS', fontsize=fontsize)
axC.plot(result['time'], result['e_res'])
axC.set_xlabel('annealing time', fontsize=fontsize)
axC.set_ylabel('Residual energy', fontsize=fontsize)
axR.plot(result['time'], result['error'])
axR.set_xlabel('annealing time', fontsize=fontsize)
axR.set_ylabel('Error probability', fontsize=fontsize)
fig.show()
import time
def anti_ferro_solver(time_param, iteration, h, J):
"""
すべて 1 と [1,-1,1,...] と [-1,1,-1,...] の3つの状態からランダムに選ぶ
"""
# 入力された h と J から添字の集合をつくる
indices = set(h.keys())
indices = list(indices | set([key for keys in J.keys() for key in keys]))
ones_state = list(np.ones(len(indices), dtype=int)) # all 1
minus_plus_state = np.ones(len(indices), dtype=int)
minus_plus_state[::2] *= -1 # -1, 1, -1, 1, ...
plus_minus_state = -1 * minus_plus_state # 1, -1, 1, -1
start = time.time()
_states = [ones_state, list(minus_plus_state), list(plus_minus_state)]
state_record = [_states[np.random.randint(3)] for _ in range(iteration)] # 3つの状態からランダムにひとつ選ぶ
exec_time = (time.time()-start) * 10**6 * time_param # 適当に計算時間を伸ばしておきます
energies = [sum(state) for state in state_record] # エネルギーの計算はてきとうです
# Responseクラスに状態とエネルギーを格納します
response = oj.Response(indices=indices, var_type='SPIN')
response.update_ising_states_energies(state_record, energies)
response.info['execution_time'] = exec_time
return response
result = oj.benchmark(
true_ground_states=[correct_state], ground_energy=0,
solver= lambda time_param, iteration: anti_ferro_solver(time_param, iteration, h, J),
time_param_list=step_num_list,
iteration=100,
p_d=0.99
)
fig, (axL,axC,axR) = plt.subplots(ncols=3, figsize=(15,3))
plt.subplots_adjust(wspace=0.4)
fontsize = 10
axL.plot(result['time'], result['tts'])
axL.set_xlabel('annealing time', fontsize=fontsize)
axL.set_ylabel('TTS', fontsize=fontsize)
axC.plot(result['time'], result['e_res'])
axC.set_xlabel('annealing time', fontsize=fontsize)
axC.set_ylabel('Residual energy', fontsize=fontsize)
axR.plot(result['time'], result['error'])
axR.set_xlabel('annealing time', fontsize=fontsize)
axR.set_ylabel('Error probability', fontsize=fontsize)
fig.show()
次のエラーが出た。複写間違いかも。
なぜか[7]が見当たらない。
ubuntu
# python3 openjij-ch2.py
Traceback (most recent call last):
File "openjij-ch2.py", line 1, in <module>
fig, (axL,axC,axR) = plt.subplots(ncols=3, figsize=(15,3))
NameError: name 'plt' is not defined
参考資料
文書履歴(document history)
ver. 0.01 初稿 20190717
ver. 0.01 初稿 20230311
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.