fork download
  1.  
  2. """
  3. learnstock.py
  4. 帰納的学習による10桁のパターン探索
  5. パターンC・Dの候補を調べるプログラム
  6. """
  7.  
  8. import random
  9.  
  10. # グローバル変数
  11. SETSIZE = 100 # 学習データの数
  12. CNO = 10 # パターンの桁数
  13. GENMAX = 10000 # 解候補を生成する回数
  14. SEED = 7 # 乱数の初期値
  15.  
  16.  
  17. # 学習データと教師データを読み込む関数
  18. def readdata(data, teacher):
  19. for i in range(SETSIZE):
  20. line = input()
  21. data[i] = [int(num) for num in line.split()]
  22. teacher[i] = data[i][CNO]
  23.  
  24.  
  25. # 解候補のスコアを計算する関数
  26. def calcscore(data, teacher, answer):
  27. score = 0
  28.  
  29. for i in range(SETSIZE):
  30. point = 0
  31.  
  32. # 解候補と学習データの一致度を調べる
  33. for j in range(CNO):
  34. if answer[j] == 2:
  35. point += 1 # 2はワイルドカード
  36. elif answer[j] == data[i][j]:
  37. point += 1 # 値が一致した
  38.  
  39. # 教師データと一致する場合に点数を加える
  40. if point == CNO and teacher[i] == 1:
  41. score += 1
  42. elif point != CNO and teacher[i] == 0:
  43. score += 1
  44.  
  45. return score
  46.  
  47.  
  48. # メイン処理
  49. score = 0
  50. answer = [0 for i in range(CNO)]
  51. data = [[] for i in range(SETSIZE)]
  52. teacher = [0 for i in range(SETSIZE)]
  53.  
  54. bestscore = 0
  55. bestanswer = [0 for i in range(CNO)]
  56.  
  57. # スコア別に異なる解候補を保存する
  58. candidate_patterns = {}
  59.  
  60. # 乱数を初期化する
  61. random.seed(SEED)
  62.  
  63. # 学習データを読み込む
  64. readdata(data, teacher)
  65.  
  66. # 解候補を生成して評価する
  67. for i in range(GENMAX):
  68.  
  69. # 10桁の解候補をランダムに生成する
  70. for j in range(CNO):
  71. answer[j] = random.randint(0, 2)
  72.  
  73. # 解候補のスコアを計算する
  74. score = calcscore(data, teacher, answer)
  75.  
  76. # 最高スコアを更新する
  77. if score > bestscore:
  78. bestanswer = answer.copy()
  79. bestscore = score
  80.  
  81. # 84点と100点以外の候補を記録する
  82. if score != 84 and score != 100:
  83. pattern = tuple(answer)
  84.  
  85. # 同じパターンを重複して保存しない
  86. if pattern not in candidate_patterns:
  87. candidate_patterns[pattern] = score
  88.  
  89.  
  90. # スコアが高い順に並べる
  91. sorted_patterns = sorted(
  92. candidate_patterns.items(),
  93. key=lambda item: item[1],
  94. reverse=True
  95. )
  96.  
  97. # パターンC・Dの候補を出力する
  98. print("パターンC・Dの候補")
  99.  
  100. for i, (pattern, pattern_score) in enumerate(
  101. sorted_patterns[:2]):
  102. print("パターン", ["C", "D"][i])
  103. print("解候補 =", list(pattern))
  104. print("スコア =", pattern_score)
  105.  
  106. # 全体で見つかった最高スコアも出力する
  107. print("探索全体の最良解")
  108. print(bestanswer, ":score=", bestscore)
  109. # your code goes here
