質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

316閲覧

量子ウォークの通れない道があるときの対処法

Fallout_18

総合スコア124

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/09 23:49

編集2018/10/09 23:55

量子ウォークですでに各方向に重みが定められている場合、以下の通れない道があった場合の対処法で良い案がある方がいらっしゃいましたら、ぜひご教授いただければ幸いなのですが、、、。

問題点

stage
図の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でも質問しています、ご理解の程宜しくお願い致します

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました、通れない道があった場合、その方向の重みを足せばよいだけでした。

投稿2018/10/11 04:09

Fallout_18

総合スコア124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問