从(几乎)随机数据中找到最佳结果的方法

时间:2017-04-30 13:02:51

标签: python algorithm heuristics

因此,我正在为我玩的游戏开发一些计算器 - 为了好玩,它具有不同的冷却时间,使用时间,可以在其他地方使用的百分比等各种能力......

到目前为止,我通过分析基础中的数字来做到这一点,但我有很多能力,所以例如假设我在4秒内使用了5个技能:

<00> 0000:60伤害(使用异能0,试图再次使用但失败 - 所以返回能力伤害为0)

0001:60点伤害

略过几句......

0101:200伤害

再次......

伤害4444:70。

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

问题是,在暴力中这样做很好地适用于很短的时间(如上)和数量或能力,但是在更高的时间和数量的能力下它分析数万亿的模拟,这意味着蛮力不再成为一种选择。

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

感谢您的回复:)

1 个答案:

答案 0 :(得分:0)

让我重新确认一下,以确保我理解正确:你想找到最好的技能排序,考虑到他们的个人伤害和冷却时间,这样每次只使用一种技能,并且没有比使用技能更频繁地使用技能冷却允许。如果是这样,这是一种调度问题,一种方法是通过linear programming

粗略的想法是引入n_skills * simulation_length个变量x[skill][time],每个变量约束在0和1之间,并在skill时解释“使用技能time if {{ 1}},不要使用if x[skill][time] == 1“。现在,您可以在其他线性约束(通过== 0解释 - 类似伪代码)下优化由其技能造成的损害加权的所有变量的总和sum(x[skill][:] * damage[skill] for skill in skills)

  1. 每次numpyt(每次最多只能使用一项能力)
  2. 适用于每种能力sum(x[:][t]) <= 1和时间a t0(在冷却期间,您最多只能使用一次能力)
  3. 现在最棘手的部分是,虽然这会给你一个在某种意义上最优的解决方案,但它很可能不是物理,那就是你会得到小数sum(x[a][t0-cooldown(a):t0+cooldown(a)] <= 1秒。这是启发式部分开始的地方,你必须找到一些方法将解决方案“整合”到整数,在过程中失去客观价值,使其在物理上(游戏合法)有意义。一种方法是仅保留x,并将所有其他数字舍入为零。它将提供一个有意义的解决方案,但它可能不会令人满意(即你的角色几乎什么都不做)。鉴于我的问题模型非常简单,我希望有一些关于如何进行良好舍入的理论结果。

    虽然我可以建议scipy package解决线性程序,但是构建约束矩阵和舍入结果(甚至是简单的)的整个问题不是初学者级编程任务。