Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

175 rindas
4.9 KiB

pirms 2 mēnešiem
  1. -module(ai_core).
  2. -export([init_ai/1, make_decision/2, update_strategy/3]).
  3. -record(ai_state, {
  4. personality, % aggressive | conservative | balanced
  5. strategy_weights, % 策略权重
  6. knowledge_base, % 知识库
  7. game_history = [] % 游戏历史
  8. }).
  9. %% AI初始化
  10. init_ai(Personality) ->
  11. #ai_state{
  12. personality = Personality,
  13. strategy_weights = init_weights(Personality),
  14. knowledge_base = init_knowledge_base()
  15. }.
  16. %% 决策制定
  17. make_decision(AIState, GameState) ->
  18. % 分析当前局势
  19. Situation = analyze_situation(GameState),
  20. % 生成可能的行动
  21. PossiblePlays = generate_possible_plays(GameState),
  22. % 评估每个行动
  23. RatedPlays = evaluate_plays(PossiblePlays, AIState, Situation),
  24. % 选择最佳行动
  25. select_best_play(RatedPlays, AIState).
  26. %% 策略更新
  27. update_strategy(AIState, GameResult, GameHistory) ->
  28. NewWeights = adjust_weights(AIState#ai_state.strategy_weights, GameResult),
  29. NewKnowledge = update_knowledge(AIState#ai_state.knowledge_base, GameHistory),
  30. AIState#ai_state{
  31. strategy_weights = NewWeights,
  32. knowledge_base = NewKnowledge,
  33. game_history = [GameHistory | AIState#ai_state.game_history]
  34. }.
  35. %% 内部函数
  36. init_weights(aggressive) ->
  37. #{
  38. control_weight => 0.8,
  39. attack_weight => 0.7,
  40. defense_weight => 0.3,
  41. risk_weight => 0.6
  42. };
  43. init_weights(conservative) ->
  44. #{
  45. control_weight => 0.5,
  46. attack_weight => 0.4,
  47. defense_weight => 0.8,
  48. risk_weight => 0.3
  49. };
  50. init_weights(balanced) ->
  51. #{
  52. control_weight => 0.6,
  53. attack_weight => 0.6,
  54. defense_weight => 0.6,
  55. risk_weight => 0.5
  56. }.
  57. analyze_situation(GameState) ->
  58. #{
  59. hand_strength => evaluate_hand_strength(GameState),
  60. control_status => evaluate_control(GameState),
  61. opponent_cards => estimate_opponent_cards(GameState),
  62. game_stage => determine_game_stage(GameState)
  63. }.
  64. generate_possible_plays(GameState) ->
  65. MyCards = get_my_cards(GameState),
  66. LastPlay = get_last_play(GameState),
  67. generate_valid_plays(MyCards, LastPlay).
  68. evaluate_plays(Plays, AIState, Situation) ->
  69. lists:map(
  70. fun(Play) ->
  71. Score = calculate_play_score(Play, AIState, Situation),
  72. {Play, Score}
  73. end,
  74. Plays
  75. ).
  76. calculate_play_score(Play, AIState, Situation) ->
  77. Weights = AIState#ai_state.strategy_weights,
  78. ControlScore = evaluate_control_value(Play, Situation) *
  79. maps:get(control_weight, Weights),
  80. AttackScore = evaluate_attack_value(Play, Situation) *
  81. maps:get(attack_weight, Weights),
  82. DefenseScore = evaluate_defense_value(Play, Situation) *
  83. maps:get(defense_weight, Weights),
  84. RiskScore = evaluate_risk_value(Play, Situation) *
  85. maps:get(risk_weight, Weights),
  86. ControlScore + AttackScore + DefenseScore + RiskScore.
  87. select_best_play(RatedPlays, AIState) ->
  88. case AIState#ai_state.personality of
  89. aggressive ->
  90. select_aggressive(RatedPlays);
  91. conservative ->
  92. select_conservative(RatedPlays);
  93. balanced ->
  94. select_balanced(RatedPlays)
  95. end.
  96. %% 策略选择函数
  97. select_aggressive(RatedPlays) ->
  98. % 倾向于选择得分最高的行动
  99. {Play, _Score} = lists:max(RatedPlays),
  100. Play.
  101. select_conservative(RatedPlays) ->
  102. % 倾向于选择风险较低的行动
  103. SafePlays = filter_safe_plays(RatedPlays),
  104. case SafePlays of
  105. [] -> select_balanced(RatedPlays);
  106. _ -> select_from_safe_plays(SafePlays)
  107. end.
  108. select_balanced(RatedPlays) ->
  109. % 在得分和风险之间寻找平衡
  110. {Play, _Score} = select_balanced_play(RatedPlays),
  111. Play.
  112. %% 评估函数
  113. evaluate_hand_strength(GameState) ->
  114. Cards = get_my_cards(GameState),
  115. calculate_hand_value(Cards).
  116. evaluate_control(GameState) ->
  117. % 评估是否控制局势
  118. LastPlay = get_last_play(GameState),
  119. MyCards = get_my_cards(GameState),
  120. can_control_game(MyCards, LastPlay).
  121. estimate_opponent_cards(GameState) ->
  122. % 基于已出牌情况估计对手手牌
  123. PlayedCards = get_played_cards(GameState),
  124. MyCards = get_my_cards(GameState),
  125. estimate_remaining_cards(PlayedCards, MyCards).
  126. %% 知识库更新
  127. update_knowledge(KnowledgeBase, GameHistory) ->
  128. % 更新AI的知识库
  129. NewPatterns = extract_patterns(GameHistory),
  130. merge_knowledge(KnowledgeBase, NewPatterns).
  131. extract_patterns(GameHistory) ->
  132. % 从游戏历史中提取出牌模式
  133. lists:foldl(
  134. fun(Play, Patterns) ->
  135. Pattern = analyze_play_pattern(Play),
  136. update_pattern_stats(Pattern, Patterns)
  137. end,
  138. #{},
  139. GameHistory
  140. ).
  141. merge_knowledge(Old, New) ->
  142. maps:merge_with(
  143. fun(_Key, OldValue, NewValue) ->
  144. update_knowledge_value(OldValue, NewValue)
  145. end,
  146. Old,
  147. New
  148. ).