对 2D 比赛数组进行排序,使每支球队的主客场比赛数量相等

问题描述 投票:0回答:1

我正在尝试创建一个由 36 支球队参加的第 24 届欧洲冠军联赛“瑞士模式”比赛。每支队伍将与 8 位不同的对手进行比赛,总共进行 144 场比赛。我已经创建了一个匹配列表。有没有办法对每场比赛进行排序,以便每支球队的主客场比赛数量相同(本例中为 4 场)?比赛中的第一个位置表示主队,第二个位置表示客队。

我试图检查一线队的主场比赛总数是否超过4场(因为有8轮)。如果是这样,则成为客队。然而,结果仍然分布不均。

JSFiddle 示例

const matchups = [
    [
        "35",
        "36"
    ],
    [
        "36",
        "34"
    ],
    [
        "12",
        "36"
    ],
    [
        "36",
        "28"
    ],
    [
        "36",
        "3"
    ],
    [
        "36",
        "19"
    ],
    [
        "36",
        "16"
    ],
    [
        "36",
        "14"
    ],
    [
        "13",
        "20"
    ],
    [
        "12",
        "13"
    ],
    [
        "13",
        "27"
    ],
    [
        "7",
        "13"
    ],
    [
        "1",
        "13"
    ],
    [
        "21",
        "13"
    ],
    [
        "35",
        "13"
    ],
    [
        "13",
        "15"
    ],
    [
        "37",
        "3"
    ],
    [
        "21",
        "37"
    ],
    [
        "54",
        "37"
    ],
    [
        "11",
        "37"
    ],
    [
        "37",
        "27"
    ],
    [
        "1",
        "37"
    ],
    [
        "37",
        "14"
    ],
    [
        "22",
        "37"
    ],
    [
        "15",
        "17"
    ],
    [
        "11",
        "15"
    ],
    [
        "15",
        "27"
    ],
    [
        "1",
        "15"
    ],
    [
        "15",
        "54"
    ],
    [
        "41",
        "15"
    ],
    [
        "40",
        "15"
    ],
    [
        "23",
        "1"
    ],
    [
        "40",
        "23"
    ],
    [
        "25",
        "23"
    ],
    [
        "24",
        "23"
    ],
    [
        "41",
        "23"
    ],
    [
        "23",
        "3"
    ],
    [
        "23",
        "9"
    ],
    [
        "18",
        "23"
    ],
    [
        "41",
        "27"
    ],
    [
        "27",
        "54"
    ],
    [
        "40",
        "27"
    ],
    [
        "27",
        "18"
    ],
    [
        "27",
        "19"
    ],
    [
        "7",
        "3"
    ],
    [
        "33",
        "3"
    ],
    [
        "32",
        "3"
    ],
    [
        "2",
        "3"
    ],
    [
        "3",
        "54"
    ],
    [
        "41",
        "29"
    ],
    [
        "40",
        "29"
    ],
    [
        "29",
        "28"
    ],
    [
        "2",
        "29"
    ],
    [
        "10",
        "29"
    ],
    [
        "26",
        "29"
    ],
    [
        "12",
        "29"
    ],
    [
        "29",
        "22"
    ],
    [
        "25",
        "34"
    ],
    [
        "34",
        "24"
    ],
    [
        "10",
        "34"
    ],
    [
        "34",
        "16"
    ],
    [
        "11",
        "34"
    ],
    [
        "48",
        "34"
    ],
    [
        "34",
        "17"
    ],
    [
        "14",
        "24"
    ],
    [
        "14",
        "9"
    ],
    [
        "33",
        "14"
    ],
    [
        "25",
        "14"
    ],
    [
        "7",
        "14"
    ],
    [
        "14",
        "17"
    ],
    [
        "21",
        "17"
    ],
    [
        "48",
        "17"
    ],
    [
        "32",
        "17"
    ],
    [
        "17",
        "16"
    ],
    [
        "12",
        "17"
    ],
    [
        "28",
        "1"
    ],
    [
        "28",
        "25"
    ],
    [
        "28",
        "21"
    ],
    [
        "28",
        "43"
    ],
    [
        "11",
        "28"
    ],
    [
        "28",
        "9"
    ],
    [
        "54",
        "12"
    ],
    [
        "54",
        "33"
    ],
    [
        "54",
        "43"
    ],
    [
        "54",
        "25"
    ],
    [
        "16",
        "25"
    ],
    [
        "16",
        "33"
    ],
    [
        "16",
        "43"
    ],
    [
        "7",
        "16"
    ],
    [
        "16",
        "18"
    ],
    [
        "19",
        "24"
    ],
    [
        "19",
        "12"
    ],
    [
        "19",
        "48"
    ],
    [
        "11",
        "19"
    ],
    [
        "10",
        "19"
    ],
    [
        "19",
        "1"
    ],
    [
        "2",
        "43"
    ],
    [
        "43",
        "18"
    ],
    [
        "40",
        "43"
    ],
    [
        "7",
        "43"
    ],
    [
        "32",
        "43"
    ],
    [
        "18",
        "48"
    ],
    [
        "18",
        "10"
    ],
    [
        "18",
        "2"
    ],
    [
        "18",
        "20"
    ],
    [
        "25",
        "7"
    ],
    [
        "26",
        "25"
    ],
    [
        "32",
        "9"
    ],
    [
        "9",
        "48"
    ],
    [
        "9",
        "22"
    ],
    [
        "9",
        "2"
    ],
    [
        "9",
        "10"
    ],
    [
        "41",
        "20"
    ],
    [
        "20",
        "22"
    ],
    [
        "20",
        "21"
    ],
    [
        "20",
        "10"
    ],
    [
        "20",
        "40"
    ],
    [
        "20",
        "32"
    ],
    [
        "10",
        "41"
    ],
    [
        "35",
        "10"
    ],
    [
        "22",
        "33"
    ],
    [
        "22",
        "7"
    ],
    [
        "35",
        "22"
    ],
    [
        "22",
        "32"
    ],
    [
        "48",
        "35"
    ],
    [
        "48",
        "40"
    ],
    [
        "48",
        "41"
    ],
    [
        "24",
        "41"
    ],
    [
        "24",
        "2"
    ],
    [
        "24",
        "21"
    ],
    [
        "24",
        "12"
    ],
    [
        "33",
        "32"
    ],
    [
        "33",
        "11"
    ],
    [
        "33",
        "35"
    ],
    [
        "26",
        "32"
    ],
    [
        "21",
        "7"
    ],
    [
        "26",
        "21"
    ],
    [
        "1",
        "26"
    ],
    [
        "1",
        "35"
    ],
    [
        "2",
        "40"
    ],
    [
        "2",
        "26"
    ],
    [
        "35",
        "26"
    ],
    [
        "26",
        "11"
    ],
    [
        "12",
        "11"
    ]
]

