-
-
Notifications
You must be signed in to change notification settings - Fork 194
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feat]: 养成计划体力预估 #323
Comments
有用的链接:BOSS及秘境掉落数据统计 如果作者比较忙的话,我可以抽空写一个养成计划的原型 |
Hi, @Lightczx 利用线性规划求解“通过所需的材料和背包里已有的材料,计算出最优的刷取特定秘境的次数和合成材料的次数”问题的 Demo:https://github.com/FlandiaYingman/Genshin.Planner.Demo 如果你需要某些特定形式的 API,我也很乐意修改这个 Demo,直到它满足需要为止。 我是第一次写 C#,所以代码可能会看起来有点迷糊 :D |
@FlandiaYingman |
@Lightczx |
@Lightczx |
自己实现的线性规划更慢?算法有问题吧?不然时间应该差不多 |
@Lightczx |
@Lightczx |
那就自己实现吧 |
能力有限,无法实现 |
能把具体的运算过程讲解一下么 |
刚想讲解运算过程,在写的过程中发现了算法设计的问题。 你指出的“算法有问题”是对的😭。我为无上界的约束指定的上界是 目前的运算速度:~ 1000 ms,相比于用第三方 native 库的 ~ 400 ms,我觉得时间上已经可以接受了。 纯 C# 实现已经推到 https://github.com/FlandiaYingman/Genshin.Planner.Demo 上了 |
目前没有办法获取秘境入口与秘境的对应关系 |
我 project 里的 数据来源于这个 API:https://genshindb-ia.netlify.app/
|
元数据必须从 ExcelBin 中解析,不接受外界的数据,我们必须对数据源具有控制权 |
抱歉,ExcelBin 是什么? 如果无法获取秘境入口与秘境的对应关系,那么我认为跳过秘境入口名,直接显示秘境名也可以。因为我想大部分玩家都没有看到秘境入口名就能反应该刷哪个秘境的能力,大家都是点开某个材料然后跳转到秘境去的。 |
看了眼他的解析方式 |
只是没办法做秘境和秘境入口吗?有没有什么曲线救国的方式? 如果找不到方法的话就 close 吧 |
秘境的材料是可以做的,秘境入口不行 |
那就先搁置秘境入口,这个不影响整体功能。毕竟只是一个 mapping 的事情,未来如果有方法了随时可以做 |
稍微描述一下算法吧 |
求解线性规划用的是单纯形法,不赘述了。 关于怎么构造的线性规划由于有合成功能的存在,简单地将需求材料数乘以秘境掉落期望数的算法是不完善的。因而,我们需要找到一个最优解,使得消耗总树脂最低,即最大程度地利用背包里的材料。 设 x1, x2, ..., xn 为线性规划的变量,我们用各变量代表一个独立的行为(刷秘境或合成)。所以,线性规划求解完毕后,各个变量的最优值即是我们想要的结果(某个秘境刷 n 次,某种材料合成 m 个,etc.)。特别地,有一个 stock 变量恒定为 1,它的作用是代表背包里的材料。 注意,由于个别材料(例如,突破宝石)有不止一个合成方式,我为每个合成方式都赋了一个独特的 ID(就是合成产物名字后面跟一个计数器而已)。不过我的算法还没实现 BOSS 和掉落产物的对应,所以赋 ID 这一步可以省略。 然后,设 c1, c2, ..., cm 为线性规划的约束,我们用各约束代表各材料。每个材料的表达式是对每个会产出该材料的行为乘以该行为产出材料的期望值求和。注意有些合成行为是消耗材料的,所以该行为产出负数个此材料。最后再加上背包的材料,它用 stock 变量(即 1)乘以背包材料的数量来表示。(实际上 stock 变量放到约束里就是一个常数项而已) 如果我们不需要这个材料,那么在这个约束中,我们使这个表达式大于等于 0,这样就不会有负数材料的出现;如果我们需要这个材料,那么在这个约束中,我们使这个表达式大于等于需要材料数。 最后,使最优化函数=各行为需要消耗的树脂的数量的和,我们要使最优化函数最小。然后求解,结果就出来了 例子约束 c1 代表“高塔孤王的断片” 这个材料有三种获取方式:
以及一种消耗方式:
那么,构造一个表达式,使它表达我们“高塔孤王的断片”的数量:
其中 0.22,0.64 是刷一次对应秘境掉落“高塔孤王的断片”的期望值,1*x3 的意思是合成一次“高塔孤王的断片”可以获得 1 个“高塔孤王的断片”,- 3*x4 的意思是合成一次“高塔孤王的碎梦”会消耗 3 个“高塔孤王的断片”。 由于线性规划中不允许常数项的出现,我们使 stock 变量恒为 1,然后把 所以,最后的约束
一些 Trick
这些树脂仅在最优化函数中表达,等我们最后计算需要多少树脂的时候,对 x1, x2, ..., xn 乘以对应行为需消耗的真实树脂求和,重新计算一遍就可以了。 |
低等级的秘境应该无论如何材料掉的都比高等级的少吧 |
本人沒用過Hutao,也對C#不熟,單純朋友傳給我這個issue,我覺得挺有意思,想要發表一下我的淺見: @FlandiaYingman 在取樣少的時候,用什麼方法算意義都不大,刷本/合成送材料的隨機性,對於運氣好或不好的人都是"計算不准",偏多或偏少;取樣多的時候就直接用期望值算,不會差到令使用者無法接受。 @Lightczx
補充: 我的意思不是該功能並不實用,而是我認為用一個更簡單的方法實現,達成「幫助使用者預估需要多少樹脂」的目標就是好方法。 |
我在一开始提出该方法时确实没有经过太多的实践, |
误差是不可避免的 但是我们还是需要一些domian的Datas 我觉得 @FlandiaYingman 提供的算法example进过改良之后还是可以达到预期内的时间 我还需要一点时间来熟悉示例代码 我也需要寻找更多的能够维持正常更新的domain datas |
This comment was marked as outdated.
This comment was marked as outdated.
Internal Only |
以当前胡桃的用户量,可以考虑通过胡桃收集副本挑战掉落材料,样本量充足且数据源可控。
同时可以结合胡桃云激励时长,鼓励用户上传副本数据。收集到充足样本后,使用简单的期望估计即可解决问题。期望值可以根据背包中物品数量进行迭代而不断修正 当然也可以选择更精确的统计模型进行计算,只要样本充足,都可以实现(实际上,基于大量样本的简单期望估计一定比线性规划更准确,理由是在精确概率不可知的情况下,参数越少受误差影响越小) 此外,可以视样本的收集率,选择一定长度的滑动时间窗口进行概率估计。此举可保证即使官方暗改了概率,应用也可以自适应概率的变化。更进一步,还可以对时间进行水平划分,通过大量样本计算是否存在所谓的“玄学时间” |
掉落概率其实是固定的,现在是元数据没准备好 |
Tracked by #1394 |
This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related topic. |
背景与动机
目前的养成计划只提供了:
(似乎背包物品和材料清单没有任何功能上的关联?例如:我的背包里有某个养成计划中所需的材料,不会改变材料清单上的数字。不确定是不是我使用方法有问题)
如图所示,我已在背包里设置了这些材料,但没有反映在材料清单功能中。
作为一个用户,我希望养成计划功能能够提供一些具体的方案(如下所示)来养成角色。因为这样可降低用户的思考量或计算量,使养成过程更加便捷。
想要实现或优化的功能
“具体的方案”如下:
The text was updated successfully, but these errors were encountered: