如何用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
相关产品推荐
相关产品推荐

