alight
unread,Sep 1, 2011, 8:49:39 PM9/1/11Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to nullpomino-dev
This post is to describe a mechanism for garbage scaling that can be
used both for large game rooms and for player handicapping. I
described the mechanism to some of you and the response was
encouraging, so I will post it here.
The problems we are faced with current garbage scaling methods are
brought about by virtue of Change on Attack garbage. With change per
line, regardless of the change rate, this is all a non-issue, but what
we have wanted for Change on Attack is a system that "acts like" CoA
but can be scaled down to the actual add rate of a two-player match.
This has turned out to be a bit trickier than expected, and the
current fractional garbage system, even after the hole change rate
modification, doesn't quite match up.
Why is this? Well, if all you are doing is dividing attacks up, you
wind up with smaller attacks and messier garbage. If you try to
compensate for this by playing with the hole change rate, you might be
able to create cleaner streaks of garbage but the garbage is not
responsive to the tactical decisions of the players, as it is in true
CoA. I propose a system that should allow attacks to be scaled down
while still retaining the characteristics given by the current play
decisions of the other players.
This system is based around random sampling. Rather than accepting
garbage that depends directly on the attack that was sent, we first
separate *how much* garbage is sent from *how straight* that garbage
is. It is important to understand that Change on Attack can never be
"fair" - by its nature, it cannot exist and also have all players
receive the same garbage holes in the same arrangement. For this
reason we need not worry about breaking "fairness" in that sense.
How much garbage is sent is scaled directly based on the number of
participating players, as it is currently. If three players are
playing, garbage is scaled by 1/2, such that if two players each sent
a Tetris, the third player would receive only one Tetris's worth of
garbage. This part is easy.
The tricky part, then, is the "how messy" part. We can solve this by
taking advantage of the aforementioned break between the two concepts.
Instead, we accumulate a buffer that represents all the attacks sent
within the last X seconds. When receiving garbage, we select randomly
from that buffer the attack to be added. If attacks of size 4, 5, 5,
2, 5 exist in the buffer, then there is a 3/5 chance that an attack of
size 5 will be chosen. When it is selected, it is removed from the
buffer. As much garbage as is necessary is added to the receiving
player's field, and any left over is held in a temporary variable.
When further garbage is accepted by that same player, the "remainder"
queue is emptied. New garbage attacks are drawn as necessary.
The attack probability statistics can be a sliding time window (the
last X seconds) or a sliding attack window (the last X attacks). I
tend to favor a sliding time window, since otherwise attacks would
have a tendency to be "pushed out" if the window was too small, but at
the same time an attack window is more responsive to the most recent
attacks than a time window would be.
Regardless, this enables a mechanic by which the garbage accepted by a
player will reflect what the other players are doing in the near past,
hopefully solving the reactivity problem with the current fractional
system.
I further propose an additional optimization. It can be the case that
players want to send small attacks immediately as a way of pressuring
an opponent. With the fractional system, it is possible to send an
attack that nobody receives. I propose that every attack send at least
one line, regardless of scaling. This further increases the reactivity
of the system, letting players make and be rewarded for good tactical
decisions in their timing and stacking. Of course, because of this, a
player may wind up receiving more garbage than they technically
"should". To handle this, I would allow players to have negative
values in their fractional queue, so that larger attacks that come in
will be reduced and compensate for the early garbage the player
received as a result of the small attack. This negative value should
approach 0 over time so as to prevent the accumulation of large
negative garbage queues. Perhaps some sort of half-life mechanism
makes the most sense - where it is halved (or otherwise reduced
geometrically) every second, rounding towards 0. This way should a
large value be accumulated, it will reduce extremely quickly, but
short values over time will not.
It is important for this purpose that combos should not be treated as
single attacks every clear; combo garbage should not be subject to
this "minimum add" system past the first attack sent.
----
This garbage scaling system presents a natural means of automatically
handicapping unbalanced matches. Since it is enacted individually at
the receiver's end, the handicapped player(s) may continue to play at
full speed and with no impediments, including making full use of any
natural CoA garbage sent by the unhandicapped player(s).
The problems with handicapping can then be reduced to a couple simple
questions:
1) How much handicapping should be applied?
I am in favor of applying enough of a handicap to result in about a
2:1 win rate for the better player. This should be enough for the
better player to feel like they are in control of the match, while
affording enough wins to the lesser player to enjoy the match as well
and feel like the game is not entirely out of his or her grasp.
This should be achievable by a sliding scale that is adjusted based on
the total win:loss ratio for the session in much the same way as I
proposed that ratings should be calculated.
For new players joining a room, when we have no games to draw from,
handicap should be calculated based on the expected win ratio
according to the involved players' ratings. This value can then be
adjusted based on the actual results, but makes a good starting point.
By the time players reach the top division(s), according to the level
system described in another post, automatic handicap should be done
away with. It may be a good idea then to scale the target win ratio
based on the division of the lower player. 1:2 for bronze rooms, for
example, 1:3 for silver, and 1:4 for gold. Gold may not need a
handicap at all, of course, but that's a subjective decision.
I'm far from certain about what math would be necessary to expand this
functionality beyond 1v1 rooms.
2) How should rating be dealt with?
This one is actually pretty easy, but depends on an unknown variable.
Since the goal of a handicap is to arrive at a specified win ratio
between a group of players, if the handicap achieves that goal then
the rating between those two players should not change at all - since
the expected win rate is the same as the actual win rate. By the same
token, if the actual win rate varies, then the handicap should be
adjusted, or the ratings should be adjusted, or both.
The best way to handle this, I think, is to avoid changing ratings by
much (or any) until a stable handicap with a reasonable sample size
has been reached. This is similar to the 10 game lead-in I proposed
for ratings. The worst case scenario would be when one or more
participants' ratings are inaccurate, the handicap will be chosen
poorly leading to a number of games at the wrong difficulty. If
ratings were adjusted for these games, they may be adjusted unfairly.
In the case of handicapping, then, it makes sense to arrive at the
handicap first, and then lead into the ratings. The 10 game lead-in
for ratings change should only begin AFTER the handicap adjustments
fall below a certain threshold. At this point, after each game, we can
adjust the ratings as we would normally - but we decide on the ratings
adjustment based not on the actual ratings of the players, but on the
ratings the players are predicted to have at the current handicap
level. These predicted ratings can be based on a 50% win rate
representing the average of the participants' ratings, further
separated by the number of points that would create the desired win
rate. When that win rate is achieved, then those "predicted" ratings
are accurate, and therefore any further games played will also create
an accurate picture of how the ratings should go up or down.
We can make a decision here to change the ratings a little bit while
the handicap is settling, just to provide some feedback and/or
progress to the players, but it should be done with the understanding
that those changes may not be fair until things settle later - and
such changes should be small enough to be reversed when equilibrium is
reached.