我正在尝试进行3次盆地跳跃模拟并将x和f(x)的每个元组保存到1x2的数组中,下面的代码是我迄今为止的最佳尝试。我不需要有关结果的详细信息,只需要数字中的元组,如何以一种我也可以使用它们进行进一步处理的方式获得这样的数组(例如,选择最少的不同运行)
from math import *
from math import ceil
from math import floor
import time
from decimal import *
import numpy as np
from scipy.optimize import basinhopping
minimizer_kwargs = {"method": "BFGS"}
def f(x):
b = 5306246123
estimator1=(sqrt(b)+x[0])
estimator2=(sqrt(b)+x[1])
d=abs(estimator1*estimator2-b)
return d
b = 5306246123
results = []
for x in range(3): results.append(basinhopping(f, [1,1], minimizer_kwargs=minimizer_kwargs,
niter=1000, stepsize=sqrt(sqrt(b))))
print(results)
(1/3)示例输出的一部分(我只需要-6403.48941568,7020.65333737和此元组的另外两个实例):
[ fun: 2.86102294921875e-06
lowest_optimization_result: fun: 2.86102294921875e-06
hess_inv: array([[ 0.13347587, -0.13347587],
[-0.13347587, 0.13347587]])
jac: array([ 79872., 66432.])
message: 'Desired error not necessarily achieved due to precision loss.'
nfev: 463
nit: 2
njev: 113
status: 2
success: False
x: array([-6403.48941568, 7020.65333737])
message: ['requested number of basinhopping iterations completed successfully']
答案 0 :(得分:1)
我将解决方案放在一个独立的答案中。
因为basinhopping()
函数的结果是a subclass of dict,所以可以使用方括号表示法在任何字典中访问其元素。例如:
results.append(basinhopping(...)['x'])
将所有结果保存在results
列表中后,可以通过基于零的索引在任何列表中访问它们。获取第一个结果的第二个元素:
results[0][1]