Success #stdin #stdout 0.93s 15356KB
stdin
1 0 0 0 0 0 1 0 0 1     1
0 1 0 1 0 1 1 1 0 1     1
0 1 0 0 0 1 1 0 1 0     0
1 0 0 1 1 0 1 0 0 1     1
1 0 0 1 1 0 1 1 1 1     0
0 0 0 0 0 0 1 1 0 0     1
1 1 1 1 0 0 1 1 0 1     0
0 1 1 1 0 1 1 1 0 1     0
0 0 1 1 0 1 1 1 0 0     0
1 1 1 0 0 0 0 1 1 0     0
0 0 1 1 1 0 0 0 1 0     0
1 0 0 0 1 0 1 0 1 1     0
0 1 0 0 1 0 0 0 1 1     0
0 1 1 0 1 0 0 1 1 1     0
0 0 1 0 1 0 1 0 1 0     0
0 1 1 0 1 1 1 1 1 0     0
1 1 0 0 1 1 1 1 0 0     1
1 0 0 0 1 1 1 0 0 0     1
0 0 1 0 0 1 1 1 0 0     0
0 1 1 0 0 1 1 1 0 1     0
1 1 0 1 0 1 1 1 1 1     0
1 1 1 0 1 1 1 0 1 0     0
0 1 1 0 1 1 1 0 0 1     0
1 1 1 1 1 1 0 0 0 1     0
1 1 1 0 1 0 1 1 1 0     0
1 1 1 0 1 0 0 0 0 0     0
0 0 0 1 1 1 0 0 1 0     0
1 0 1 0 0 0 1 1 1 0     0
0 0 1 1 1 1 0 1 1 0     0
1 1 0 1 0 0 0 0 0 1     1
0 1 1 1 0 1 0 1 1 1     0
1 1 0 0 0 1 1 0 0 1     1
1 1 0 1 1 1 1 1 1 1     0
1 0 1 0 1 1 0 1 0 1     0
1 1 0 1 1 0 0 1 1 0     0
0 0 1 0 1 0 1 1 0 1     0
0 1 1 1 1 0 0 1 0 0     0
0 1 1 0 0 1 1 0 0 0     0
0 0 0 1 0 1 0 0 0 0     1
1 1 1 0 0 0 0 1 0 0     0
1 0 1 1 1 1 0 0 1 0     0
0 1 0 0 1 0 1 1 0 0     1
1 1 1 0 1 1 0 0 0 0     0
0 0 1 0 1 0 1 1 0 1     0
1 0 0 1 0 1 1 1 0 0     1
1 1 1 0 1 1 0 0 1 0     0
0 1 0 1 1 1 1 1 0 1     1
0 1 1 0 0 1 0 0 1 0     0
0 0 0 1 1 1 0 1 1 1     0
1 0 1 0 1 0 1 1 1 0     0
0 1 1 0 0 0 1 0 0 0     0
0 0 1 0 1 0 0 0 1 1     0
1 0 1 0 0 1 1 0 0 0     0
0 0 0 1 0 0 1 0 0 1     1
0 0 1 1 1 1 1 1 1 0     0
0 0 1 0 1 1 1 0 1 1     0
0 1 1 0 1 0 0 0 0 0     0
0 0 1 1 0 0 0 1 1 1     0
0 1 0 1 1 1 0 0 1 0     0
1 1 1 1 0 0 1 0 1 1     0
1 1 1 0 0 1 0 1 1 1     0
0 1 0 0 0 0 1 0 0 0     1
0 0 0 0 1 0 0 0 0 1     1
1 1 0 0 1 1 0 1 0 1     1
0 0 0 1 1 0 1 0 0 1     1
1 1 1 1 1 0 1 1 0 1     0
1 1 1 1 0 0 0 0 0 0     0
1 0 1 1 1 0 1 0 0 1     0
0 1 0 1 0 1 0 1 1 0     0
1 0 0 0 1 0 0 0 0 0     1
0 1 1 1 0 0 1 1 1 0     0
0 1 1 1 0 0 0 0 1 1     0
1 0 1 1 0 1 1 1 1 1     0
1 1 0 0 1 0 1 0 1 0     0
0 1 1 0 0 1 0 1 0 1     0
0 1 0 0 0 0 1 1 1 0     0
0 1 1 0 1 0 0 0 1 1     0
0 1 0 1 1 1 1 1 0 1     1
1 0 0 1 0 0 1 1 1 1     0
1 1 0 1 1 1 1 1 0 0     1
0 0 0 0 0 1 1 1 1 1     0
0 0 0 0 1 0 0 0 0 1     1
1 1 0 1 0 1 1 0 0 1     1
0 0 1 0 0 1 0 0 0 1     0
1 0 1 1 0 0 0 0 0 0     0
1 0 1 1 1 0 0 0 0 0     0
1 0 0 1 1 1 0 1 1 1     0
0 0 1 1 0 0 1 0 0 1     0
0 0 1 1 1 1 1 0 1 1     0
0 1 0 1 0 1 0 0 0 1     1
1 0 1 1 1 1 1 0 1 1     0
1 1 1 1 1 1 0 0 1 1     0
0 1 0 0 0 0 1 0 1 1     0
1 0 1 1 1 0 0 0 0 0     0
0 1 1 1 0 0 0 0 1 1     0
0 1 1 0 1 1 1 0 0 0     0
1 1 0 0 0 0 0 1 0 0     1
1 0 1 0 0 0 1 0 0 0     0
0 0 1 1 1 0 0 0 0 0     0
0 1 0 0 1 0 0 1 1 1     0
stdout
パターンC・Dの候補
パターン C
解候補 = [1, 1, 0, 2, 2, 2, 2, 2, 0, 2]
スコア = 83
パターン D
解候補 = [2, 2, 0, 2, 2, 2, 2, 0, 2, 2]
スコア = 83
探索全体の最良解
[2, 2, 0, 2, 2, 2, 0, 2, 0, 2] :score= 84