python中的优化返回大数的猜测值

时间:2018-07-28 23:11:43

标签: python python-3.x numpy optimization scipy

我想解决python中的优化问题。我的代码如下:

import numpy as np
import math
from scipy.optimize import minimize

def solve(tupleList, a_float, b_float, c_float, *, debug=False, formatStr = '%s'):

    def objective(x, sign= -1.0):
        total = 0
        for xi, pooli in zip(x, tupleList):
            Li, fi = pooli
            total += (xi + Li)*(1 - math.exp((-1)*a_float*b_float*(1-fi)*xi/(xi+Li)))
        total += (c_float - sum(x))*(1 - math.exp((-1)*a_float*b_float))
        total *= sign
        return total

    def constraint1(x, sign= -1.0):
        return sign*(sum(x) - c_float)

    n = len(tupleList)
    x0 = np.ones(n) * c_float/(n+1)  # Initial guess
    if debug:
        print('Initial Objective: {formatStr}'.format(formatStr=formatStr) % objective(x0))

    b = (0,c_float)
    bnds = (b,) * n
    con1 = {'type': 'ineq', 'fun': constraint1} 
    cons = ([con1])
    solution = minimize(objective,x0,method='SLSQP',\
                            bounds=bnds,constraints=cons)  
    x = solution.x

    if debug:
        # show final objective
        print('Final Objective:   {formatStr}'.format(formatStr=formatStr) % objective(x))

        # print solution
        print('Solution')
        for n, xi in enumerate(x):
            print('l_%d    = {formatStr}'.format(formatStr=formatStr) % (n, xi))
        print(    'l_rem = {formatStr}'.format(formatStr=formatStr) % (c_float - sum(x)))   

    if solution.success:
        x = np.append(x,(c_float - sum(x)))
        return x

    return None

如果我按如下所示调用函数,则优化似乎可以正常工作

>>> solve([(8.762E+5, 0.04), (5816E+2, 0.025), (1.5E+2, 0.015)], 7E-05, 103086,1E+0,debug=True)
Initial Objective: -5.507040251221752
Final Objective:   -7.043360870993145
Solution
l_0    = 0.0
l_1    = 0.7846865050106637
l_2    = 0.2153134949835263
l_rem = 5.810019132468369e-12
array([0.00000000e+00, 7.84686505e-01, 2.15313495e-01, 5.81001913e-12])

但是,如果我使用较大的小数位数(我只是将输入乘以1E + 13),那么代码只会返回初始的猜测值(在#初始猜测行中提供)

>>> solve([(8.762E+18, 0.04), (5816E+15, 0.025), (1.5E+15, 0.015)], 7E-05, 103086,1E+13,debug=True)
Initial Objective: -55070402512217.52
Final Objective:   -55070402512217.52
Solution
l_0    = 2500000000000.0
l_1    = 2500000000000.0
l_2    = 2500000000000.0
l_rem = 2500000000000.0
array([2.5e+12, 2.5e+12, 2.5e+12, 2.5e+12])

有人可以提供一个关于如何使其在1E + 18等大批量工作中起作用的想法吗?

0 个答案:

没有答案