[明日方舟] 最优招募解析器
By
jerryxjr1220
at 2021-09-24 • 0人收藏 • 1189人看过
玩过明日方舟塔防游戏的会知道游戏中有一个公开招募机制,随机给出5个标签,任选3个或以下的标签来匹配招募的3~5星角色。
为了避免无效选择同时更高几率获得高星角色,由此设计了一套解析程序,只需输入给定的5个随机标签,然后程序可以自动计算出最优(平均星级最高)的3个选择。
data = [ [6,'麦哲伦','远程位','辅助干员','支援','减速','输出','高级资深干员'], [6,'安洁莉娜','远程位','辅助干员','支援','减速','输出','高级资深干员'], [6,'塞雷娅','近战位','重装干员','防护','支援','治疗','高级资深干员'], [6,'星熊','近战位','重装干员','防护','输出','高级资深干员'], [6,'煌','近战位','近卫干员','输出','生存','高级资深干员'], [6,'赫拉格','近战位','近卫干员','输出','生存','高级资深干员'], [6,'斯卡蒂','近战位','近卫干员','输出','生存','高级资深干员'], [6,'陈','近战位','近卫干员','爆发','输出','高级资深干员'], [6,'银灰','近战位','近卫干员','输出','支援','高级资深干员'], [6,'莫斯提马','远程位','术师干员','群攻','支援','控场','高级资深干员'], [6,'艾雅法拉','远程位','术师干员','输出','削弱','高级资深干员'], [6,'伊芙利特','远程位','术师干员','群攻','削弱','高级资深干员'], [6,'夜莺','远程位','医疗干员','支援','治疗','高级资深干员'], [6,'闪灵','远程位','医疗干员','支援','治疗','高级资深干员'], [6,'黑','远程位','狙击干员','输出','高级资深干员'], [6,'能天使','远程位','狙击干员','输出','高级资深干员'], [6,'推进之王','近战位','先锋干员','费用回复','输出','高级资深干员'], [5,'槐琥','近战位','特种干员','快速复活','削弱资深干员'], [5,'食铁兽','近战位','特种干员','位移','减速','资深干员'], [5,'崖心','近战位','特种干员','位移','输出','资深干员'], [5,'狮蝎','近战位','特种干员','输出','生存','资深干员'], [5,'红','近战位','特种干员','控场','快速复活','资深干员'], [5,'格劳克斯','远程位','辅助干员','减速','控场','资深干员'], [5,'空','远程位','辅助干员','支援','治疗','资深干员'], [5,'梅尔','远程位','辅助干员','召唤','控场','资深干员'], [5,'真理','远程位','辅助干员','减速','输出','资深干员'], [5,'初雪','远程位','辅助干员','削弱','资深干员'], [5,'可颂','近战位','重装干员','防护','位移','资深干员'], [5,'火神','近战位','重装干员','防护','输出生存'], [5,'临光','近战位','重装干员','防护','治疗','资深干员'], [5,'雷蛇','近战位','重装干员','防护','输出','资深干员'], [5,'布洛卡','近战位','近卫干员','群攻','生存','资深干员'], [5,'星极','近战位','近卫干员','输出','防护','资深干员'], [5,'诗怀雅','近战位','近卫干员','输出','支援','资深干员'], [5,'暴行','近战位','近卫干员','群攻','爆发','资深干员'], [5,'拉普兰德','近战位','近卫干员','输出','削弱','资深干员'], [5,'因陀罗','近战位','近卫干员','输出','生存','资深干员'], [5,'幽灵鲨','近战位','近卫干员','群攻','生存','资深干员'], [5,'芙兰卡','近战位','近卫干员','输出','生存','资深干员'], [5,'天火','远程位','术师干员','群攻','控场','资深干员'], [5,'夜魔','远程位','术师干员','输出','治疗','减速'], [5,'阿米娅','远程位','术师干员','输出','资深干员'], [5,'赫默','远程位','医疗干员','治疗','资深干员'], [5,'华法琳','远程位','医疗干员','支援','治疗','资深干员'], [5,'灰喉','远程位','狙击干员','输出','资深干员'], [5,'白面鸮','远程位','医疗干员','支援','治疗','资深干员'], [5,'陨星','远程位','狙击干员','群攻','削弱','资深干员'], [5,'送葬人','远程位','狙击干员','群攻','资深干员'], [5,'守林人','远程位','狙击干员','输出','爆发','资深干员'], [5,'白金','远程位','狙击干员','输出','资深干员'], [5,'普罗旺斯','远程位','狙击干员','输出','资深干员'], [5,'蓝毒','远程位','狙击干员','输出','资深干员'], [5,'格拉尼','近战位','先锋干员','费用回复','防护','资深干员'], [5,'苇草','近战位','先锋干员','费用回复','输出','资深干员'], [5,'德克萨斯','近战位','先锋干员','费用回复','控场','资深干员'], [5,'凛冬','近战位','先锋干员','费用回复','支援','资深干员'], [4,'阿消','近战位','特种干员','位移'], [4,'暗索','近战位','特种干员','位移'], [4,'砾','近战位','特种干员','快速复活','防护'], [4,'地灵','远程位','辅助干员','减速'], [4,'深海色','远程位','辅助干员','召唤'], [4,'角峰','近战位','重装干员','防护'], [4,'古米','近战位','重装干员','防护','治疗'], [4,'蛇屠箱','近战位','重装干员','防护'], [4,'缠丸','近战位','近卫干员','输出','生存'], [4,'霜叶','近战位','近卫干员','输出','减速'], [4,'慕斯','近战位','近卫干员','输出'], [4,'猎蜂','近战位','近卫干员','输出'], [4,'艾丝黛尔','近战位','近卫干员','群攻','生存'], [4,'杜宾','近战位','近卫干员','输出','支援'], [4,'格雷伊','远程位','术师干员','群攻','减速'], [4,'远山','远程位','术师干员','群攻'], [4,'夜烟','远程位','术师干员','输出','削弱'], [4,'清流','远程位','医疗干员','治疗','支援'], [4,'苏苏洛','远程位','医疗干员','治疗'], [4,'调香师','远程位','医疗干员','治疗'], [4,'嘉维尔','远程位','医疗干员','治疗'], [4,'末药','远程位','医疗干员','治疗'], [4,'安比尔','远程位','狙击干员','输出','减速'], [4,'红云','远程位','狙击干员','输出'], [4,'杰西卡','远程位','狙击干员','输出','生存'], [4,'白雪','远程位','狙击干员','群攻','减速'], [4,'流星','远程位','狙击干员','输出','削弱'], [4,'梅','远程位','狙击干员','输出','减速'], [4,'桃金娘','近战位','先锋干员','费用回复','治疗'], [4,'红豆','近战位','先锋干员','费用回复','输出'], [4,'清道夫','近战位','先锋干员','费用回复','输出'], [4,'讯使','近战位','先锋干员','费用回复','防护'], [3,'梓兰','远程位','辅助干员','减速'], [3,'斑点','近战位','重装干员','防护','治疗'], [3,'卡缇','近战位','重装干员','防护'], [3,'米格鲁','近战位','重装干员','防护'], [3,'泡普卡','近战位','近卫干员','群攻','生存'], [3,'月见夜','近战位','近卫干员','输出'], [3,'玫兰莎','近战位','近卫干员','输出','生存'], [3,'史都华德','远程位','术师干员','输出'], [3,'炎熔','远程位','术师干员','群攻'], [3,'安赛尔','远程位','医疗干员','治疗'], [3,'芙蓉','远程位','医疗干员','治疗'], [3,'空爆','远程位','狙击干员','群攻'], [3,'安德切尔','远程位','狙击干员','输出'], [3,'克洛丝','远程位','狙击干员','输出'], [3,'翎羽','近战位','先锋干员','费用回复','输出'], [3,'香草','近战位','先锋干员','费用回复'], [3,'芬','近战位','先锋干员','费用回复'] ] # import pickle # import io # f = io.open("data.pkl","wb") # pickle.dump(data, f) # f.close() from itertools import combinations as cb def calc(data, choose, p=3): chosen = cb(choose, p) final_result = {} for pair in chosen: res = [] for eachdata in data: flag = True for ep in pair: if ep not in str(eachdata): flag = False break if flag: res.append(eachdata) final_result[pair] = res return final_result def judge(choose, data=data): filtered = calc(data,choose,1) filtered.update(calc(data,choose,2)) filtered.update(calc(data,choose,3)) result = [] for k,v in filtered.items(): if v: score = sum([v[i][0] for i in range(len(v))])/len(v) result.append([score, k, v]) result.sort(key=lambda x:x[0], reverse=True) return result[:3]
程序调用:
for each in judge(['近卫','术师','近战','新手','生存'], data[17:]): print(f'评分:{each[0]}') print(f'选项:{each[1]}') print(f'可能获得角色:') for e in each[2]: print(e) print('-----------------------------')
输出:
评分:4.4 选项:('近战', '生存') 可能获得角色: [5, '狮蝎', '近战位', '特种干员', '输出', '生存', '资深干员'] [5, '火神', '近战位', '重装干员', '防护', '输出生存'] [5, '布洛卡', '近战位', '近卫干员', '群攻', '生存', '资深干员'] [5, '因陀罗', '近战位', '近卫干员', '输出', '生存', '资深干员'] [5, '幽灵鲨', '近战位', '近卫干员', '群攻', '生存', '资深干员'] [5, '芙兰卡', '近战位', '近卫干员', '输出', '生存', '资深干员'] [4, '缠丸', '近战位', '近卫干员', '输出', '生存'] [4, '艾丝黛尔', '近战位', '近卫干员', '群攻', '生存'] [3, '泡普卡', '近战位', '近卫干员', '群攻', '生存'] [3, '玫兰莎', '近战位', '近卫干员', '输出', '生存'] ----------------------------- 评分:4.363636363636363 选项:('生存',) 可能获得角色: [5, '狮蝎', '近战位', '特种干员', '输出', '生存', '资深干员'] [5, '火神', '近战位', '重装干员', '防护', '输出生存'] [5, '布洛卡', '近战位', '近卫干员', '群攻', '生存', '资深干员'] [5, '因陀罗', '近战位', '近卫干员', '输出', '生存', '资深干员'] [5, '幽灵鲨', '近战位', '近卫干员', '群攻', '生存', '资深干员'] [5, '芙兰卡', '近战位', '近卫干员', '输出', '生存', '资深干员'] [4, '缠丸', '近战位', '近卫干员', '输出', '生存'] [4, '艾丝黛尔', '近战位', '近卫干员', '群攻', '生存'] [4, '杰西卡', '远程位', '狙击干员', '输出', '生存'] [3, '泡普卡', '近战位', '近卫干员', '群攻', '生存'] [3, '玫兰莎', '近战位', '近卫干员', '输出', '生存'] ----------------------------- 评分:4.294117647058823 选项:('近卫',) 可能获得角色: [5, '布洛卡', '近战位', '近卫干员', '群攻', '生存', '资深干员'] [5, '星极', '近战位', '近卫干员', '输出', '防护', '资深干员'] [5, '诗怀雅', '近战位', '近卫干员', '输出', '支援', '资深干员'] [5, '暴行', '近战位', '近卫干员', '群攻', '爆发', '资深干员'] [5, '拉普兰德', '近战位', '近卫干员', '输出', '削弱', '资深干员'] [5, '因陀罗', '近战位', '近卫干员', '输出', '生存', '资深干员'] [5, '幽灵鲨', '近战位', '近卫干员', '群攻', '生存', '资深干员'] [5, '芙兰卡', '近战位', '近卫干员', '输出', '生存', '资深干员'] [4, '缠丸', '近战位', '近卫干员', '输出', '生存'] [4, '霜叶', '近战位', '近卫干员', '输出', '减速'] [4, '慕斯', '近战位', '近卫干员', '输出'] [4, '猎蜂', '近战位', '近卫干员', '输出'] [4, '艾丝黛尔', '近战位', '近卫干员', '群攻', '生存'] [4, '杜宾', '近战位', '近卫干员', '输出', '支援'] [3, '泡普卡', '近战位', '近卫干员', '群攻', '生存'] [3, '月见夜', '近战位', '近卫干员', '输出'] [3, '玫兰莎', '近战位', '近卫干员', '输出', '生存'] -----------------------------
5 个回复 | 最后更新于 2021-09-26
2021-09-24
#2
回复#1 @admin :
其实拓展来看的话,这题属于“世界7大难题之一的NP问题” https://baike.baidu.com/item/NP%E5%AE%8C%E5%85%A8%E9%97%AE%E9%A2%98/4934286
只不过由于这道题的选择项比较少5个标签里面选3个或以下,我用排列组合的方法穷举了一边也没花多少时间,但是如果选项增加到十几个或者几十个,靠穷举就几乎是不可能的事了。
登录后方可回帖
你这种游戏玩法,又能玩又能学,老婆不发愁![](/static/editor/dialogs/emotion/images/pp/i_f22.png)