函数逼近

我有一个函数,

P(X0,X1,...,xn)映射

该需要100整数作为输入,并给出作为输出的整数。 P是一个缓慢的函数来计算(它的范围可以从30秒到几分钟)。

我需要知道这点的值将最大限度地从体育中得到价值

我可以使用哪些技术来做到这一点? 我大致知道的人使用遗传算法这一点,但我害怕它会带年龄与他们计算它,因为即使是一个小群体和几代人(比方说,人口= 50,代= 50),P是这样慢将超过40小时来计算的。

有没有做这件事的任何便宜的方法? 也许一个反复的过程? 我并不需要它是真正的最佳,但我没有了它的行为的任何IDEIA(我试过线性/平方/指数,但它似乎并没有产生任何好的价值观。我知道P能返回值至少5-10倍的比我得到)。

它应是一种更容易实现(也就是,我必须实现它自己)。

谢谢

编辑:P是一个随机过程。

--------------解决方案-------------

作为第一线的算法这类问题,我建议模拟退火。 SA是一个伟大的选择,因为你可以清楚地控制你的出发点和运行时间。

如果你知道一些关于你的100度空间的结构,SA你可以选择一个很好的出发点,可能对你的结果的质量有很大的影响。 还与SA可以控制的“冷却速度”,这同时影响运行时间和结果的质量 - 自然在相反的方向。 我通常与相对快的冷却速度运行第一寻找良好的出发载体,然后减慢在随后的运行中的冷却速度来改善的结果。 样的,可自动化的元SA的技术。

我用SA成功,最大限度地过去模拟中子质子相互作用使用了非常高维的功能。

另外,我会注意尺寸减少P(),如果可能的话。 为了您的具体问题,都在100变量需要的? 如果你能解决的1/2,你会加快任何优化,并最终获得更好的结果。

(和SA很容易实现。)

模拟退火,密切相关的马尔可夫链蒙特卡罗(MCMC)。 你可能想变体是大都市,黑斯廷斯。 当你得到它的窍门,这是相当不错的。 可能有一些方法来优化它,因为你的投入和结果都是整数。 它是计算密集型的,可能需要一些调整,但它是相当强大的,而且我不知道其他的方法可以做的更好。

下面是一些脑死亡的代码来做到这一点:

const int n = 100; // length of vector to optimize
int a[n]; // the vector to optimize
double P(a){..} // Get the probability of vector a.
// This is the function to optimize.
// for a large number of a samples
for (i = 0; i < large_number; i++){
// get P(a)
double p = P(a);
// for each element of vector a
for (j = 0; j < n; j++){
// get an amount by which to change it. This choice has to be symmetric.
// this is called the Proposal Distribution
int step = uniform_random_choice_from(-2, -1, 1, 2);
// make the change to a[j], and get p1, the new value of p
a[j] += step;
double p1 = P(a);
bool bKeepTheStep = true;
// if p1 is better than p, keep the step
// if p1 is worse than p, then keep the step p1/p of the time
if (p1 < p){
bKeepTheStep = (unif(0,1) < p1/p);
}
if (bKeepTheStep) p = p1;
else a[j] -= step;
}
// now a is a sample, and p is its value
// record a and p
}
// what you have now is a large random sampling of vectors from distribution P
// now you can choose the best one, the average, the variance,
// any statistic you like

方法来调整它要扩大或缩小的建议分布,所以需要更大或更小的步骤,或者你可以把它最初采取更大步骤,然后小步。 你要找的是什么的保存,既不太高,也不太低步骤的百分比。 你可能想拥有你扔掉初始1K左右的样品的“老化”阶段,而它会寻找该模式的区域。

而通过各种手段,简介P.它需要尽可能快。 这是我最喜欢的方式来做到这一点。

也许你的算法的一个显著一部分是可并行化? 如果是这样,你有没有考虑并行代码?

看看这里所列出的各种随机优化技术。 我建议模拟退火。

有很多著名的全球优化算法(模拟退火,随机隧道,等...),可以发现,全球最大的,但没有被保证在合理的时间量发现它没有作出假设的形状功能。

你不会找到一个快速/简单的方法来优化100维,非平凡的功能。 你需要大量的处理能力和时间。 假如你不想写优化自己的代码(根据你的问题),你也需要一些好的数学软件(如数学)。

另一个没有完全认真的回答,但深思:

这个问题看起来是如此之大,由权利,你应该需要的东西就像一个在SETI @ Home的努力来解决它。 数千台计算机做这种事情的合理轻工作。 但我不知道你如何到达成千上万的计算机用户,以获得使用自己的电脑。

其实,我做的。 请无视这一切的合法性和我一起承担了一会儿。

还有一些人躲在前铁幕运行僵尸网络。 我最近看到的报价租一个僵尸网络$ 70 24小时。 试想,成千上万0wned电脑准备好你的吩咐! 而不是让他们DDOS互联网网站,你可以让他们搅动你的问题。 :)

建议这一点,虽然两个最后位:

  • 不支付他们用自己的信用卡:)
  • 不要因此,需要法律咨询陌生人:)

祝你好运!

假设:

首先 - 变量必须是整数。
第二 - 目标函数P()是非线性的。

观察:

在一般情况下,非线性整数编程非常难以解决。 在现实中,如上文所建议,四舍五入通过放松整数限制可能有助于解决方案。

有可用一般无约束的优化技术。 来自实验设计一种方法是调用“响应曲面法”。 当实验的成本是显著非常有益的。 该方法是通过从1开始点和由一组增量偏离每个您输入来运行一组实验。 然后计算每个输入梯度,并采取在这个方向的每一个步骤,然后重复。 弗莱彻 - 优化和Box亨特猎人统计实验者的实用方法是寻找的地方。

神经网络:D或泰勒级数?

嗯,不知道,我同意,在所有的气体'一般'使用。 而且,由于你无法描述你的问题,任何一个细节是很难提供具体建议。 您的问题可能是适合于,例如,整数规划(线性规划的整值的问题的变体)。 或者,你可能会得到一个足够好的近似用线性规划和舍入的输出,以离他们最近的整数。

你可以通过任何'容易'功能近似P + 当“最简单的”是多项式,和'容易'将是连续可微。 换句话说,你能解决解析近似为P?

不管结果如何,你懂得越多,而在乎告诉我们,大约数p作为的输入的功能,更好地我们的帮助可能。 出于某种原因,你知道,P能比当前得到更好的回报价值 - 那是什么原因呢?

最后,您可以通过谷歌搜索软件运筹学,优化,线性规划,之类的关键字取得了一些进展。

此致

标记

如果你有机会到MATLAB,您可以并行你的代码非常快,非常容易。 即使它可以使简单的线性for循环parallell其PARFOR循环

如果微软的解决方案是一个选项,检查出求解基础。 我听说过斯科特Hanselman的播客(#191)。

分类:语言无关 时间:2015-03-14 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.604 (s). 10 q(s)