带求和与整数约束的多元优化:求解最小化目标函数的变量值
整数约束下的MSE目标函数优化解决方案
问题明确
- 变量:X(含50个整数元素的列表)、Y(含50个整数元素的列表)
- 目标函数(已简化核心逻辑):
import pandas as pd from sklearn.metrics import mean_squared_error alpha1 = 3 alpha2 = 4 beta = 5 def objective(X, Y): y_ = alpha1 * pd.Series(X) + alpha2 * pd.Series(Y) + beta return mean_squared_error(y_, df.demand)
- 约束条件:
- X、Y的每个元素均为整数
sum(X) = 100,sum(Y) = 100
解决方案思路
这是一个带整数约束的二次优化问题(MSE本质是平方和形式的二次目标),可以用支持整数约束的二次规划求解器直接求解。这里推荐使用cvxpy,它能简洁定义问题并调用开源整数求解器完成计算。
代码实现
import cvxpy as cp import pandas as pd from sklearn.metrics import mean_squared_error # 替换为你的真实df.demand数据,此处为模拟示例 df = pd.DataFrame({'demand': [15 + 0.2*i for i in range(50)]}) d = df.demand - beta # 简化目标函数的中间变量 # 定义整数变量 X = cp.Variable(50, integer=True) Y = cp.Variable(50, integer=True) # 定义目标:最小化平方和(与MSE最小等价,省去归一化系数不影响最优解) objective = cp.Minimize(cp.sum_squares(alpha1 * X + alpha2 * Y - d)) # 添加约束 constraints = [ cp.sum(X) == 100, cp.sum(Y) == 100, # 若业务需要非负解,可添加以下约束 # X >= 0, # Y >= 0 ] # 调用CBC开源求解器求解 prob = cp.Problem(objective, constraints) prob.solve(solver=cp.CBC) # 获取最优整数解 X_opt = X.value.astype(int) Y_opt = Y.value.astype(int) # 验证约束与结果 print(f"Sum(X_opt): {sum(X_opt)}, Sum(Y_opt): {sum(Y_opt)}") min_mse = mean_squared_error(alpha1*pd.Series(X_opt)+alpha2*pd.Series(Y_opt)+beta, df.demand) print(f"最小MSE值: {min_mse}")
关键说明
- 若
df.demand对应业务场景有变量范围限制(如非负),直接在constraints列表中添加X >=0、Y >=0即可。 - 求解器选择:CBC是默认开源整数求解器,处理50变量的规模完全够用;若追求更快速度,可替换为Gurobi、CPLEX等商业求解器(需额外授权)。
- 由于整数约束属于NP难问题,变量规模过大时求解时间会增加,但本问题的50变量规模无压力。
内容的提问来源于stack exchange,提问作者kanav anand
相关产品推荐
相关产品推荐

