fork download
  1. import sys
  2. import random
  3.  
  4. # 定数設定
  5. SETSIZE = 100
  6. CNO = 10
  7. GENMAX = 10000
  8. SEED = 7
  9.  
  10. # 1. stdin(標準入力)からldata.txtの内容を読み込む
  11. def readdata_from_stdin():
  12. data = []
  13. teacher = []
  14. lines = sys.stdin.read().strip().splitlines()
  15. for line in lines:
  16. line = line.strip()
  17. if not line:
  18. continue
  19. vals = [int(c) for c in line.split()]
  20. data.append(vals[:CNO])
  21. teacher.append(vals[CNO])
  22. return data, teacher
  23.  
  24. # 2. スコア計算関数
  25. def calcscore(data, teacher, answer):
  26. score = 0
  27. for i in range(len(data)):
  28. point = 0
  29. for j in range(CNO):
  30. if answer[j] == 2: # ワイルドカード
  31. point += 1
  32. elif answer[j] == data[i][j]:
  33. point += 1
  34.  
  35. if point == CNO and teacher[i] == 1:
  36. score += 1
  37. elif point != CNO and teacher[i] == 0:
  38. score += 1
  39. return score
  40.  
  41. # データ読み込み
  42. data, teacher = readdata_from_stdin()
  43.  
  44. # 探索(最良解の獲得)
  45. random.seed(SEED)
  46. bestscore = 0
  47. bestanswer = [0] * CNO
  48.  
  49. for i in range(GENMAX):
  50. answer = [random.randint(0, 2) for _ in range(CNO)]
  51. score = calcscore(data, teacher, answer)
  52. if score > bestscore:
  53. bestscore = score
  54. bestanswer = answer.copy()
  55.  
  56. # パターンA, B, C, Dの定義
  57. patterns = {
  58. 'パターンA': [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  59. 'パターンB': bestanswer,
  60. 'パターンC': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  61. 'パターンD': [1, 2, 2, 2, 2, 2, 2, 2, 2, 2]
  62. }
  63.  
  64. # --- 実行結果(スコア表示) ---
  65. print("=== 実行結果 (各パターンのスコア) ===")
  66. for p_name, p_ans in patterns.items():
  67. s = calcscore(data, teacher, p_ans)
  68. print(f"{p_name} {p_ans}: score = {s}")
  69.  
  70. # --- 表2.2 の出力(テキスト形式) ---
  71. print("\n=== 表2.2 予測結果の比較 (先頭10事例) ===")
  72. header = f"{'事例No':<6} | {'入力属性データ':<30} | {'正解':<4} | {'パタA':<5} | {'パタB':<5} | {'パタC':<5} | {'パタD':<5}"
  73. print(header)
  74. print("-" * len(header))
  75.  
  76. for i in range(min(10, len(data))):
  77. row_str = f"{i+1:<7} | {str(data[i]):<30} | {teacher[i]:<6} | "
  78. preds = []
  79. for p_name, p_ans in patterns.items():
  80. point = sum(1 for j in range(CNO) if p_ans[j] == 2 or p_ans[j] == data[i][j])
  81. pred = 1 if point == CNO else 0
  82. preds.append(str(pred))
  83. row_str += " | ".join(f"{p:<5}" for p in preds)
  84. print(row_str)
Success #stdin #stdout 0.13s 11680KB
stdin
Standard input is empty
stdout
=== 実行結果 (各パターンのスコア) ===
パターンA [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]: score = 0
パターンB [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]: score = 0
パターンC [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]: score = 0
パターンD [1, 2, 2, 2, 2, 2, 2, 2, 2, 2]: score = 0

=== 表2.2 予測結果の比較 (先頭10事例) ===
事例No   | 入力属性データ                        | 正解   | パタA   | パタB   | パタC   | パタD  
------------------------------------------------------------------------------