You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scipy.optimize求解多产品最优Input A值遇参数报错,如何解决?

多产品Input A最优值求解问题及解决方案

问题背景

需要求解产品1和产品2的Input A最优值,实现总输出最大化并满足给定约束。使用Python的Scipy minimize函数处理单一产品时正常,但多产品场景下报错:

TypeError: constraint() missing 1 required positional argument: 'Product2_InputA'

错误核心原因

Scipy minimize要求目标函数、约束函数的输入必须是单一一维数组,而非多个独立参数。原代码将两个产品的Input A分开传递,同时存在函数引用错误(直接使用函数对象而非调用函数),导致参数传递失败。

修正后的完整代码

import numpy as np
from scipy.optimize import minimize 

# 产品参数定义
Product1_InputB = np.array([0.5])
Product1_InputC = np.array([1])
Product1_InputD = np.array([1])
Product1_InputE = np.array([0.08])
Product1_InputF = np.array([20])

Product2_InputB = np.array([0.5])
Product2_InputC = np.array([1])
Product2_InputD = np.array([2])
Product2_InputE = np.array([0.1])
Product2_InputF = np.array([30])

# 单个产品负输出计算(修正:传入参数并计算)
def Neg_Product1_Output(input_a):
    exponent = (input_a - Product1_InputB) * (0.5*Product1_InputC - 1.5*Product1_InputD)
    sigmoid = np.exp(exponent) / (1 + np.exp(exponent))
    return -1 * sigmoid * (input_a - Product1_InputB)

def Neg_Product2_Output(input_a):
    exponent = (input_a - Product2_InputB) * (0.5*Product2_InputC - 1.5*Product2_InputD)
    sigmoid = np.exp(exponent) / (1 + np.exp(exponent))
    return -1 * sigmoid * (input_a - Product2_InputB)

# 总负输出:输入为打包后的数组[x1, x2]
def Neg_Total_Output(x):
    x1, x2 = x
    return Neg_Product1_Output(x1) + Neg_Product2_Output(x2)

# 约束函数:输入为打包后的数组[x1, x2]
def constraint(x):
    x1, x2 = x
    neg_out1 = Neg_Product1_Output(x1)
    neg_out2 = Neg_Product2_Output(x2)
    total_neg_out = neg_out1 + neg_out2
    # 添加小epsilon避免除以0
    return (((x1 - Product1_InputE) * neg_out1) + ((x2 - Product2_InputE) * neg_out2)) / (total_neg_out + 1e-8) - 2

# 配置约束、初始猜测值、边界
con = {'type':'ineq', 'fun': constraint}
initial_guess = np.array([3, 1])  # 打包两个产品的初始值
bounds = [(0.3,4), (0.3,4)]       # 合并两个产品的边界

# 执行优化
optimized_results = minimize(Neg_Total_Output, initial_guess, bounds=bounds, constraints=con)

# 提取最优值
Product1_InputA_Optimal = optimized_results.x[0]
Product2_InputA_Optimal = optimized_results.x[1]

print(f"产品1最优Input A: {Product1_InputA_Optimal}")
print(f"产品2最优Input A: {Product2_InputA_Optimal}")

关键修正点

  • 参数打包:将多个产品的Input A合并为一个一维数组x,作为所有函数的输入,内部再拆分为单个产品的参数。
  • 函数调用修正:原代码中直接使用Neg_Product1_Output(函数对象),修正为调用函数并传入对应参数Neg_Product1_Output(x1)。
  • 数值稳定性:约束函数中添加1e-8避免除以0的情况。
  • 边界与初始值合并:将两个产品的初始猜测和边界合并为对应长度的数组/列表,适配minimize的输入要求。

扩展到数千产品的思路

  1. 将所有产品的参数存储在列表/字典中,比如products = [{'B':0.5, 'C':1, ...}, ...]。
  2. 动态生成目标函数:遍历产品列表,对每个产品的Input A(从打包数组中取出对应位置的值)计算负输出并求和。
  3. 动态生成约束函数:同样遍历产品列表,累积计算约束表达式的分子和分母。
  4. 初始猜测和边界:按产品顺序生成对应长度的数组/列表即可。

内容的提问来源于stack exchange,提问作者Coder_Needing_Help

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:42:37