神秘优化器的非收敛性

时间:2019-05-04 06:56:26

标签: python optimization non-convex mystic

我正在尝试优化功能objective

full_constr_data包含6种类型的目标,每个目标都除以年份,每年由基于项目的数据表示。因此,我正在按功能full_constr_data的参数xobjective进行加权,例如full_constr_data[0][2][3] * x[3]表示“目标#0,年#2,项目#3由x[3]加权。结果存储在变量full_constr_data_weighted中。

下一步是full_constr_data_weighted的项目汇总。例如,将目标#0,第二年的所有项目相加:

full_constr_data_weighted[0][2][0] + full_constr_data_weighted[0][2][1] + ... + full_constr_data_weighted[0][2][n]

其中'n'-项目总数。数据存储在变量full_sum中。

之后,我要计算概率。我从变量constr_mod中获取分位数,并根据该值计算超出分位数的概率。 constr_modfull_sum具有完全相同的结构,但是对于每个目标#和下一年的#constr_mode包含一个值,而full_sum具有值向量(分布)。计算的概率存储在变量my_prob中。

最后,我总结了my_prob中的所有概率。我必须优化这个总和:使其尽可能大(请注意return语句中的减号)。

优化问题具有单个不等式约束:以obj加权的向量x的总和应大于1000。将obj解释为每个项目的NPV。

我使用了diffev2软件包中的mystic

变量full_constr_dataconstr_modpen_multobj存储在my_data.spydata file中:download via Google Drive

不幸的是,优化没有收敛:

Generation 11980 has ChiSquare: inf
Generation 11990 has ChiSquare: inf
Generation 12000 has ChiSquare: inf
STOP("EvaluationLimits with {'evaluations': 1200000, 'generations': 12000}")

任何建议如何解决这个非凸问题?

import numpy as np
from mystic.solvers import diffev2
from mystic.monitors import VerboseMonitor
import mystic.symbolic as ms

def objective(x):
    # 'full_constr_data' weighted by argument 'x'
    full_constr_data_weighted = []
    for i in range(len(full_constr_data)):
        temp = []
        for k in range(len(full_constr_data[i])):
            temp.append( [ full_constr_data[i][k][m] * x[m] \
                          for m in range(len(full_constr_data[i][k])) ] )
        full_constr_data_weighted.append(temp)

    # Project-wise sum of weighted data
    full_sum = []
    for i in range(len(full_constr_data_weighted)):
        temp = []
        for j in range(len(full_constr_data_weighted[i])):
            temp2 = np.array( [ 0 for m in range(len(full_constr_data_weighted[i][j][0])) ] )
            for k in range(len(full_constr_data_weighted[i][j])):
                temp2 = temp2 + full_constr_data_weighted[i][j][k]
            temp.append(temp2)
        full_sum.append(temp)

    # Probability calculation
    my_prob = []
    for i in range(len(full_sum)):
        temp = []
        for j in range(len(full_sum[i])):
            temp.append(sum(full_sum[i][j] > constr_mod[i][j]) / len(full_sum[i][j]))
        my_prob.append(np.array(temp))

    # Probability data weighted by 'pen_mult'
    my_prob_uweighted = list(np.array(my_prob) * np.array(pen_mult))

    # Sum of all weighted probability data (function to maximize)
    sum_prob = sum([sum(my_prob_uweighted[i]) for i in range(len(my_prob_uweighted))])

    return -sum_prob



# Inequality constraint
equation = 'x0*{0} + x1*{1} + x2*{2} + x3*{3} + x4*{4} + x5*{5} + x6*{6} + x7*{7} + x8*{8} + x9*{9} + x10*{10} + x11*{11} + x12*{12} + x13*{13} + x14*{14} + x15*{15} + x16*{16} + x17*{17} + x18*{18} + x19*{19} + x20*{20} + x21*{21} + x22*{22} + x23*{23} + x24*{24} + x25*{25} + x26*{26} + x27*{27} + x28*{28} + x29*{29} >= {30}'\
.format(obj[0], obj[1], obj[2], obj[3], obj[4], obj[5], obj[6], obj[7], obj[8], obj[9],
        obj[10], obj[11], obj[12], obj[13], obj[14], obj[15], obj[16], obj[17], obj[18], obj[19],
        obj[20], obj[21], obj[22], obj[23], obj[24], obj[25], obj[26], obj[27], obj[28], obj[29],
        1000)


cf = ms.generate_constraint(ms.generate_solvers(ms.simplify(equation)))

bounds = [(0,1)]*30

mon = VerboseMonitor(10)

result = diffev2(objective, x0=bounds, bounds=bounds, constraints=cf, \
                 npop=40, gtol=200, disp=False, full_output=True, itermon=mon)

0 个答案:

没有答案