Zap*_*hod 17 language-agnostic algorithm haskell functional-programming
我有一个玩家技能等级,年龄和性别的数据集,并希望创建均匀匹配的团队.
我想在Haskell中尝试这个,但编码语言的选择是这个问题最不重要的方面.
Apo*_*isp 20
这是垃圾箱包装问题,或多维背包问题.BjörnB.Brandenburg 在Haskell建立了一个bin包装启发式库,您可能会发现它很有用.
你需要......
data Player = P { skill :: Int, gender :: Bool, age :: Int }
Run Code Online (Sandbox Code Playgroud)
确定一些球队n(我猜这是球员总数的函数).
找到每个团队所需的总技能:
teamSkill n ps = sum (map skill ps) / n
Run Code Online (Sandbox Code Playgroud)
找到理想的性别比例:
genderRatio ps = sum (map (\x -> if gender x then 1 else 0)) / length ps
Run Code Online (Sandbox Code Playgroud)
找到理想的年龄差异(您需要Math.Statistics包):
ageDist ps = pvar (map age ps)
Run Code Online (Sandbox Code Playgroud)
你必须为这三个约束分配一些权重,以便为给定的团队得出一个得分:
score skillW genderW ageW team = skillW * sk + genderW * g + ageW * a
where (sk, (g, a)) = (teamSkill 1 &&& genderRatio &&& ageDist) team
Run Code Online (Sandbox Code Playgroud)
问题减少到团队之间得分差异的最小化.蛮力方法将花费与Θ(n k-1)成比例的时间.考虑到你的问题的规模(8个团队,每个团队12个玩家),这在典型的现代PC上大约需要6到24个小时.
编辑
一种可能适合您的方法(因为您在实践中不需要精确的解决方案)是模拟退火,或通过随机排列持续改进: