组合博弈入门:Nim游戏策略与算法实现

需积分: 9 2 下载量 141 浏览量 更新于2024-07-11 收藏 386KB PPT 举报
"这篇资料是关于杭电ACM课程中的Nim游戏介绍,属于组合博弈的初步学习。课程由杭州电子科技大学的刘春英教授主讲,内容包括基本的组合游戏概念、Nim游戏的规则以及相关的算法实现。" Nim游戏是一种经典的两人对弈的策略游戏,通常用于教授基础的博弈论概念。在这个游戏中,两个玩家轮流从几堆不同数量的物品中取走一定数量的物品。具体规则如下: 1. 游戏开始时,有三堆扑克牌,例如5、7、9张。 2. 玩家轮流进行操作,每次可以选择一堆牌并从中取走任意张数。 3. 游戏的目标是成为最后一个取走牌的人,即当对手无法再进行有效操作时(因所有牌已被取完),则该玩家获胜。 组合游戏是一种具有特定特性的二人游戏,它包含以下几个关键要素: - 双方玩家 - 游戏状态是一个有限的集合,如棋盘上的格子数量 - 轮流操作 - 操作必须遵循预设规则 - 游戏有明确的结束条件,且无论何种操作,游戏最终会在有限次回合后结束 - 游戏中存在必败点(P点)和必胜点(N点) 必败点(P点)是指当前玩家无论怎么操作都会导致对手赢得游戏的位置。相反,必胜点(N点)是下一玩家可以确保获胜的点。关键性质包括: - 所有终结状态都是必败点 - 从必胜点出发,至少有一种方法可以进入必败点 - 在必败点上,无论怎么操作,都会进入必胜点 解决这类游戏的算法通常包括以下步骤: 1. 标记所有终结状态为必败点 2. 标记所有一步操作后能到达必败点的位置为必胜点 3. 如果从某个点出发的所有一步操作都只能进入必胜点,那么该点是必败点 4. 若无新的必败点出现,算法结束;否则,回到步骤2 课程中还提供了其他练习,如Subtraction Games,其中规定了可取的数字集合(如{1, 3, 4}),以及kiki's game等实战练习,帮助学生深入理解和应用Nim游戏的策略。 通过Nim游戏的学习,学生不仅可以掌握基本的博弈论概念,还能锻炼逻辑思维和策略规划能力,这对于计算机科学,特别是算法设计与分析领域非常重要。

解释代码 #加载数据 path_absolute_log = r"F:\数据处理比赛\BDC2023\处理数据log" paths_log_file = os.listdir(path_absolute_log) #获取绝对路径 def make_paths_absolute(paths_file): path_absolute = path_absolute_log paths_absolute_file = os.path.join(path_absolute,paths_file) return paths_absolute_file paths_absolute_log_file = list(map(make_paths_absolute,paths_log_file)) #对表格处理 path_absolute_log_file = r"F:\数据处理比赛\BDC2023\处理数据log\4ff8b802-0d87-11ee-af51-525400d4ffe4_log.csv" def form_data(path_absolute_log_file): data_log = pd.read_csv(path_absolute_log_file) data_log.insert(data_log.shape[1], 'id_score', np.nan) data_log.insert(data_log.shape[1], 'id', os.path.basename(path_absolute_log_file)[:-8]) data_log_message = data_log['message'] def jieba_data(data): data_log_jieba_message = [] data_log_jieba_message.append(','.join(jieba.cut_for_search(data))) print(data_log_jieba_message) return data_log_jieba_message data_log_jieba_message = data_log_message.map(jieba_data) def form_work(data): feature_words = ['bug','ERROR','WARNING','error','WARN','empty','错误','失败','未登录'] set_data = set(str(data)[2:-2].split(',')) set_feature_words = set(feature_words) set_mysql = set('mysql') score = [] if set_data.intersection(set_feature_words): score.append() if set_mysql.intersection(set_feature_words): score.append('LTE4MDK5Mzk2NjU1NiM1ODIONDC=') score = str(score)[2:-2] print(score) return score data_log['id_score'] = data_log_jieba_message.map(form_work) return data_log data_log = form_data(path_absolute_log_file)

2023-07-11 上传