- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想使用模拟退火在某个预定义的区间内找到单变量多项式函数的局部最小值。我也想尝试找到二次函数的全局最小值。
像这样的无导数算法不是解决问题的最佳方法,因此仅供学习。
虽然算法本身非常简单,但我不确定如何在一维或 n 维空间中有效地选择邻居。
假设我正在寻找函数的局部最小值:2* x^ 3+ x+ 1 在区间 [-0.5, 30] 上,并假设区间减少到每个数字的十分之一,例如 { 1.1, 1.2 ,1.3 , ..., 29.9, 30}.
我想要实现的是随机游走和从起点到能量较低的点的收敛速度之间的平衡。
如果我每次都只是从给定的区间中选择随机数,那么就没有随机游走,算法可能会绕圈子。相反,如果下一个点是通过简单地以相等的概率加或减 0.1 来选择的,那么该算法可能会变成穷举搜索——基于起点。
我应该如何有效地平衡单维和 n 维空间中的模拟退火邻域搜索?
最佳答案
所以你试图找到一个“随机”靠近另一个 n 维点 P 的 n 维点 P';例如,在距离 T 处。(由于这是模拟退火,我假设您会偶尔递减 T)。
这可行:
double[] displacement(double t, int dimension, Random r) {
double[] d = new double[dimension];
for (int i=0; i<dimension; i++) d[i] = r.nextGaussian()*t;
return d;
}
输出随机分布在所有方向并以原点为中心(注意 r.nextDouble()
倾向于 45º 角并以 0.5 为中心)。您可以根据需要通过增加 t
来改变位移; 95% 的结果将在原点的 2*t 范围内。
编辑:
要在给定点附近生成一个位移点,您可以将其修改为
double[] displaced(double t, double[] p, Random r) {
double[] d = new double[p.length];
for (int i=0; i<p.length; i++) d[i] = p[i] + r.nextGaussian()*t;
return d;
}
您应该对所有调用使用相同的 r
(因为如果您为每个调用创建一个新的 Random()
,您将不断获得相同的位移)。
关于java - 如何在 1 维和 n 维空间中有效地选择邻居进行模拟退火,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30786439/
我正在按照 PCL 文档的教程计算 2D 凸包 see here . 我有一片云和一些指数,将它们投影到具有给定系数的平面上,然后计算凸包。这是代码: PointCloud::Ptr tmpInlie
我想使用模拟退火在某个预定义的区间内找到单变量多项式函数的局部最小值。我也想尝试找到二次函数的全局最小值。 像这样的无导数算法不是解决问题的最佳方法,因此仅供学习。 虽然算法本身非常简单,但我不确定如
我正在寻找任意值的 2 维和 3 维索引的快捷方式,我知道这适用于给定数组 a[] #define a(i,j,k) a[(i)*span*span+(j)*span+(k)] #define b(i
我有一个形状为 [12, 8, 5, 5] 的 numpy 数组。我想修改每个元素的第 3 维和第 4 维的值。 例如 import numpy as np x = np.zeros((12, 80,
我是一名优秀的程序员,十分优秀!