const totalRounds = 8;

matchups.forEach((matchup) => {
  matchup.sort((homeTeam, awayTeam) => {
      const homeMatch = matchups.filter((m) => m[0] === homeTeam);
      return homeMatch.length > (totalRounds / 2 ) ? 1 : -1;
  });
});

const home = _.groupBy(matchups, m=> m[0])
const away = _.groupBy(matchups, m=> m[1])

console.log("home", home)
console.log("away", away)
console.log("combined",_.mergeWith(home,away, ((objValue,srcValue)=>{
   if(Array.isArray(objValue)){
     return objValue.concat(srcValue);
   }
})))
javascript typescript algorithm sorting
1个回答
0
投票

以下是 5 队池的示例:

考虑从 A 到 E 的球队的主/客场比赛表:

回家的路 A B C D E
A X O O X X
B X X O O X
C X X X O O
D O X X X O
E O O X X X

这意味着,例如,A 队主场对阵 B 队和 C 队,客场对阵 D 队和 E 队。

我任意填写了主/客场比赛矩阵,但它与您的规则一致:每支球队 2 场主场比赛和 2 场客场比赛(在这个 5 队池示例中)。

现在,如果您在

[Team 1, Team 2, ...]
数组和
[Team A, Team B, ...]
数组之间添加一些随机性,您最终将获得一个随机冠军,并具有适当数量的主场比赛和客场比赛。

如果这还不清楚,我可以添加更多细节。

© www.soinside.com 2019 - 2024. All rights reserved.