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

如何用Python求解含整数约束的n_i与q值优化问题

问题描述

给定方程组:

n_i q = a_i \quad (1\le i \le N)

其中仅$a_i$为已知量,需要寻找接近小正整数的$n_i$,同时已知$q$的取值范围。等价需求为:找到这样的小正整数$n_i$,使得以下标准差最小化:

SD\left(\frac{a_1}{n_1}, \dots,\frac{a_i}{n_i},\dots,\frac{a_N}{n_N}\right)

曾尝试最小二乘法、偏导数和牛顿法,但不清楚如何让curve_fit适配$mx+b$模型(已知$b=0$且仅$x$接近整数)。

解决方案

因为$n_i$要求是小正整数,直接暴力搜索是最直观的方案,复杂度可控;如果范围稍大,可以用带整数约束的优化方法。

方法1:暴力搜索(适合n_i范围很小的场景)

设定每个$n_i$的候选整数范围(比如1到20),遍历所有组合,计算每组$n_i$对应的标准差,保留最小的那组。

示例代码:

import numpy as np

# 已知的a_i数组
a = np.array([12.3, 24.7, 37.1])
# 设定n_i的候选范围(小正整数,比如1到15)
n_range = range(1, 16)

min_sd = float('inf')
best_n = None

# 遍历所有n_i的组合(这里以3个变量为例)
for n1 in n_range:
    for n2 in n_range:
        for n3 in n_range:
            ratios = a / np.array([n1, n2, n3])
            sd = np.std(ratios)
            if sd < min_sd:
                min_sd = sd
                best_n = (n1, n2, n3)

print(f"最优n_i组合:{best_n},对应标准差:{min_sd:.4f}")

如果变量数量N更大,用itertools.product生成所有组合更高效:

from itertools import product
import numpy as np

a = np.array([12.3, 24.7, 37.1, 49.5])
n_range = range(1, 16)

min_sd = float('inf')
best_n = None

for n_tuple in product(n_range, repeat=len(a)):
    ratios = a / np.array(n_tuple)
    sd = np.std(ratios)
    if sd < min_sd:
        min_sd = sd
        best_n = n_tuple

print(f"最优n_i组合:{best_n},对应标准差:{min_sd:.4f}")

方法2:带整数约束的优化(适合n_i范围稍大的场景)

如果暴力搜索范围太大,可以用scipy.optimize.minimize配合整数约束(需scipy>=1.9.0支持整数变量)。目标函数为计算标准差,变量$n_i$设为整数类型。

示例代码:

import numpy as np
from scipy.optimize import minimize

a = np.array([12.3, 24.7, 37.1])
# 初始猜测值(可基于a的均值估算q,再得到n_i的近似整数)
initial_guess = np.round(a / (np.mean(a)/5)).astype(int)
# 设定n_i的取值边界(小正整数,比如1到20)
bounds = [(1, 20) for _ in range(len(a))]
# 约束变量为整数
integer_constraints = [{'type': 'int'} for _ in range(len(a))]

# 目标函数:最小化标准差
def objective(n):
    ratios = a / n
    return np.std(ratios)

result = minimize(objective, initial_guess, bounds=bounds, constraints=integer_constraints, method='trust-constr')

print(f"最优n_i组合:{result.x.astype(int)},对应标准差:{result.fun:.4f}")

关于curve_fit的适配问题

curve_fit主要用于拟合连续变量的函数,并不适配你的整数约束场景。如果非要套用类似思路,可将问题转化为$a_i \approx q \cdot n_i$($b=0$),但这种场景下直接用整数约束优化方法,比强行适配curve_fit更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:05:19