Please retire the "intelligent" map selection algorithm

This can’t be true. I keep getting unplayed maps with a counted 90 % chance in Quickplay.

1 Like

Don’t forget that human brain is wired to search for patterns even if there aren’t any - there is a slew of known and studied side effects of this.

So true randomness does not usually appear random to humans because we cannot entirely perceive objects in an unbiased fashion.

That said, I think the algo does not shove unbeaten maps in your face anymore. However I think I saw a map get selected two times in a row - that might be an indication of ‘true’ randomness and it also tells us that we should not forget that there are obvious conditions like that to take into account.

To lessen the layman index in describing things, I’d say that each QP map should be drawn from a pool consisting of all the maps available to the host (whatever DLC rubbish scheme may apply) minus FoW and minus the last hosted map in the given session using a uniformly distributed random number.

5 Likes

This is probably mostly what’s going on.

Had to check the most recent sources and here’s the relevant part (getting weighted random level): https://github.com/Aussiemon/Vermintide-2-Source-Code/blob/333e7d7c862a009e49a0b39ef797039fe0975f26/scripts/managers/matchmaking/matchmaking_manager.lua#L879

I was thinking that there are many other reasons why it would seem those “I like this mission” levels come up so rarely in QP, but seems there still is a weighted decision system in place. Did not look into it any further, so how it’s weighted I don’t know.

But even so, what you said makes sense and the “issue” compounds for various reasons, like people noping out, skipping via a ledge / pier, lobby browser users hopping into “nice” levels, etc, all leaving the free QP pool more heavily biased towards “unwanted” levels.

One other big reason besides the psychological is that there are so many DLC levels and only a handful of the levels people most enjoy, so of course even a random system is not going to give Against the Grain every third time.


When starting VT2 the adventure mode with levels that need to be completed in an order was great and had a nice feel to it. DLC maps may work somewhat the same for new players, but for everyone else the story / act 1, 2 and 3, is long forgotten. Most people seem to enjoy the original levels the most, and they do give reward / loot the easiest in my opinion. Minus Fort & Convo of course.

Any random system where you don’t have the ability to choose the set of levels you want to pull from is going to annoy someone I feel. Those someone are probably the minority so that’s what I’d like to see for QP level decision. Or have some changing bonus for less-completed levels / choice at the QP vote whether to maybe get a bonus & draw from all levels or have no bonus and get a level drawn from maybe a reversed weight set.

1 Like

Nice find, thanks. Seems I was wrong.

Well, allowing the host to choose a pool of maps is something in-between QP and Custom game (the latter being a lobby with one map in the pool effectively), so if the already meager reward of half a bee’s diсk Ranald’s bar for playing QP gets further subdivided, I dunno.

However, having a kind of a bounty for rarely completed missions is a nice touch. Maybe have it pinned in the challenges list or something - that would be cool. In fact, I think I’ll raise a seperate thread for my thoughts about the state of QP…

Agree. And yes, that’s exactly what I meant, something in-between of a full level pool QP and a preselected custom game - with the random QP tuned to give an extra bonus relative to how rarely the party has succeeded a level. Whether people actually need loot I do feel it is a major part to why jump from champ to leg.

Something like that, anything that incentivizes levels that has seen plenty of wipes. But couldn’t be too much of an hassle for the lobby which is why I mentioned the idea of having it included in the QP yes/no vote as an alternative choice, yes nice pls / yes extra bonus / decline. Or whatever would make it easy & fast to choose. Deeds are there but not generally played while many of them are only marginally more difficult than regular QP and I think it’s partly due to the hassle of selecting one / communicating it. If in the QP vote the game asked “hey we have a similarish Deed here, QP or some extra challenge?” I’m almost sure they would get played.

This is going offtopic even more: I might hop in to your new thread, but in case you think along the same lines about loot, I strongly feel Cata should have something, anything, loot wise beyond what Legend gives you. Now for most players Cata is that difficulty which is fun, very challenging yet doable, but, and this is my guess based on discussions in lobby with random ppl, some hesitation / fear about not being upto the “standards” keeps people in Legend. A loot bonus would be a good excuse, like it is now for Champ → Legend jump. I have had those thoughts run through me too. Not wanting to fail in a game mode where people play just for the challenge and the challenge is meant to be the game not the players. In Legend it’s accepted that the party is what it is and it adds to the experience.

