如何用Python黑箱多目标优化包实现组合账户向组合经理的分配?
优化问题求助:组合经理分配的Python工具推荐
问题背景
现有15位组合经理(PM)和300个组合账户,每个账户拥有唯一复杂度评分Xn(0<Xn<1)及一个指数,总计40种指数,因此部分账户指数相同。
核心目标与约束
- 目标:最小化每位组合经理所负责的指数总和(即每个PM管理的不同指数数量相加后的总和最小)
- 约束条件:每位组合经理所负责账户的总复杂度评分,需处于目标评分(总复杂度评分/15,即平均分配的目标值)的±10%范围内。
示例数据
Portfolio Index Complexity 0 A x 0.1 1 B y 0.2 2 C z 0.3 3 D z 0.4
当前思路
尝试用more_itertools生成所有可能的账户-PM分配组合:
from more_itertools import set_partitions import pandas as pd df = pd.DataFrame({ "Portfolio": ["A", "B", "C", "D"], "Index": ["x", "y", "z", "z"], "Complexity": [0.1, 0.2, 0.3, 0.4] }) # 生成分配给3位PM的所有可能分区 partitions_df = pd.DataFrame(list(set_partitions(df.Portfolio, 3)), columns=["PM1", "PM2", "PM3"]) print(partitions_df)
输出结果:
PM1 PM2 PM3 0 [A] [B] [C,D] 1 [A] [B,C] [D] 2 [A] [C] [B,D] 3 [A,B] [C] [D] 4 [B] [A,C] [D] 5 [B] [C] [A,D]
但这种枚举所有组合的方式在300个账户的规模下完全不可行,需要更高效的优化工具。
推荐的Python包
精确求解类
PuLP:入门级线性/整数规划工具,语法直观,能快速建模。你可以定义0-1变量表示“账户i分配给PM j”,目标函数定义为所有PM负责的不同指数数量之和最小(需要额外处理同一指数多次出现只计数一次的逻辑),再添加上复杂度约束和每个账户必须分配给一个PM的约束。Gurobi/CPLEX:商业级求解器,计算效率远高于PuLP,适合300个账户这种中等规模的问题,能在合理时间内得到精确解。Gurobi提供学术免费授权,适合非商业场景。
启发式近似求解类
DEAP:进化算法框架,可通过遗传算法、粒子群算法等启发式方法快速找到可行解。当精确求解计算量过大时,这类方法能在可接受时间内给出近似最优解,适合大规模问题。scipy.optimize:仅适合辅助处理部分计算逻辑,本身更偏向连续优化,需要结合自定义离散分配逻辑使用。
文献方向
- 核心问题属于带约束的组合分配优化,可查找“约束资源分配”“多约束组合划分”相关文献,重点关注整数规划在这类问题中的应用案例。
- 也可参考“负载均衡+组合优化”的研究,你的复杂度约束本质是负载均衡要求,目标是最小化另一类资源(指数数量)的总消耗。
内容的提问来源于stack exchange,提问作者Theweightoflife
相关产品推荐
相关产品推荐

