【发布时间】:2009-10-12 09:02:18
【问题描述】:
设置如下:
我有一个可以成功或失败的算法。 我希望它以尽可能高的概率成功。 成功的概率取决于一些参数(和一些外部环境):
struct Parameters {
float param1;
float param2;
float param3;
float param4;
// ...
};
bool RunAlgorithm (const Parameters& parameters) {
// ...
// P(return true) is a function of parameters.
}
如何(自动)以最少的调用次数找到最佳参数 RunAlgorithm ? 我会特别高兴有一个 readl 库。
如果您需要有关我的特定案例的更多信息:
- 成功概率是参数的平滑函数,具有单一全局最优值。
- 大约有 10 个参数,其中大部分是独立可调的(但有些是相互依赖的)
- 我会在一夜之间运行调整,我可以处理大约 1000 次运行算法调用。
澄清:
最佳参数必须在一夜之间自动找到,并在白天使用。 外部环境每天都在变化,因此不可能一劳永逸地计算它们。
更多说明:
RunAlgorithm 其实就是玩游戏的算法。它与固定的对手进行一整场比赛(围棋或国际象棋)。我可以在一夜之间玩 1000 场比赛。每晚都是另一个对手。
我想看看不同的对手是否需要不同的参数。
RunAlgorithm 是平滑的,因为稍微改变参数只会改变一点算法。
可以通过具有相同参数的大量样本来估计成功概率。 但是在不改变参数的情况下运行这么多游戏成本太高了。
我可以尝试独立优化每个参数(这将导致每个参数运行 100 次),但我想存在一些依赖关系。
整个问题在于如何明智地使用稀缺数据。
玩的游戏非常随机,这没问题。
【问题讨论】:
-
请指定您使用的语言。
-
语言无关紧要。我可以将 RunAlgorithm 作为单独的可执行文件,并通过配置文件或命令行获取参数。
-
也许你想多描述一下算法。
-
算法是和一个固定的对手玩游戏,输赢。参数控制搜索、评估和算法的不同方面。
-
当然这在参数上通常是不平滑的,如果你的玩家是确定性的,那么这个函数对于某些参数将是 0,对于其他参数是 1。即使它们不是确定性的并使用 RNG,该函数也很难平滑,这将是分段常数。请清楚您要达到的目标。具有离散估值(例如,基于 3 次运行)的遗传算法应该可以在恕我直言。
标签: algorithm parameters performance