`
piecehealth
  • 浏览: 47414 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Dota分组算法

阅读更多
今天群里的同学说要写一个dota分组算法,即有一个数组,数组里面的元素是他各个同事的战斗力,问有没有什么算法能将他们按战斗力尽可能的分成两组。开始我没有很好地想法,想dota最多十个人,用枚举也不会太久,不过后来受群里讨论的启发,实现了如下方法:

#zdl = [[1, 3, 5, 10000000, 9], [2, 4, 6, 8, 7]].flatten
#zdl = [1,3,5,7,9,100] + [2,4,6,8,11]
zdl = [1, 2, 3, 4, 5, 100, 6, 7, 8, 9, 11]
#zdl = []
#30.times {zdl << rand(100)}
 
def partition arr
  if arr.size.even?
    a, b = arr[0, arr.size / 2], arr[arr.size / 2, arr.size / 2]
  else
    a, b = arr[0, arr.size / 2], arr[arr.size / 2, arr.size / 2 + 1]
    if a.inject(&:+) <= b.inject(&:+)
      a << b.min
      b.delete_at(b.index(b.min))
    end
  end
  adjust a, b
end
 
def adjust a, b
  sum_a = a.inject &:+
  sum_b = b.inject &:+
  return a, b if sum_a == sum_b
  if sum_a > sum_b
    bigger_group, smaller_group =  a, b
  else
    bigger_group, smaller_group =  b, a
  end
  d_value = (sum_a - sum_b).abs
  ii, jj = nil, nil
  bigger_group.each_with_index do |big_value, i|
    temp_d = d_value
    smaller_group.each_with_index do |small_value, j|
      if big_value > small_value
        if d_value / 2 - (big_value - small_value) < temp_d && d_value / 2 >= (big_value - small_value)
          temp_d = d_value / 2 - (big_value - small_value)
          ii, jj = i, j
        end
      end 
    end
  end
  return bigger_group, smaller_group if ii.nil?
  bigger_group[ii], smaller_group[jj] = smaller_group[jj], bigger_group[ii]
  adjust bigger_group, smaller_group
end


p zdl
a, b = partition zdl

p a
p a.inject &:+
p b
p b.inject &:+



算法的思路是先将其随便分成两组,然后计算两组总战斗力的差,再从战斗力总值高的一组中取一个战斗力,减去从战斗力低的一组中一个值,如果这两个值的差值正好等于两组的差,互换后总战斗力就相等了。如果没有这样的值,那交换一个最接近的,之后再递归交换后的两组战斗力。
1
2
分享到:
评论
2 楼 piecehealth 2013-09-14  
kljjack 写道
如果两个人的战斗力差等于两组的战斗力和差,互换两人,总战斗力怎么就相等了?互换两人之后,两人的战斗差值还不是等于两组战斗力和差值的绝对值!


是的,后来加了更多的测试数据,因为这点出现了bug,把25行改为temp_d = d_value / 2就可以了。应该是两人战斗力差值等于(或者最接近于)队伍差值的1 / 2才互换。
1 楼 kljjack 2013-09-14  
如果两个人的战斗力差等于两组的战斗力和差,互换两人,总战斗力怎么就相等了?互换两人之后,两人的战斗差值还不是等于两组战斗力和差值的绝对值!

相关推荐

    DOTA_devkit-master_遥感数据集DOTA处理程序_

    这些图像具有多样化的视角、光照条件和物体尺寸,为训练和评估遥感图像对象检测算法提供了丰富的素材。DOTA_devkit的出现,使得处理这个大规模数据集变得更加便捷。 二、DOTA_devkit-master的核心功能 1. 数据转换...

    DOTA图标 DOTA 英雄图标 物品图标 技能图标 搞笑图标 搞笑头像

    在IT行业中,游戏开发是一项复杂而充满挑战的任务,特别是在与热门游戏如DOTA相关的项目中。DOTA(Defense of the Ancients)是一款基于《魔兽争霸III》的地图编辑器创作的多人在线战斗竞技游戏,拥有丰富的英雄角色...

    dota改键精灵

    【Dota改键精灵】是一款专为Dota爱好者设计的辅助工具,它的主要功能是帮助玩家自定义游戏内的快捷键设置,以适应个人的游戏习惯,提高操作效率和游戏体验。在Dota这款多人在线对战游戏中,每个英雄都有多个技能和...

    dota ai地图6.67

    dota6.67 ai地图,让你成为dota雄狮

    dota6.73ai中文版地图下载

    《Dota 6.73 AI中文版地图详解与下载指南》 Dota,全名Defense of the Ancients,是一款基于暴雪娱乐公司《魔兽争霸III:冰封王座》的地图编辑器制作的多人在线对战游戏。6.73版本是Dota历史上的一个重要里程碑,...

    基于DOTA数据集的yolo训练+预训练的参数+源代码+文档说明

    1、资源内容:基于DOTA数据集的yolo训练+预训练的参数+源代码+文档说明 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释明细,都经过测试运行成功,功能ok的情况下...

    DOTA音效打包下载 手机铃声

    《DOTA音效资源解析与应用》 DOTA(Defense of the Ancients)是一款深受全球玩家喜爱的多人在线战斗竞技游戏,其丰富的游戏元素和独特的音效设计为玩家带来了沉浸式的游戏体验。本资源包提供了DOTA的部分核心音效...

    dota全图工具过11等

    【Dota全图工具过11等】是一个针对Dota游戏的辅助工具,主要用于帮助玩家在11对战平台、HF(浩方)平台以及VS(战旗)平台等多人在线游戏环境中获得全图视野。全图视野意味着玩家能够看到地图上的所有区域,包括敌方...

    DotA6.59c.rar

    【 DotA6.59c.rar 】是一个包含DotA(Defense of the Ancients)游戏更新的压缩包文件。这个版本是6.59c,是DotA Allstars系列地图的一个迭代,由冰蛙(IceFrog)或其他地图制作者进行维护和改进。DotA是一个基于...

    dota开图必备

    在电子竞技领域,Dota(Defense of the Ancients)是一款深受玩家喜爱的多人在线对战游戏。"开图"在Dota中通常指的是利用特殊工具或方法获取游戏地图的全览信息,使得玩家能了解整个战场的情况,这在非正式比赛中...

    vpk.exe dota2

    - **压缩与存储**:VPK 文件内部采用了 ZIP 压缩算法,但对文件的读取进行了优化,使得游戏在运行时可以快速解压和访问。 - **版本控制**:VPK 文件支持多个版本的资源,游戏可以根据需要加载最新的或特定版本的资源...

    DOTA6.59D魔兽

    DOTA6.59D常规,中文版本。有些微改动。此外防止互通作弊

    dota 6.74 ai 地图

    dota地图 非常适合局域网的地图很好的哦 很好的哦

    dota6.61作弊地图

    再者,"rar"是这个压缩包的格式,表明文件是以RAR压缩算法打包的。RAR是一种流行的文件压缩格式,具有较高的压缩率和文件修复功能。用户需要使用解压软件,如WinRAR,才能提取出压缩包内的"Dota Allstars v6.61b...

    dota imba 3.80 AI

    dota imba 3.80 AI,dota imba 3.80 AI,dota imba 3.80 AI

    dota_replay_manager3.0

    《Dota Replay Manager 3.0:全面解析与深度挖掘》 Dota Replay Manager 3.0是一款专为Dota爱好者设计的实用工具,旨在帮助玩家更好地管理和分析他们的游戏回放。这款软件的核心功能在于其高效地组织和播放Dota游戏...

    Openai dota2 presentation

    Gym专注于强化学习,使用这些数据来进行算法的训练,并决定它应该做什么。 OpenAI的DOTA2人工智能使用了深度Q学习(Deep Q-Learning,简称DQN)和自我对战(Self-Play)的训练方式。DQN网络使用了带有贝尔曼方程的...

    Dota中的各种声音集合

    Dota中的各种声音集合...很好的资源

    DOTA2设置智能施法的方法.docx

    在《DOTA2》这款竞技游戏中,技能施法的效率对于玩家的操作至关重要。为了帮助玩家提升游戏体验,尤其是对于新手或者手速有限的玩家来说,智能施法是一个非常实用的功能。智能施法允许玩家更快地释放技能,而无需...

    dota6.68娱乐版,没加密

    dota6.68的没加密地图,可以用最新的WE随便改图【需要最行的WE编辑器】

Global site tag (gtag.js) - Google Analytics