量子ウォークですでに各方向に重みが定められている場合、以下の通れない道があった場合の対処法で良い案がある方がいらっしゃいましたら、ぜひご教授いただければ幸いなのですが、、、。
問題点
図の3×3の格子上の中央が通れない場合として、毎秒ごとの各点にいる量子の全体の総和の確率を1にちゃんと保存させたいのですが上手くいきません。考えている案は、中央の格子点を飛び越えて例えば、(0,1)→(2,1),(1,2)→(1,0)を繋げてしまって、4方向の重みを等しくしています。ただ、これだと複雑なステージになった場合に、多少コードがめんどくさくなってしまいます。これ以外の方法でさらに良いノウハウがありましたら、是非アドバイスの程お願い致します。
python
1 import itertools 2 import numpy as np 3 import matplotlib.pyplot as plt 4 import math 5 #試行回数 6 itr = 6 7 #格子の大きさ 8 N =3 9 #場合分けのために2進数表示 10 stage =np.array([[1,1,1], 11 [1,0,1], 12 [1,1,1]]) 13 #格子点に対応した状態をセット 14 psi = np.zeros((N,N,4),dtype="float") 15 psi[0,0]=[1,0,0,0] 16 #各場所での確率収納 17 p_map = np.zeros((3,3),dtype="float") 18 #右、左、上、下に移動するときの重み(これは定義されています) 19 C = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]])/2 20 right_m= np.zeros((4,4));right_m[0,:] = C[0,:] #右側に移動するときの重み 21 down_m = np.zeros((4,4));down_m[1,:] = C[1,:] #下 22 left_m = np.zeros((4,4));left_m[2,:] = C[2,:] #左 23 up_m = np.zeros((4,4));up_m[3,:] = C[3,:] #上 24 #x,y軸 25 x_list = [i for i in range(N)] 26 y_list = [i for i in range(N)] 27 #メイン計算 28 for t in range(itr): 29 if t == 0: 30 pass 31 else: 32 #t+1秒後のpsiを収納して、毎回初期化 33 next_psi = np.zeros((N,N,4),dtype="float") 34 for k in itertools.product(x_list,y_list): 35 x = k[0] 36 y = k[1] 37 ####boundary condition#### 38 x0 = (x+1) % N 39 x1 = (x-1 + N) % N 40 y0 = (y+1) % N 41 y1 = (y-1 + N) % N 42 if stage[x,y] == 0: 43 continue 44 elif stage[x0,y]==0 and stage[x,y0]==1 and stage[x,y1]==1 and stage[x1,y]==1: 45 next_psi[x,y] = np.copy(np.array(np.dot(right_m,psi[x1,y]) + np.dot(up_m,psi[x,y1])+np.dot(down_m,psi[x,y0]))) 46 47 elif stage[x0,y]==1 and stage[x,y0]==0 and stage[x,y1]==1 and stage[x1,y]==1: 48 next_psi[x,y] = np.copy(np.array(np.dot(right_m,psi[x1,y]) + np.dot(up_m,psi[x,y1])+np.dot(left_m,psi[x0,y]))) 49 50 elif stage[x0,y]==1 and stage[x,y0]==1 and stage[x,y1]==0 and stage[x1,y]==1: 51 next_psi[x,y] = np.copy(np.array(np.dot(right_m,psi[x1,y]) + np.dot(left_m,psi[x0,y])+np.dot(down_m,psi[x,y0]))) 52 53 elif stage[x0,y]==1 and stage[x,y0]==1 and stage[x,y1]==1 and stage[x1,y]==0: 54 next_psi[x,y] = np.copy(np.array(np.dot(left_m,psi[x0,y]) + np.dot(up_m,psi[x,y1])+np.dot(down_m,psi[x,y0]))) 55 else: 56 next_psi[x,y] = np.copy( np.array( np.dot(right_m,psi[x1,y]) + np.dot(up_m,psi[x,y1]) + np.dot(left_m,psi[x0,y]) + np.dot(down_m,psi[x,y0]))) 57 psi = np.copy(next_psi) 58 ############# 59 for j in itertools.product(x_list,y_list): 60 p_map[j] = np.inner(psi[j],psi[j]) 61 print(t,p_map.sum())
結果が
5 0.875
となってしまい、1に保存しません。
このアイデアとは別で通れない道の上手い対処の仕方がわかる方がいらっしゃいましたら、ぜひご教授下さい。
(壁があった場合のある方向の重みをどう扱うか。。)
*言いたいことは、4方向ランダムウォークの場合の壁にいた場合は、3方向からくるのでそれぞれの重みは1/3で簡単に設計ができるのですが、量子ウォークの場合既に行列を定義してしまっているので、なかなかランダムウォークのように自由度が効かないと思うのですが(少し学術的で申し訳ないです)。つまり全体の確率が1になっていれば、上の図形が保たれるのであれば、どんな歩き方をさせても良いと考えます。
口下手で申し訳ないです。質問、不備、等のご指摘あると思いますのでご指摘等も含めて宜しくお願い致します。
*stackoverflowでも質問しています、ご理解の程宜しくお願い致します
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。