c# - 比反复试验更有效地优化多个变量的算法

标签 c# algorithm optimization multivariate-testing

Google 在这方面的结果似乎需要比我熟悉的更高级的数学(我可能不比五年级学生聪明,但我不打算找出答案)。

我正在寻找一种解决多变量优化问题的通用方法,最好是在 C# 中,而不必深入研究矩阵、特征向量和正态分布。

假设我有数值变量 xyzw 和函数 f 使得 w = f(x, y, z)。我想最大化 w,并且...

  • f 未知
  • xy 和/或 z 之间的相互依赖性(如果有) , 未知
  • 在某些情况下,我只有事后数据集
  • 在其他情况下,我可以改变 xyz 以及按需重采样w
  • 在先验情况下,理想算法最大化 w 并用最少的 x 试验排列, y,z,并在每一轮采样后为每个选择下一个值

我有自变量的粗略最小和最大界限。我当然不想对排列空间进行不必要的采样。我希望该算法至少具有检测最明显的相互依赖性的粗略能力,例如,当x 时 yield 递减2y,或者当 x 的总和时 w 的实际恶化yz 超出了某个上限等。

我看过的大多数数学库都假设我知道如何在 Boigenfoodle Continuum 上执行量子 nergenflip 投影,而我只是不在那里。非数学家编码员将如何完成此任务?

最佳答案

如果不想陷入局部极小值,可以尝试模拟退火。

基本上,从一些 x,y,z 开始。从零均值分布(正态分布或高斯分布)中随机生成 dx、dy 和 dz。如果 w(x+dx,y+dy,z+dz) > w(x,y,z) 然后选择这个新的解决方案。否则选择概率w(x+dx,y+dy,z+dz)/w(x,y,z)。

Python代码

def simAnneal( w, seed_x, numSteps=100000, sigma=0.01 ):
    optimal_x = [i for i in seed_x]
    optimal_w = w(optimal_x)

    cur_w = w(seed_x)

    for i in range(numSteps):
        new_x = [i+random.gauss(0, sigma) for i in seed_x]
        new_w = w(new_x)

        if (new_w > cur_w) or (random.random() > new_w / cur_w) :
            cur_x = new_x
            cur_w = new_w
            if cur_w > optimal_w:
                optimal_w = cur_w
                optimal_x = cur_x
    return optimal_x

关于c# - 比反复试验更有效地优化多个变量的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10627886/

相关文章:

c# - 从 Twitter 搜索的搜索实体获取结果

c# - 多步 OLE DB 操作产生的错误

algorithm - 动态规划 - 带乘法器的板

c++ - 是否可以使用迭代器实现递归算法?

android - 如何在 pre-2.2 Android 中禁用布局优化?

c# - 现代图形用户界面开发

c# - 从动态创建的文本框创建新属性

c++ - 通过网络直接从另一台计算机的内存中读取文件

c++ - 通过 hash_map<string, fnPtr> 调用函数指针是否比 C++ 中的多个 if/else if/else 语句更有效或更好?

javascript - 将两个事件处理合并为一个事件处理