algorithm - GNU 模拟退火

标签 algorithm c arrays gnu generalization

我正在使用这里给出的模板程序:

https://www.gnu.org/software/gsl/manual/html_node/Trivial-example.html

他们提供的程序可以完美地编译和运行,这很好。我想做的是推广此方法以找到具有任意数量参数的函数的最小值。

一些粗略的阅读表明,度量函数 (M1) 仅用于某些诊断和打印情况,因此或多或少可以忽略。剩下的就是适本地定义 E1 和 S1。不幸的是,我对使用指针和 void 的了解并不完整,所以我一直在尝试将配置“xp”升级为参数数组,而不是单个 double 。

我天真地试着从

double x =  *((double *) xp);

double x =  (*((double *) xp))[0];

在适当的地方,但显然那没有用。我确定我错过了一些愚蠢的东西,所以任何提示都会很好!显然,我将定义自己的 E1 输出函数,该函数将采用这 N 个参数并返回一个数字。

最佳答案

所提供链接中的底层算法 gsl_siman_solve() 已被推广以处理任何数据类型。这就是为什么总是在使用前将无处不在的 xp 参数强制转换为双指针的原因。如果所有回调都正确编码,那么使用任何结构或数组或数组数组应该很简单,而不是简单地加倍。

问题是 gsl_siman_solve() 似乎只支持标量双步长、初始猜测和“统一”值(来自 gsl_rng_uniform()),所以您需要将标量 double 值映射到自然多维量。这样做是可以的,但是比较麻烦,不太灵活。在您的情况下,映射将在 S1() 中完成。

这类似于将十进制数的数字映射到多维空间:例如,个位代表 X 轴,十位代表 Y 轴,百位代表 Z 轴。通过递增一个整数,可以遍历整个 3D 空间,从 (0, 0, 0) 到 (9, 9, 9)。您不必使用整数和 10 的幂,并且组件甚至不必具有相同的范围,但打包值的每个组件的范围存在固有限制。实际上,您可以反过来执行此操作:获取一个 double 标量并将其解包为多个数量。

最后,您的代码 double x = (*((double *) xp))[0]; 将不起作用,因为您正试图将 double 取消引用为数组,而不是指针加倍,这样就可以了。换句话说,问题出在第一个 * 上。

关于algorithm - GNU 模拟退火,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29414384/

相关文章:

javascript - 无法拼接子数组

c - 相差至少 K 的数字对的数量

algorithm - 是否有匿名的、可变的、安全的投票算法?

c - 获取 X11 窗口标题高度

c - 有多大的结构可以有效地按值传递?

c - 如何更改分组密码算法的密文和明文长度

c++ - 我可以在 if 语句中枚举变量吗?

c - 找到没有重复元素的最大矩形

javascript - 如何检查多维数组是否具有特定数组?

JavaScript 数组 - 有效地计算给定时间间隔内的平均值