• Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Login
FAForever Forums
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Login

TMM Rating Allowance Needs to Use Ladder 1v1 Matching (or close to it)

Scheduled Pinned Locked Moved General Discussion
38 Posts 15 Posters 3.5k Views 1 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    BlackYps
    last edited by 10 Apr 2021, 10:34

    I don't have a lot of examples because I have just started making some, but here are a few for you:
    (Keep in mind that a game quality of 0.5 is the cutoff here for a game to be considered)

    A "Search" is a party of players that is searching for a game. the "pX" are the player names, so you can see how many players there are in the search. The number at the end is the average rating of that search party. The game quality uses the formula that I explained in my previous post.

    team a: [Search(['p12'], 842), Search(['p15'], 738), Search(['p1', 'p2'], 781)] cumulated rating: 3142   average rating: 785.5
    team b: [Search(['p11'], 745), Search(['p5', 'p6'], 788), Search(['p16'], 816)] cumulated rating: 3137   average rating: 784.25
    bonuses: 0.0 rating disparity: 5 -> fairness: 0.9916666666666667 deviation: 44.917806881013234 -> uniformity: 0.8502739770632892 -> game quality: 0.8431883605877618
    
    team a: [Search(['p5', 'p6'], 788), Search(['p16'], 816), Search(['p13'], 971)] cumulated rating: 3363   average rating: 840.75
    team b: [Search(['p1', 'p2'], 781), Search(['p12'], 842), Search(['p17'], 951)] cumulated rating: 3355   average rating: 838.75
    bonuses: 0.0 rating disparity: 8 -> fairness: 0.9866666666666667 deviation: 79.45399612354309 -> uniformity: 0.7351533462548563 -> game quality: 0.7253513016381249
    
    team a: [Search(['p3', 'p4'], 1004.5), Search(['p17'], 951), Search(['p16'], 816)] cumulated rating: 3776   average rating: 944
    team b: [Search(['p13'], 971), Search(['p12'], 842), Search(['p5', 'p6'], 788)] cumulated rating: 3389   average rating: 847.25
    bonuses: 0.0 rating disparity: 387 -> fairness: 0.355 deviation: 92.79134859996378 -> uniformity: 0.6906955046667874 -> game quality: 0.24519690415670953
    
    team a: [Search(['p7', 'p8', 'p9'], 1011.3333333333334), Search(['p12'], 842)] cumulated rating: 3876   average rating: 969
    team b: [Search(['p13'], 971), Search(['p3', 'p4'], 1004.5), Search(['p17'], 951)] cumulated rating: 3931   average rating: 982.75
    bonuses: 0.0 rating disparity: 55 -> fairness: 0.9083333333333333 deviation: 67.96035149261664 -> uniformity: 0.7734654950246113 -> game quality: 0.7025644913140219
    
    team a: [Search(['p7', 'p8', 'p9'], 1011.3333333333334), Search(['p11'], 745)] cumulated rating: 3779   average rating: 944.75
    team b: [Search(['p10'], 1047), Search(['p15'], 738), Search(['p14'], 1032), Search(['p13'], 971)] cumulated rating: 3788   average rating: 947
    bonuses: 0.0 rating disparity: 9 -> fairness: 0.985 deviation: 125.21026066181636 -> uniformity: 0.5826324644606121 -> game quality: 0.5738929774937029
    
    team a: [Search(['p7', 'p8', 'p9'], 925.3333333333334), Search(['p15'], 1328)] cumulated rating: 4104   average rating: 1026
    team b: [Search(['p13'], 1115), Search(['p16'], 1231), Search(['p3', 'p4'], 998)] cumulated rating: 4342   average rating: 1085.5
    bonuses: 0.0 rating disparity: 238 -> fairness: 0.6033333333333334 deviation: 152.77004778424336 -> uniformity: 0.4907665073858555 -> game quality: 0.2960957927894662
    
    team a: [Search(['p7', 'p8', 'p9'], 925.3333333333334), Search(['p13'], 1115)] cumulated rating: 3891   average rating: 972.75
    team b: [Search(['p3', 'p4'], 998), Search(['p5', 'p6'], 918.5)] cumulated rating: 3833   average rating: 958.25
    bonuses: 0.0 rating disparity: 58 -> fairness: 0.9033333333333333 deviation: 84.13976467758869 -> uniformity: 0.719534117741371 -> game quality: 0.6499791530263718
    
    team a: [Search(['p7', 'p8', 'p9'], 925.3333333333334), Search(['p12'], 846)] cumulated rating: 3622   average rating: 905.5
    team b: [Search(['p5', 'p6'], 918.5), Search(['p1', 'p2'], 810.5)] cumulated rating: 3458   average rating: 864.5
    bonuses: 0.0 rating disparity: 164 -> fairness: 0.7266666666666667 deviation: 79.85612061701971 -> uniformity: 0.733812931276601 -> game quality: 0.5332373967276633
    
    1 Reply Last reply Reply Quote 1
    • K Offline
      Katharsas
      last edited by 10 Apr 2021, 23:16

      I assume all players in that list have a newbie bonus of 0?
      Search(['p7', 'p8', 'p9'], 925.3333333333334) means those 3 players are in the queue together, and 925 is their average rating?

      Questions about algorithm:
      What is inside the match array?
      rating_imbalance = abs(match[0].cumulated_rating - match[1].cumulated_rating)
      What is match[0] / match[1] reffering to?
      Why is has_top_player() important and what does it do?

      B 1 Reply Last reply 11 Apr 2021, 10:59 Reply Quote 0
      • F Offline
        FtXCommando
        last edited by 10 Apr 2021, 23:18

        top_player is used in the matchmaking process already. It's defined as anybody with over 1600 mu. It's used to eliminate certain players/teams from consideration when the system is just trying to throw a new player into a game after a few failed queue intervals.

        1 Reply Last reply Reply Quote 0
        • B Offline
          BlackYps @Katharsas
          last edited by 11 Apr 2021, 10:59

          I assume all players in that list have a newbie bonus of 0?
          Search(['p7', 'p8', 'p9'], 925.3333333333334) means those 3 players are in the queue together, and 925 is their average rating?

          Yes to both.

          The match array just holds the two teams, so the rating imbalance is just the difference between the sum of the ratings of the two teams.

          As ftx explained a top player has >1600 mu.
          This way the newbie bonus gets only awarded if the team has no pro players. But now that I think about it, I am not sure anymore if this is a good idea.

          1 Reply Last reply Reply Quote 0
          • K Offline
            Katharsas
            last edited by Katharsas 4 Dec 2021, 22:59 12 Apr 2021, 22:59

            Okay, what does deviation = stats.pstdev(ratings) do?

            1 Reply Last reply Reply Quote 0
            • B Offline
              BlackYps
              last edited by 13 Apr 2021, 00:53

              This is from the python statistics module. It calculates the population standard deviation
              https://docs.python.org/3/library/statistics.html#statistics.pstdev
              https://www.khanacademy.org/math/statistics-probability/summarizing-quantitative-data/variance-standard-deviation-sample/a/population-and-sample-standard-deviation-review

              1 Reply Last reply Reply Quote 0
              • M Offline
                Morax
                last edited by 13 Apr 2021, 15:16

                So guys, this is great and all (good work - seriously) but most people playing FAF do not understand nor have the time to translate the code to layman terms explanations. It would be really appreciated if some "as precise as possible" explanation was given when distributing information that shows rating brackets as a requisite for what they will experience while playing the game.

                1 Reply Last reply Reply Quote 0
                • B Offline
                  BlackYps
                  last edited by 14 Apr 2021, 12:25

                  I don't think I understand what you want to say. Are you talking about the map pools? The matchmaker won't use rating brackets at all. There will also be no further explanation of the matchmaker inner workings in the client. The end user just queues up and will automagically get some nice balanced games (hopefully).

                  1 Reply Last reply Reply Quote 0
                  • K Offline
                    Katharsas
                    last edited by 14 Apr 2021, 14:29

                    Ok i think the formula makes sense, except checking top_player. If there are a top player and a noob in the same team it will probably already create bad uniformity right?

                    However, for finding good parameters, i would have to code that formula up and try it with varying numbers, cannot really tell anything from your example calculations. So yeah i don't think you will get much use out of the forum for that^^

                    1 Reply Last reply Reply Quote 0
                    • S Offline
                      StormLantern Team Lead
                      last edited by 17 Nov 2021, 18:45

                      I didnt read the whole thing, but in my experience it can be frustrating when in tmm u play against two opponents that have a high rating difference as the death (or disconnect) of the lower rated opponent often means an auto loss for your team. If its is at all possible to still get consistent enough games when the maximum rating difference (between two teammates) is capped at say 400 or so, that would be a good change I think. But I suppose that would depend on the amount of players in que.

                      1 Reply Last reply Reply Quote 1
                      • M Morax referenced this topic on 19 Dec 2022, 00:54
                      • First post
                        Last post