I’m pretty sure that it only deprioritizes completed maps, and not maps played on. The result is it keeps picking the ones that are most likely to fail.

Changing it to count maps played on would be all it takes to fix it.

2 Likes

It counts them, but as far as I understand quite heavily puts weight on wipes. It’s all there to read and fortunately this part of the codebase is quite friendly toward someone not familiar with it. Parts are done on the backend so to know the full truth a mod is needed to get those numbers.

Where do you see this? I see for win/loss weights:
quickplay_level_select_settings = {
loss_multiplier = 1,
win_multiplier = 1,
base_level_weight = 1,
amount_of_relevant_games = 20,
progression_multiplier = 10
The only code there using that win/loss multiplier makes it so that regardless of win or loss you are unlikely to get the same map twice in a row.
However, I see:
if not level_completed or level_completed == 0 then
level_weight_by_lookup[level_index] = level_weight_by_lookup[level_index] * progression_multiplier
which would indicate a heavy weighting towards maps not completed in the last 20 games.

This is what I took as weighting toward wipes, though as you said and I missed, in the last 20 games. So yeah, it really doesn’t heavily weigh wipes if there are none in the 20 recent games, but if there are then they are all more or less valued at 9 to 10 while wins are at below 1.

I really may be missing something here as that seems quite a crude way of weighing them.

Edit: this is my understanding of it:
previous 20 games put into order of first being the newest
they are weighed initially 1 for a win, 10 for a loss
for each game a 1/20 * game_number_from_most_recent is subtracted

random pick is given that list of games as is
preferred games list (sent to host?) is picked from all games with a weight above 0

So maybe multiple losses in a certain level lessens its odds depending on how recent the loss and how many total. Same for wins, the more wins the less its odds.

That’s not how I interpreted it:
I think every map that you don’t have a completion in the last twenty maps has a weight multiplied by ten, with a win (or perhaps multiple) in the last twenty games it goes down to normal map weight. Otherwise, I’m not sure how they could weigh losses ten times as heavily without swamping you in the same maps in perpetuity(even with very high win rates assuming you have any losses). Getting a single win or several on a common map in QP (like enchanter’s lair) seems to cut down on the spam. Just failing maps seemed to give me Enchanter’s lair constantly every other map.

I think my interpretation is the same, or I could write the same description :smiley:

The 20 recent games are the 20 last played, or initially all levels but then pruned to 20 latest. If there is a no-completion in there that probably means a loss unless that level hasn’t been played yet.

I can’t see how the multiplier of 10 would not be assigned to losses/non-completions unless the completed_level_difficulty_index does not return null or 0 for losses. If it doesn’t, the whole system still doesn’t make a whole lot of sense as then it’s reduced to weights being the inverse of played games (both win & loss multipliers 1)
level_weight_by_lookup[level_index] = level_weight_by_lookup[level_index] - (multiplier * (#last_played_games - i + 1)) / #last_played_games

Edit: it would make sense to me if that age tied multiplier modifier would affect the whole weight and not just be subtracted from it. That minus switched to multiply. Then the N th game to the past would get a total weight of 1/N multiplied with some win/loss num other than that 1.

Now that I think of it more, it may very well be that that completed_level_difficulty actually returns 0 only if it is not yet played or not successfully completed at any difficulty. Would explain your observations and not favor losses 10 to 1 which would be absurd.

Oh, and I would prefer lobbies with lower ping than lobbies with the maps I presumably have problem with. Sometimes I skip Blightreaper (jump in water) because it is just too long. It have amazing atmosphere for first several times, but it is feels like waste of time now. Also, please consider die drop in the sword room as additional reward for its long duration.

I doubt this is true.
In the last few days I ONLY got maps I haven’t done yet when clicking Quick Play.
Literally 100% of the times, and I tried like 5-6 times and got the same Drachenfel map a few times in a row (because I’m taking my sweet time with it).

“if not DEDICATED_SERVER”

A bit out of topic, but still interesting =p

1 Like

The “intelligent” algorythm is working either then, I get only base game maps, Skittergate and Hunger in the Dark over and over again, i completed them many times recently, I never get dlc maps, ever

I like the idea of getting maps that you dind’t complete in long time, it keeps things less repetitive

Doesn’t this only work for the host tho?