很早之前就遇到需要给大量人员分组的问题,分组是按照一定条件的,比如:性别,熟悉度,能力度……
那时的分组是人工进行分组的,需要考虑很多,但多少会有一些不合理的地方
所以那时有个想法,不如写个程序来智能分组。但是手上忙于其它其它事情,就此搁置。
最近开会的时候,谈到算法,想到这个小需求,仔细一想,其实是个算法的问题,和亮哥讨论之下,觉得还挺有意思,就此写下相关想法。
简单来说,核心就是两步:
1.让每个用户根据不同的条件和所有人匹配,得到和其余用户的匹配值 这里每个用户有自己的一些属性,性别,能力,和其它哪些用户熟悉,但这些值需要和其它用户进行匹配,得到一个人与人之间的匹配值。 总之,自身有属性,但没有分数,和其它人匹配之后会有一个匹配值
2.得到所有用户的匹配值之后,算出一个整体最优匹配 这里是从整体考虑的,我们面对一个群体,对此进行分配管理。最终想要的是一个整体最优解,而不是个别最优。 例如:方案一:AB为10,CD为4,总分为14;方案二:AC为8,BD为8,总分为16;应该选第二种方案。
设计原则:
1.不同的匹配条件分配不同的分数额度,即匹配条件有权重,且可修改
2.匹配条件不仅当前设计的几个,后期可能会有新条件,需要可拓展
3.计划采用装饰模式,将匹配值作为对象,不断为其装饰,同时也可以方便拓展
具体条件设计:
1.按整体情况计算:
性别分组的匹配值是根据具体情况计算的,男女1:1和男女1:9,面对同样的一对分组的到的匹配值是不同的
2.按历史情况计算:
熟悉度需要根据相关的历史记录进行计算,不同的交集熟悉度是不同的,需要根据历史的不同交集判定当下的匹配值
3.枚举计算:
类似能力方面很难找到一个数学模型,可以用枚举计算,例如能力采用5分制,1:1(0);1:3(0.5);1:5(1);2:2(0);2:4(0.8);3:3(0.5);3:4(0.8);4:4(0.3);5:5(0),根据具体情况计算
说明:
如果对一个50用户群体进行两两分组,共分25组
那么一个用户身上就会有50个匹配值,50个用户有2500个匹配值,去重之后有1200个匹配值左右
我们需要在这1200个值里面选出25个值,得到这组方案的为所有方案中的最优解
难点:
匹配值之间是相互有关系的,每次的选择都会对之后的选择有影响
思路1:
采用动态规划法,因为感觉上这个问题还是有“最优子结构”、“子问题重叠”、“边界”和“子问题独立”这些关于动态规划法的特性的
最后,在“子问题独立”上,应该难以做到,不过是个可行思路
思路2:
采用八皇后算法,因为八皇后是在国际象棋盘中各个皇后在自己横竖斜都不能放置其它皇后
将所有用户横竖转换为棋盘之后,在这个数学模型下,只要保证25个棋子周围横竖不放置其它棋子即可
得到所有的方案的解之后,在用排序算法得到最优解
思路3:
采用最短路径算法,不过在这里转化为最长路径
依然是转化为类似的行列式,通过最长路径得到一条最长路径,然后把这条最长路径按两两断开,就可以得到一个解决方案
这个思路的问题是很难得到最优解,得到的是一个相对最优解;不过它可以解决三三分组或其他,因为采取的是断链的方式
个人匹配算法倾向于逻辑,需要设计的更贴切于现实,同时也要方便拓展
整体均衡算法就倾向于算法、数据结构,需要构建数学模型,得到最优解
亮哥把思路三中的最长路径算法实现了,可以进行相关优化,更加接近于最优解,同时利用好断链的优势,能更好的适应不同情况,在这里感谢亮哥的算法技术支持