本帖最后由 rickhunter 于 2023-8-16 15:00 编辑
一、前言
上次发帖 之后,收到了广大c友的热烈反响,首先感谢支持的c友,祝你们把把出完美自定义,词条条条是80。当然也收到了很多宝贵的建议,本帖也是基于上一贴的Todo和建设性的建议撰写,还请各位看官多多捉虫,口下留情。
二、Todo List完成情况
由于工作较忙,整体进度较慢,基本只能在下班后以及周末抽时间写代码,目前完成情况如下:
1. 【完成】优化模拟技能序列部分的算法,同时接受各位阿修罗大佬的监督,看看模拟的技能数是否正确
2. 【完成】系统性的尝试模拟阿修罗在各个时间轴上,各个cdr配装,各个符文下的伤害趋势、技能分布
3. 【完成】日常配装对比
4. 【鸽了】其他职业信息的添加,机制开发,考虑基于时间轴的伤害倍率开发(太阳+机制)etc.
三、寻优算法优化
上贴精华提炼下:通过随机抽取可用技能的方式,模拟一个确定时间轴T下的技能队列Q。重复尝试该过程,则可以获得特别多的技能队列[Q1, Q2, Q3, ……, Qn],计算每个技能队列的伤害值,挑选出最大的,就可以找到该时间轴T下的伤害最大的技能队列Qmax。该方法虽然在足够多的次数下,大概率能获得最优解,但是依旧有较高的随机性。在后续的评估中,楼主发现循环30w次仍不足以获得最优解,甚至连续两次模拟结果的最优伤害都会有一些差别。同时30w次模拟在楼主12900k的cpu上也需要跑将近40s,上贴中最后的给出的符文配装模拟最优解甚至需要跑10个小时,实在难以应用。不论从最优解稳定性、准确性以及效率任何一个方面考虑,优化算法是必须要做的,并且收益也是最高的。
所以本次算法优化借鉴了热心c友的宝贵意见和建议,尝试采用贪心算法来实现寻优。贪心算法思路简而言之就是在每次迭代时,总是挑选最好或者最优的选择;并且由于考虑到柔化技能的存在,将柔化技能组合为技能组,与其他单个技能一起进行遍历和寻优。为了支持上述功能,重构了除基础技能配置外的所有设计(约等于重写了一遍)。伪代码实现如下:
total_time = 40s # 设定初始化时间轴
time_line = 0s # 初始化时间轴
init(all_skill_set) # 初始化所有技能组,将可柔化的技能组合在一起,示例如下:[[炸热,无双,不动],[无双,不动], [炸热], [无双], [不动]]
init(skill_status) # 初始化技能状态
for start_skill_set in all_skill_set: # 遍历所有技能组
start_skill_set.action(skill_status) # 执行第一个技能
while True: # 算法寻优,寻找下一个直到最后的最优技能队列
1. judge_stop(time_line, total_time) # 判断是否停止寻优
2. choice_best(skill_set, skill_status) # 根据当前技能状态,选择最优的skill_set
3. best_skill_set.action(skill_status) # 执行最优技能,并更新skill_status
4. update(time_line) # 更新时间轴
可以看到,整个逻辑和之前的随机寻优差别不大,最大的地方在于choice_best方法,也就是本贪心算法的目标如何设置,这里省略楼主重复了很多次的实验,最终给出一个目前得到的最优目标优先级
- 如果技能可以打就直接打(哪里亮了点哪里)
- 如果有多个技能亮了,则根据所有可以打的技能的优先级来选择技能。技能优先级计算方式:剩余时间是否可再至少打一次相同技,如果可以多打一次相同技能,则使用该技能的伤害/打完该技能的时间作为排序依据,如果剩余时间不能再打一次该技能,则使用该技能的秒伤/打完该技能的时间作为排序依据
OK,完整寻优思路已经确定,目前来看,该算法能稳定复现目前最优技能队列,甚至在40s场景跑出了之前随机算法在30w次迭代下都没找到的最优技能队列,以及帮助楼主打桩手法改进,比原本多塞了1发小火,233333。从性能上来看,该方法优势巨大,原本需要10个小时的任务,用该算法,在配装更多的条件下,也只需要7分钟即可全部完成!
四、阿修罗如何才能打高?
在开始这个篇章前,楼主先重申和强调一件事,即本篇章的所有内容基于如下前提:
职业阿修罗、不考虑1觉xx和闪枪天兆光翼、不考虑其他被动技能、不考虑实战空转、相对极限的反应(0.1s)模拟的初衷是为了更好的了解这个职业在不同场景、不同装备、技能加点下的理论性能。至于如何玩,还是看技师,请勿断章取义,随意打碟!
4.1 基本信息介绍
本次模拟配装如下表所示,完美自定义配装下的所有词条都是完美并且异常均为自身方便出发的感电、出血;自有自定义配装则为目前我阿修罗号上有的装备,词条有中毒,所以在搭配毒腰时武器贴膜3词条会调整为4%技工,而在其他搭配下,武器3词条会调整为3技工+攻击中毒
完美自定义 | 完美自定义 | 完美自定义 | 完美自定义 | 完美自定义 | 完美自定义 | 完美自定义 | 完美自定义 | 自有自定义 | 自有自定义 | 自有自定义 | 自有自定义 | 自有自定义 | 自有自定义 |
半血 | 标准空血 | 黑白戒静谧腰空血 | 雷达静谧腰空血 | 空血毒腰 | 无cdr空血 | 七自定义空血,金币项链 | 标准七自定义空血 | 无cdr空血 | 毒腰空血 | 黑白戒空血 | 雷达戒空血 | 半血 | 标准空血 |
| | | | | | | | | | | | | |
本次模拟考虑的加点方式:
不动加点、大冰加点、大火加点、冰火加点
本次模拟考虑的护石:
不动、大冰、大火、呀呀呀、炸热、雷云
本次模拟考虑的符文组合:
上述护石选3个组合后,遍历所有3红、3蓝、3紫组合
本次模拟考虑的时间轴范围:
20s, 25s, 30s, 35s, 40s, 45s, 50s, 55s, 60s
最终,以上所有组合数为108864种,模拟程序全部跑完耗时1小时15分钟,基础信息交代完毕,接下来就是show time
4.2 各个时间轴最优组合
最优组合明细 | 最优组合技能伤害曲线 |
| |
具体的数值分析就不过多赘述了,只提一点,不同时间轴想得到最大伤害,那么技能队列也不是相同的。
4.3 护石组合分析
护石组合备选也是从常用的护石组里做组合数,任意取3个组成护石组
各个护石组合在不同时间轴上的平均伤害 | |
各个护石组合在不同时间轴上的平均排名 | |
护石组合有些出乎意料,所有时间轴上,都是炸热+不动+呀呀呀的组合最优,在个别时间轴上,炸热+不动+雷云才比较接近前者,所以对于会控云的技师来说,追求极限的不二推荐就是炸热+不动+呀呀呀,对于懒人来说推荐炸热+不动+雷云的组合
符文不同护石组合、不同时间轴、不同配装上的都有些许不同,种类太多了就不放出来了,如果有需要看明细的,在本文最后的明细数据里自行查阅。主要来说都是为了保证对应的护石技能多打1次 or 伤害最大
4.4 加点分析
本次加点主要有4组候选,一般来说,瞎子的加点主要取舍就是45、60、70,所以加点体系也分为这三个,不动加点、大冰加点、大火加点。另外加入了助手上排名靠前的瞎子们的常用加点,冰火加点。由于sp限制,不动加点和冰火加点需要各自放弃满一个中低阶技能,这边基于模拟实际的技能占比选择了占比最低出现次数最低的无双,分别有7.67%和60.54%的无双波技能伤害惩罚,已经考虑在模拟中了
不同加点在不同时间轴上的平均伤害 | |
不同加点在不同时间轴上的平均排名 | |
不动加点体系毫无疑问的强势,搭配对应的护石体系,不动加点在20-60s所有时间轴上的表现都是碾压级别,形态有点差感觉可以忍忍了
4.5 cdr配装分析
cdr配装不再赘述,具体信息参考上面给出的计算器截图,这里主要纳入了不同流派的不同cdr,并非要做一个流派强度分析
不同cdr配装在不同时间轴上的平均伤害 | |
不同cdr配装在不同时间轴上的平均排名 | |
可以看到,完美自定义配装,金币项链的低cdr(只有0.95宠物+手搓+腰带15恢复)的情况下,要比传统的原子核项链更加优秀。这个特性在其他配装上也有部分证明,例如半血也是低cdr(0.95宠物+手搓+15cdr),标准空血(和金币项链空血cdr一样)强度都还比较靠前,而c站之前推荐的毒腰,或者黑白戒在各个时间轴上都不强势,反而是更高的cdr雷达戒(叠满42恢复和出血40接近)表现更好。结合上述信息,可以初步推测,阿修罗这个职业的cdr需求呈现两极化趋势,即低cdr15%左右或者高cdr32%左右能相对较好的体现出瞎子的优势
4.6 手搓分析
是否手搓在各个时间轴上的平均伤害 | |
是否手搓在各个时间轴上的平均排名 | |
还是很明显能看到手搓全线占优,当然优势不是非常大,不过对于喜欢用操作来换伤害的技师来说,手搓依旧是不二之选。手搓+控云,嗯,后期还考虑加入切换冰龙武器的考量,没有最繁琐,只有更繁琐。
4.7 分析总结- 除了上述分析中推荐的cdr搭配、加点、护外,最核心的装备搭配楼主不建议各位按照这里给出的完美自定义去搭配装备,因为从楼主的自有装备配装的模拟可以看到,不同的自定义差别会对最终的结果有较大影响,到底自己身上装备该如何搭配才能获得最大伤害,还得根据自身配装实际跑下模拟才好。以楼主自身为例,参考目前的模拟数据,楼主主要考虑20-40之间的最优搭配,半血和雷达戒均可,再辅以抢伤害来考虑,楼主最近选择了手搓+半血+不动护石+炸热护石+呀呀呀护石+红紫呀呀呀符文+蓝不动符文的搭配
- 本次分析也有些地方没有考虑到,例如boss的血量是固定的,伤害并不是越高就一定越好,每种搭配下的伤害曲线也可以进行一些分析,例如对出伤速度做一个评估,可以指导配装更加倾向于“抢伤害”等等。以及技能模拟目前并没有考虑技能打完完整伤害的时间,例如炸热、雷云解放这类脱手且有后续伤害的技能在模拟中都是当做打出完整伤害来看的。这些更加细分的工作就留给各位自己去分析了,数据都在最后的云盘里,希望大家也欢迎大家来捉虫,尤其是对于技能队列是否能实际打出来这个事,楼主始终没有办法完全保证一定完全对,因为精力的问题没办法对每个搭配下的每种加点,每个时间轴都去打一遍桩,从而发现一些边界问题。如果有兴趣的小伙伴能找到技能队列的badcase,以及自己的实际打桩录像是最好的
五、总结
模拟的初衷是为了根据已有的装备,找到搭配最合理,伤害最高组合的参考(因为本身模拟就有很多限制,并不能完全实现游戏中的机制)。当然想要遍历所有装备搭配以及伤害排名也是可以做的,只不过意义不大,且计算量的确不小。本帖所有数据和推论都只适用于章节四中的前提假设
职业阿修罗、不考虑1觉xx和闪枪天兆光翼、不考虑其他被动技能、不考虑实战空转、相对极限的反应(0.1s),切勿套用在其他职业,其他搭配上。
六、Todo
继续开坑,后续主要工作有:
- 加入宠物技能、太阳等增伤机制
- 手搓鞋,肩膀等手搓cdr特性支持,包括百分比职业手搓与轻武器cdr加算支持等
- 继续优化算法和寻找算法bug
- 冰龙武器加入的评估
- 尝试加入剑魂的模拟
Reference
代码仓库:ricklovelisa/dnf_skill_sim (github.com)
本次模拟的所有结果数据:
https://pan.baidu.com/s/1nVnIel0FB0MwwtUM6AN6xg 提取码: rkgw