Language agnostic 函数逼近
我有一个功能 p(x0,x1,…,xn) 它将100个整数作为输入,并将一个整数作为输出。P是一个计算速度较慢的函数(其范围从30秒到几分钟) 我需要知道哪些点的值将使p的屈服值最大化 我可以使用什么技术来实现这一点?我知道人们通常使用遗传算法来计算,但我担心用遗传算法来计算会花费很多时间,因为即使是一个很小的群体和几代人(比如说,群体=50,代=50),P的速度非常慢,需要40多个小时来计算 有没有更便宜的方法?也许是一个迭代过程?我不需要它真的是最优的,但我对它的行为没有任何想法(我尝试过线性/二次/指数,但它似乎没有产生任何好的值。我知道P可以返回比我得到的值至少好5-10倍的值) 它应该更容易实现(即,我必须自己实现) 谢谢Language agnostic 函数逼近,language-agnostic,optimization,math,numerical-methods,Language Agnostic,Optimization,Math,Numerical Methods,我有一个功能 p(x0,x1,…,xn) 它将100个整数作为输入,并将一个整数作为输出。P是一个计算速度较慢的函数(其范围从30秒到几分钟) 我需要知道哪些点的值将使p的屈服值最大化 我可以使用什么技术来实现这一点?我知道人们通常使用遗传算法来计算,但我担心用遗传算法来计算会花费很多时间,因为即使是一个很小的群体和几代人(比如说,群体=50,代=50),P的速度非常慢,需要40多个小时来计算 有没有更便宜的方法?也许是一个迭代过程?我不需要它真的是最优的,但我对它的行为没有任何想法(我尝试过线
编辑:p是一个随机过程。:D还是 也许你的算法有很大一部分是可并行的?如果是这样,您是否考虑过并行化您的代码?看看列出的各种随机优化技术。我推荐。有很多著名的全局优化算法(模拟退火、随机隧道等)可以找到全局最大值,但没有一种算法可以保证在不假设函数形状的情况下在合理的时间内找到它
您不会找到一种快速/简单的方法来优化一个100维、非平凡的函数。您将需要大量的处理能力和时间。假设您不想自己编写优化代码(基于您的问题),您还需要一些好的数学软件(如Mathematica)。另一个不太严肃的答案,但值得思考: 这个问题看起来太大了,按理说你应该需要一个SETI@Home努力解决它。成千上万的计算机使这类工作相当轻松。但是我不确定你如何接触到成千上万的计算机用户来获得他们计算机的使用权 事实上,我喜欢。请容忍我暂时无视这一切的合法性 有些人在以前的铁幕后面运行僵尸网络。我最近看到有人提议以70美元的价格租用一个僵尸网络24小时。想想看,成千上万的个人电脑已经准备好接受你的出价了!您可以让他们在您的问题上翻来覆去,而不是让他们使用DDOS互联网站点 不过,关于这一点,还有两条建议:
- 不要用自己的信用卡支付:)
- 不要听取陌生人的法律意见,所以:)
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
const int n=100;//要优化的向量长度
int a[n];//要优化的向量
double P(a){..}//得到向量a的概率。
//这是要优化的函数。
//对于大量的样本
对于(i=0;i
调整它的方法是扩大或缩小提案分布,因此它需要更大或更小的步骤,或者您可以让它先采取更大的步骤,然后再采取更小的步骤。你要寻找的是一个既不太高也不太低的台阶百分比。
您可能希望有一个初始1k左右样本的“磨合”阶段,当它搜索模式区域时,您可以将其丢弃
无论如何,剖面图p。它需要尽可能快 如果您可以访问matlab,您可以非常快速和轻松地并行化代码。即使它可以使简单的线性for循环与parfor循环并行如果微软的解决方案是一个选项,请查看。我在Scott Hanselman的播客()上听说过。作为这类问题的第一行算法,我建议使用模拟退火。SA是一个很好的首选,因为您可以清楚地控制起点和运行时间 如果你对你的100维空间的结构有所了解,使用SA你可以选择一个好的起点,这会对结果的质量产生很大的影响。此外,使用SA,您还可以控制“冷却速率”,这会影响运行时和结果的质量——当然是相反的方向。我通常先以相对较快的冷却速度运行以寻找良好的启动向量,然后在后续运行中减慢冷却速度以改善结果。一种可以自动化的meta SA技术 我已经成功地使用SA来最大化中子质子模型中使用的高维函数