首页 > 解决方案 > 执行蒙特卡罗方法以找到 f 的最小值

问题描述

我正在考虑一个功能:

f(x) = 1 − exp −(x + 3)2  − 2 exp −(x − 2)2).

我的问题是:

编写一个 Python 函数,输入函数 f、初始猜测 x 和迭代次数 N,并执行以下操作:从初始 x 开始,然后进行 N 次迭代:

  1. 生成一个正态分布的随机数 δx

  2. 求成本 f(x + δx)。如果这小于当前成本 f(x),则用 x + δx 更新 x。否则保持 x 不变。

  3. 输出最终的 x。

我想尝试不同的 x 初始值,看看算法在哪里结束。

这是我的代码:

import numpy as np

fun = lambda x: 1 - np.exp(-(x+3)**2) - 2*np.exp(-(x-2)**2)

def monteCarlo(costFun = fun, x = 0., N=100, sigma = 1.):

        '''Find a minimum of a function approximately using simulated annealing'''
        cost = costFun(x)
        for j in range(N):
                T = 1. - float(j)/N #Temperature
                dx = np.random.normal(scale = sigma)
                newx = x + dx
                newcost = costFun(newx) 
                p = np.random.random()
                if newcost < cost or p < np.exp(-(newcost-cost)/T):
                        cost = newcost
                        x = newx
                        print('point: ' + str(x) + ', cost = ' + str(cost) + ', T = ' + str(T))
        return

注意:我无法正确列出我的代码,但它从:'import numpy'开始。(我对这个论坛比较陌生)。

我认为我的 python 代码没有错误,但在最后阶段我很难改变 x 的初始值。

任何帮助将不胜感激。先感谢您。

标签: python

解决方案


推荐阅读