【问题标题】:Method for finding best result from (almost) random data从(几乎)随机数据中找到最佳结果的方法
【发布时间】:2017-04-30 13:02:51
【问题描述】:

所以我正在为我玩的游戏开发一些计算器——为了好玩,它需要不同的技能,不同的冷却时间、使用时间、可以使用的百分比等等......

到目前为止,我通过分析基础数字来做到这一点,无论我拥有多少能力,例如假设我在 4 秒内使用了 5 个能力:

0000:60 伤害(使用技能 0,尝试再次使用但失败 - 所以返回 0 技能伤害)

0001:60 伤害

跳过一些...

0101: 200 伤害

又...

4444:70 伤害。

进程终止。 - 希望这是有道理的。

问题是,以蛮力执行此操作适用于小时间(如上)和数量或能力,但在更高的时间和能力数量上,它运行分析数万亿次模拟,这意味着蛮力不再成为一种选择。

问题是,考虑到数据大多是随机的,是否有任何启发式算法(所有人都认为可能不会返回最优)会返回相对较好的结果。

感谢您的任何回复:)

【问题讨论】:

  • 到目前为止您尝试过什么?当您遇到特定的编程问题时,我们会为您提供帮助,而不是创建完整的解决方案 :)(专业提示:搜索“按位运算”)
  • 我已经让实际程序本身尝试蛮力并尝试随机路径 - 就是这样。想问这种类型的问题有没有更方便的解决方案?
  • 它仍然太模糊和不清楚......可能是您的数据库的一个小样本集,分享+ 2个实际状态示例以及更好的描述以及为什么是一个好主意。 .. 我们(包括你在内)可以开始思考启发式方法

标签: python algorithm heuristics


【解决方案1】:

让我换个说法以确保我理解正确:您想找到最佳的技能顺序,考虑到它们各自的伤害和冷却时间,这样每次只使用一种技能,并且没有比使用频率更高的技能冷却时间允许。如果是这样,这是一种调度问题,一种解决方法是通过linear programming

粗略的思路是引入n_skills * simulation_length变量x[skill][time],每个约束在0和1之间,解释为“使用技能skill在时间time if x[skill][time] == 1, don't use if @ 987654328@"。现在,在额外的线性约束下(通过类似numpy 的伪代码解释),根据他们的技能造成的伤害来优化所有变量的总和,sum(x[skill][:] * damage[skill] for skill in skills)

  1. 每次tsum(x[:][t]) <= 1(每次最多可以使用一种能力)
  2. 每个技能a和时间t0sum(x[a][t0-cooldown(a):t0+cooldown(a)] <= 1(在其冷却期内,您最多只能使用一次技能)

现在棘手的部分是,虽然这会为您提供某种意义上的最佳解决方案,但它很可能不是物理,即您将得到分数xs。这就是启发式部分的作用,您必须找到某种方法将解决方案“四舍五入”为整数,在此过程中失去客观价值,使其在物理上(游戏盟友)有意义。一种方法是只保留x[a][t] == 1,并将所有其他数字四舍五入为零。它会给出一个有意义的解决方案,但它可能不是很令人满意(即你的角色几乎什么都不做)。鉴于我的问题模型非常简单,我希望有一些关于如何进行良好舍入的理论结果。

虽然我可以建议 scipy package 在线性规划制定后解决它,但构建约束矩阵和舍入结果(即使是微不足道的)的整个问题并不是初学者级别的编程任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多