Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scipy SLSQP约束优化并不总是有效的_Python_Python 3.x_Scipy_Mathematical Optimization - Fatal编程技术网

Python Scipy SLSQP约束优化并不总是有效的

Python Scipy SLSQP约束优化并不总是有效的,python,python-3.x,scipy,mathematical-optimization,Python,Python 3.x,Scipy,Mathematical Optimization,我正在尝试使用scipy.optimize.minimize和SLSQP方法最小化函数。但有时,对于完全相同的输入,它会出现错误消息“超过迭代限制”或“linesearch的正向导数” 刚刚发生的例子:我让它在Flask服务器上运行,所以我初始化了它并发送了一个请求,但它没有通过迭代限制。我在没有关闭烧瓶的情况下发送了很多相同的请求,但每一个都失败了。然后,我重新启动了烧瓶。突然,所有的请求都被成功地优化了,我不断地发送它们,它们从未失败过。但是如果我再次重新启动烧瓶,它可能会停止工作,或者不工

我正在尝试使用scipy.optimize.minimize和SLSQP方法最小化函数。但有时,对于完全相同的输入,它会出现错误消息“超过迭代限制”或“linesearch的正向导数”

刚刚发生的例子:我让它在Flask服务器上运行,所以我初始化了它并发送了一个请求,但它没有通过迭代限制。我在没有关闭烧瓶的情况下发送了很多相同的请求,但每一个都失败了。然后,我重新启动了烧瓶。突然,所有的请求都被成功地优化了,我不断地发送它们,它们从未失败过。但是如果我再次重新启动烧瓶,它可能会停止工作,或者不工作,这似乎是随机的,但是如果它工作一次,它将永远工作,直到服务器重新启动

但是,即使优化器失败的是一个服务器实例,它仍然适用于不太复杂的输入

问题背景:我试图优化的是股票市场投资组合,考虑到波动性等约束条件。它通常在超过50万美元时失败

con = {"type": "eq", "fun": self.sum}
con2 = {"type": "ineq", "fun": self.volatility_ceiling}
con3 = {"type": "ineq", "fun": self.volatility_floor}
cons = (con, con2, con3)

#allocation_list is a list of percentages for each stock in the portfolio

optimized_result = minimize(self.gain, allocation_list, constraints=cons, bounds=self.bounds, method="SLSQP", options={"maxiter": 400})

def gain(self, allocation_list):
    gain_list = [get_gain(id) for id in self.id_list]
    gain_avg = np.average(gain_list, weights=allocation_list)
    return (gain_avg) * (-1)

def sum(self, allocation_list):
    return np.sum(allocation_list) - 1

def volatility_ceiling(self, allocation_list):
    standard_dev = self.vol_portfolio(lista_aloc)
    if self.current_risk_profile == "PROFILE_1":
        return (standard_dev * (-1)) + 0.009
    elif self.current_risk_profile == "PROFILE_2":
        return (standard_dev * (-1)) + 0.011
    elif self.current_risk_profile == "PROFILE_3":
        return (standard_dev * (-1)) + 0.015
    elif self.current_risk_profile == "PROFILE_4":
        return (standard_dev * (-1)) + 0.024
    #The function continues until PROFILE_10

def volatility_ceiling(self, allocation_list):
    standard_dev = self.vol_portfolio(allocation_list)
    if self.current_risk_profile == "PROFILE_1":
        return standard_dev - 0.0
    elif self.current_risk_profile == "PROFILE_2":
        return standard_dev - 0.009
    elif self.current_risk_profile == "PROFILE_3":
        return standard_dev - 0.011
    elif self.current_risk_profile == "PROFILE_4":
        return standard_dev - 0.015
    #The function continues until PROFILE_10

我建议您修改模型中美元的“单位”。例如,在表示预算时,将“美元”改为“数千美元”。为此,请使用“500”而不是“500000”,并相应地解释结果。例如,如果从可用预算中向资产分配“3.5”个单位,则对应3500美元,依此类推

作为一般的模型原理,如果数字的数值范围很广,则模型的比例会很差,这会引发数值问题。大多数商业优化器都会发出警告,提醒您采取措施来改进伸缩性。如果模型是线性的,有或没有整数变量,优化器通常会尝试改进缩放本身。比如说,


对于黑匣子类型的非线性模型,这些功能可能不可用。

可以肯定的是,问题会在其他地方找到。SLSQP应该是确定性的。在代码中寻找不确定的部分。老实说:一个没有代码的问题通常不是很好。当然,SLSQP可能会决定性地失败,但这是特定于问题/用法的。市场投资组合的,嗯,我认为其中很多都是凸问题,人们不会使用SLSQP。但是谁知道你到底在做什么呢。谢谢,我已经用代码更新了我的问题。