-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoptimal_quit.py
97 lines (81 loc) · 2.29 KB
/
optimal_quit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# -*- coding: utf-8 -*-
'''
@Author : HardY
@Date : 2020/5/22
'''
import random
import matplotlib.pyplot as plt
import numpy as np
from collections import Counter
N = 21
def plot_p_pie(y):
"""
绘制饼图,其中y是标签列表
"""
target_stats = Counter(y)
labels = list(target_stats.keys())
sizes = list(target_stats.values())
explode = tuple([0.1] * len(target_stats))
fig, ax = plt.subplots()
ax.pie(sizes, explode=explode, labels=labels, shadow=True, autopct='%1.1f%%')
ax.axis('equal')
plt.show()
def plot_p_line(p):
x = np.arange(0, len(p)) + 1
x[0] = 1
my_x_ticks = np.arange(1, N, 1)
plt.xticks(my_x_ticks)
plt.plot(x, p, color='red')
plt.plot(x, ranchoose_p, color='green')
plt.xlabel('Candidates')
plt.ylabel('Optimal probability')
plt.legend(['37%', 'random'], loc='best')
plt.show()
def monte_carlo_method(L):
n = len(L) # 候选者数量,即列表长度
k = (int)(0.37 * n) # 必分手的人数
maxk = max(L[:k]) # 分手者中相对最优秀的评分
# 从k+1位开始,若有比前k个人更优秀的则选择
# 若没有则选择最后一位
for i in range(k, n):
if L[i] > maxk:
return L[i]
if i == n - 1:
return L[i]
def optimal_quit(n) -> float:
"""
利用毕导给出的P(k)的公式求出每个不同的k对应的P,再返回最大值P
:param n: 候选者人数
:return: 最大概率P
"""
p = []
for k in range(1, n+1):
temp = (k * sum([(1 / i) for i in range(k, n)])) / n
p.append(temp)
return max(p)
def main():
p = [1.0] # 最佳概率
num = [0] # 最佳策略k
print('候选者人数\t', '最佳策略k\t', '最佳概率\n')
# 对不同的候选者人数分别求取最佳策略和最佳概率
for n in range(2, N):
p.append(optimal_quit(n))
temp = (int)(p[n - 3] * n) + 1
num.append(temp)
print(n, '\t\t\t', num[n - 3], '\t\t\t', p[n - 3])
ranchoose_p = [] # 随机选择选到最优者的概率
for i in range(1, N):
a = 1 / i
ranchoose_p.append(a)
# 画概率图
# plot_p_line(p)
choice = []
for j in range(0,100):
li = random.sample(range(0, 100), 100) # 在0-100内随机生成一个序列,表示100个候选人和位置信息
# print(li)
temp1 = monte_carlo_method(li)
choice.append(temp1)
# 画饼状图
plot_p_pie(choice)
if __name__ == '__main__':
main()