Google 在这方面的结果似乎需要比我熟悉的更高级的数学(我可能不比五年级学生聪明,但我不打算找出答案)。
我正在寻找一种解决多变量优化问题的通用方法,最好是在 C# 中,而不必深入研究矩阵、特征向量和正态分布。
假设我有数值变量 x、y、z、 和 w 和函数 f 使得 w = f(x, y, z)
。我想最大化 w,并且...
f
未知x
、y
和/或z
之间的相互依赖性(如果有) , 未知- 在某些情况下,我只有事后数据集
- 在其他情况下,我可以改变
x
、y
和z
以及按需重采样w
- 在先验情况下,理想算法最大化
w
并用最少的x
试验排列,y
, 和z
,并在每一轮采样后为每个选择下一个值
我有自变量的粗略最小和最大界限。我当然不想对排列空间进行不必要的采样。我希望该算法至少具有检测最明显的相互依赖性的粗略能力,例如,当x
时 yield 递减2y
,或者当 x
的总和时 w
的实际恶化、y
和 z
超出了某个上限等。
我看过的大多数数学库都假设我知道如何在 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/