for i in range(1, N+1): #行動1→行動0への変更 m_i = i / N #行動 1 をとっているプレイヤーとマッチする確率,行動1の人が選ばれる確率 ratio = np.array([1-m_i, m_i]) exp = np.dot(profit_A, ratio) if exp[0] > exp[1]: #行動0が最適反応のとき p[i][i-1] = m_i*((1.0-epsilon) + epsilon*0.5) # p[i][i-1] x_0が1減少するマスの確率 else: p[i][i-1] = m_i*(epsilon*0.5) for i in range(N): #行動0→行動1への変更 m_i = i / N ratio = np.array([1-m_i, m_i]) exp = np.dot(profit_A, ratio) if exp[0] < exp[1]: p[i][i+1] = (1-m_i)*((1-epsilon) + epsilon*0.5) else: p[i][i+1] = (1-m_i)*(epsilon*0.5) for i in range(1, N): #行動を変えない p[i][i] = 1 - p[i][i-1] - p[i][i+1] #上からもれたマス p[0][0] = 1 - p[0][1] p[N][N] = 1 - p[N][N-1] X = mc_sample_path(p, x_0, times) #マルコフ連鎖 plt.plot(X) plt.show()
P[i, i - 1] = (i/N)*((1 - ep) + ep*0.5) P[i, i] = (1 - i/N)*ep*0.5 + (i/N)*ep*0.5 P[i, i + 1] = (1 - i/N)*((1 - ep) + ep*0.5) else: P[i, i - 1] = (i/N)*ep*0.5 P[i, i] = (1 - i/N)*ep*0.5 + (i/N)*((1 - ep) + ep*0.5) P[i, i + 1] = (1 - i/N)*((1 - ep) + ep*0.5) return P P = kmr(N, ep, p) x_t = mc_sample_path(P, x_0, sample_size=t) plt.plot(x_t) plt.show()
payoff_0 = np.array([[payoff[0, 0, 0], payoff[0, 1, 0]], [payoff[1, 0, 0], payoff[1, 1, 0]]]) # payoff matrix for player 0 # setting up transitive matrix A A = np.zeros([N+1, N+1]) A[0, 0] = 1 - epsilon*0.5 A[0, 1] = epsilon*0.5 A[N, N-1] = epsilon*0.5 A[N, N] = 1 - epsilon*0.5 for i in range(1, N): x_i = i / N ratio = np.array([1- x_i, x_i]) # the ratio b/w action0 and action1 exp = np.dot(payoff_0, ratio) if exp[0] > exp[1]: A[i, i -1] = x_i * (1-epsilon*0.5) A[i, i+1] = (1-x_i) * epsilon*0.5 A[i, i] = 1- A[i, i-1] - A[i, i+1] elif exp[0] < exp[1]: A[i, i -1] = x_i * epsilon*0.5 A[i, i+1] = (1 - x_i) * (1 - epsilon * 0.5) A[i, i] = 1- A[i, i-1] - A[i, i+1] else: A[i, i -1] = x_i * 0.5 A[i, i+1] = x_i * 0.5 A[i, i] = 0.5 y = mc_sample_path(A, x_0, times) fig, ax = plt.subplots() ax.plot(y) plt.show()
def set_P(self): if self.move == 'sequential': self.P = KMR_2x2_P_sequential(self.N, self.p, self._epsilon) else: self.P = KMR_2x2_P_simultaneous(self.N, self.p, self._epsilon) def simulate(self, T=100000, x0=0): """ Generates a NumPy array containing a sample path of length T with initial state x0 = 0 """ self.s = mc_sample_path(self.P, x0, T) def get_sample_path(self): return self.s def plot_sample_path(self, ax=None, show=True): if show: fig, ax = plt.subplots() ax.plot(self.s, alpha=0.5) ax.set_ylim(0, self.N) ax.set_title(r'Sample path: $\\varepsilon = {0}$'.format(self._epsilon)) ax.set_xlabel('time') ax.set_ylabel('state space') if show:
X[k][k]=(k/n)*epsilon*0.5 elif expay1[0]==expay1[1]: X[k][k-1]=(k/n)*0.5 X[k][k]=(k/n)*0.5 else: X[k][k-1]= (k/n)*epsilon*0.5 X[k][k] = (k/n)*((1-epsilon)+epsilon*0.5) if expay0[1]>expay0[0]: X[k][k+1]=((n-k)/n)*((1-epsilon)+epsilon*0.5) #k人からk+1人になる確率 X[k][k] += ((n-k)/n)*epsilon*0.5 #X[k][k]は上でも定めているので上書きでなく加えている elif expay0[1]==expay0[0]: X[k][k+1] = ((n-k)/n)*0.5 X[k][k] += ((n-k)/n)*0.5 else: X[k][k+1] = ((n-k)/n)*epsilon*0.5 X[k][k] += ((n-k)/n)*((1-epsilon)+epsilon*0.5) X[0][0] = (1-epsilon)+epsilon*0.5 X[0][1] = epsilon*0.5 X[n][n-1] = epsilon*0.5 X[n][n] = (1-epsilon)+epsilon*0.5 x_0 = np.random.binomial(n,p) # determine X_0 xs=mc_sample_path(X,init=x_0,sample_size=t) """ 確率分布を入れる場合は長さn+1のリストを入れなければいけないらしく 面倒なので各人が確率pで行動1を選択するという二項分布を作って整数値で代入 """ plt.plot(xs, 'b-', label='X_t') plt.legend() plt.show()
elif exp[0] < exp[1]: P[i][i] = num*(1-epsilon*0.5)+(1-num)*epsilon*0.5 else: P[i][i] = 0.5 for i in range(1, n+1): num = fractions.Fraction(i, n) pr = np.array([1-num, num]) exp = np.dot(pay0, pr) if exp[0] > exp[1]: P[i][i-1] = num*(1-epsilon*0.5) elif exp[0] < exp[1]: P[i][i-1] = num*epsilon*0.5 else: P[i][i-1] = num*0.5 for i in range(n): num = fractions.Fraction(i, n) pr = np.array([1-num, num]) exp = np.dot(pay0, pr) if exp[0] > exp[1]: P[i][i+1] = (1-num)*epsilon*0.5 elif exp[0] < exp[1]: P[i][i+1] = (1-num)*(1-epsilon*0.5) else: P[i][i+1] = (1-num)*0.5 X = mc_sample_path(P, psi, t) fig, ax = plt.subplots() ax.plot(X) plt.show()
N = 6 t = 10000 epsilon = 0.1 x_0 = 0 p = 1/3 A = np.zeros([N+1, N+1]) A[0,0] = 1 - epsilon*0.5 A[0,1] = epsilon*0.5 A[N,N-1] = epsilon*0.5 A[N,N] = 1 - epsilon*0.5 for i in range(1,N): x_i = i / N if x_i < p: A[i, i-1] = x_i * (1 - epsilon*0.5) A[i, i+1] = (1 - x_i) * epsilon*0.5 A[i, i] = 1 - A[i, i-1] - A[i, i+1] elif x_i > p: A[i, i -1] = x_i * epsilon*0.5 A[i, i+1] = (1 - x_i) * (1 - epsilon * 0.5) A[i, i] = 1- A[i, i-1] - A[i, i+1] else: A[i, i -1] = x_i * 0.5 A[i, i+1] = x_i * 0.5 A[i, i] = 0.5 y = mc_sample_path(A, x_0, t) fig, ax = plt.subplots() ax.plot(y) plt.show()
if expay[0] == expay[1]: P[n, n+1] += (1 - n/N) * 0.5 P[n, n-1] += n/N * 0.5 elif expay[0] > expay[1]: P[n, n+1] += (1 - n/N) * epsilon * 0.5 P[n, n-1] += n/N * (1 - epsilon * 0.5) else: P[n, n+1] += (1 - n/N) * (1 - epsilon * 0.5) P[n, n-1] += n/N * epsilon * 0.5 P[n,n] = 1 - sum(P[n]) # Derive a path of x with mc_tools x = mc_sample_path(P, default, trials) # Plot a path of x fig, ax = plt.subplots() xaxis = range(trials) ax.plot(xaxis, x, 'b-',label = 'Num. of people taking action 1') ax.legend(loc = 4) plt.title('Num. of players = ' + str(N) + ', '+ 'Trials = '+ str(trials) + ', ' + 'epsilon = ' + str(epsilon), color='k') plt.savefig(gamename + str(N) + str(trials) + str(epsilon) + '.png',transparent=True, bbox_inches='tight', pad_inches=0) plt.close()
epsilon = 0.2 r = random.uniform(0, 1) psi = (r, 1 - r) P = np.zeros([n + 1, n + 1]) for i in range(1, n + 1): #行動1をとっている人が選ばれて行動0に変更する num0 = fractions.Fraction(i - 1, n - 1) num1 = fractions.Fraction(i, n) ratio = np.array([1.0 - num0, num0]) exp = np.dot(p_0, ratio) if exp[0] > exp[1]: P[i][i - 1] = num1 * ((1.0 - epsilon) + epsilon * 0.5) else: P[i][i - 1] = num1 * (epsilon * 0.5) for i in range(n): #行動0をとっている人が選ばれて行動1に変更する num0 = fractions.Fraction(i, n - 1) num1 = fractions.Fraction(i, n) ratio = np.array([1 - num0, num0]) exp = np.dot(p_0, ratio) if exp[0] < exp[1]: P[i][i + 1] = (1 - num1) * ((1 - epsilon) + epsilon * 0.5) else: P[i][i + 1] = (1 - num1) * (epsilon * 0.5) for i in range(1, n): #行動を変えない P[i][i] = 1 - P[i][i - 1] - P[i][i + 1] P[0][0] = 1 - P[0][1] P[n][n] = 1 - P[n][n - 1] X = mc_sample_path(P, psi, t) plt.plot(X) plt.show()
def path(self, t): self.set_move() self.set_x0() self.xs = mc_sample_path(self.X,init=self.x_0,sample_size=t)