我需要一种有效的算法来实现最佳匹配

时间:2014-04-24 20:40:16

标签: c# algorithm matching

例如,我有10个团队,我需要匹配它们。 匹配的标准是:

  1. 两支队伍只匹配一次。
  2. 必须匹配得分最接近的队伍(得分是Team类的属性,类型为double)。
  3. 它最多可以迭代9次(n-1)次,这是我尝试做的事情,我可以继续前进。 在每次迭代结束时,团队的点数随机增加。 我用随机数据填充了我的列表。

    List<Team>  _teams = new List<Team>();
    
    for (int i = 1; i <= 10; i++)
    {
        _teams.Add(new Team("Team "+i,MyExtensions.RandomNumber(31)));
    }
    
    private static readonly Random Rand = new Random();
    
    public static int RandomNumber(int max)
    {
        return Rand.Next(max);
    }
    

    我的团队课程:

    public class Team
    {
        private string _name;
        private double _score;
        private List<Team> _matchedTeams;
        private Team _currentMatch;
    
        public Team CurrentMatch
        {
            get { return _currentMatch; }
            set { _currentMatch = value; }
        }
    
        public List<Team> MatchedList
        {
            get { return _matchedTeams; }
            set { _matchedTeams = value; }
        }
    
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    
        public double Score
        {
            get { return _score; }
            set { _score = value; }
        }
    
       public Team(string name, double score)
        {
            _matchedTeams = new List<Team>();
            _name = name;
            _score = score;
        }
    
        public override string ToString()
        {
            return _name + " - (" + _score + ")";
        }
    }
    

    这是我的扩展方法,以获得最接近的匹配;

    public static Team FindClosest(this List<Team> list, Team team)
    {
        var orderedItems =
            list.Where(p => p != team && !p.MatchedList.Contains(team)).OrderBy(x => Math.Abs(x.Score - team.Score));
        return orderedItems.FirstOrDefault();
    }
    
    var nearestMatch = _teams.FindClosest(_teams.ElementAt(0));
    

    实际上,我正在尝试制作一个桥牌游戏装备计算器。对于每一轮,必须匹配不同的队伍,并且匹配的队伍应该相等(或接近)力量。但是对于下一轮比赛,由于球队比赛的独特性是第一标准,我们必须为人们安排比赛,我们必须弯曲得分(点)接近的规则。

    所以它会产生类似的东西;

    算法运行......

    第一轮; Team1-Team2; Team3-Team4; Team5-Team6 .....

    分数在第1轮结束时由用户更新 算法运行......

    第二轮; Team1-Team7; Team3-Team8; Team4-Team9 .....

    .....

    分数在第8轮结束时由用户更新 算法运行......

    第九轮; TEAM1,Team9; TEAM2-Team7; Team3-Team5 .....

    分数在第9轮结束时由用户更新 算法运行......

    不再匹配。

    我更喜欢像回溯而不是暴力或随机试错的算法。 你能给我一个算法,一个解决我问题的方法吗? 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

按照点数对团队进行排序,然后从排序列表的开头开始采用成对的团队。显然,排名第二的球队是唯一一支与第一名球队最接近的球队。如果你没有将第一名的球队与第二名的球队配对,而是将第二名的球队与第三名的球队配对,那么第一名球队的最佳比赛将是第四名 - 安排团队。在排序列表中不按顺序配对团队只会增加点差异。

为了说明,假设有4个队名为A,B,C,D。团队之间的分数差异是d1,d2,d3

A    B    C    D
  d1   d2   d3

如果配对是AB和CD,那么差异集是{d1,d3} 如果配对是BC和AD,那么差异集是{d2,(d1 + d2 + d3)}。
我不知道第二组优于第一组的任何指标。

答案 1 :(得分:1)

您需要明确说明您尝试优化的目标函数。如果要找到对数点之间差异的绝对值之和的最小值,那么我同意另一个答案,你只需按点对球队进行排序,然后从左到右一次将两支球队配对,你可以证明这给出了最佳配对。如果你的目标函数不同,那么可能更难以优化,甚至可能是NP难度,具体取决于你的目标函数。但问题是,如果你只是说“最接近分数的球队必须配对在一起”,我们就无能为力了,因为有可能让一支球队在对立面上有两个同样接近分数的邻居,这样其他邻居这两个邻居的距离很远,然后你只能把球队和一个近邻队友配对。

答案 2 :(得分:0)

您需要this course。 动态编程可能太慢。也许Local search或其他方法会更有效率。您可以先阅读有关Local Search的视频。