So, you got me to learn how to simulate with "redeal" (Thomas Andrews' deal in Python).
I set North to be "balanced 15-17" (which includes 5332).
I set South to be (52)33 or (53)(32) with 6-8. Not the "22-23" you asked for, but "potentially 23 to invite".
Obviously, double-dummy; obviously, error bars would go down with a bigger sim.
Results of two 1000-board runs (realized I wanted the counts the second time):
Quote
NT scores better on 301 deals
NT one trick less on 46 deals
1NT goes down on 215 deals
2M goes down on 142 deals
8-card M fit on 718 deals
Quote
1000 hands processed of 41537 attempted:
NT scores better on 312 deals
NT one trick less on 49 deals
1NT goes down on 195 deals
2M goes down on 133 deals
8-card M fit on 709 deals
I was surprised that NT scores 2 or more tricks less than the suit - whether or not there was a fit (70%) - more than 60% of the time. Bet it is closer to 40% IRL. But that's still "not only does suit frequently make one trick more, it frequently stops them from running their suit and being tricks more."
Code in spoiler so people can check me. This was "learn the (unfortunately, not very well documented) package on the fly, hack it to work", so PEP8 complaints and syntactic suggestions will be gleefully ignored. I know it's crap and undocumented.
Spoiler
from redeal import *
predeal = {'N': SmartStack(balanced, hcp, range(15, 18))}
class MySim(Simulation):
def __init__(self):
self.counters = {
'accepted': 0,
'nt_best': 0,
'nt_minus_1': 0,
'nt_down': 0,
'suit_down': 0,
'fit': 0
}
def accept(self, deal):
return (deal.south.shape in Shape('(53)(32)') + Shape('(52)33')
and deal.south.hcp in range(6, 9))
def do(self, deal):
nt = deal.dd_tricks('1NN')
if len(deal.south.spades) == 5:
s_contract = '2SN'
fit = len(deal.south.spades) + len(deal.north.spades) >= 8
else:
s_contract = '2HN'
fit = len(deal.south.hearts) + len(deal.north.hearts) >= 8
suit = deal.dd_tricks(s_contract)
self.counters['accepted'] += 1
self.counters['nt_best'] += 1 if deal.dd_score('1NN') > deal.dd_score(s_contract) else 0
self.counters['nt_minus_1'] += 1 if nt - suit == 1 else 0
self.counters['nt_down'] += 1 if deal.dd_score('1NN') < 0 else 0
self.counters['suit_down'] += 1 if deal.dd_score(s_contract) < 0 else 0
self.counters['fit'] += 1 if fit else 0
# print('NT: {nt}, suit: {suit}, HCP: {hcp} {fit}'
# .format(nt=nt,
# suit=suit,
# hcp=deal.north.hcp + deal.south.hcp,
# fit='FIT' if fit else ''))
def final(self, n_tries):
print('{} hands processed of {} attempted:'.format(self.counters['accepted'], n_tries))
print('NT scores better on {} deals'.format(self.counters['nt_best']))
print('NT one trick less on {} deals'.format(self.counters['nt_minus_1']))
print('1NT goes down on {} deals'.format(self.counters['nt_down']))
print('2M goes down on {} deals'.format(self.counters['suit_down']))
print('8-card M fit on {} deals'.format(self.counters['fit']))
simulation = MySim()
When I go to sea, don't fear for me, Fear For The Storm -- Birdie and the Swansong (tSCoSI)
Another run (yes, I only did this so I can post nicer-looking code. Still garbage, probably, though). This time, South is 7 or 8 only.
Quote
1000 hands processed of 57714 attempted:
NT scores better on 332 deals
NT one trick less on 68 deals
1NT goes down on 137 deals
2M goes down on 90 deals
8-card M fit on 713 deals
frequencies of HCP totals: [(22, 212), (23, 370), (24, 295), (25, 123)]
Slightly better. Still looks like you should transfer, unless you play much better/they defend much worse than double dummy.
Spoiler
from redeal import *
# Give N a strong NT opener ("balanced" includes 5M332)
predeal = {'N': SmartStack(balanced, hcp, range(15, 18))}
class MySim(Simulation):
"""Should max pass 5M332s transfer or try to take the same tricks in 1NT?
Question on the BB Forums about "do you transfer or pass with 5332 at
matchpoints?" The only thing not reaching consensus was "if you're 22-23,
so you're a max for not-an-invite, is it better to pass and try to take
the same number of tricks in NT as in the suit?"
This simulation attempts to answer this question. It goes for "South is
7-8 HCP" instead of "22-23 HCP", because South can't know that.
"""
def __init__(self):
self.counters = {
'accepted': 0,
'nt_best': 0,
'nt_minus_1': 0,
'nt_down': 0,
'suit_down': 0,
'fit': 0
}
self.points = {}
def accept(self, deal):
"""Accept the deal if South is 5M332 and "maximum" for pass.
Specifically 7-8. I assume we invite with 9.
"""
return (deal.south.shape in Shape('(53)(32)') + Shape('(52)33')
and deal.south.hcp in range(7, 9))
def do(self, deal):
"""Process the accepted deal. Increment the relevant counters."""
# bad logic checks
assert deal.north.shape in (
Shape('(4333)') + Shape('(4432)') + Shape('(5332)'))
assert deal.north.hcp in (15, 16, 17)
assert deal.south.shape in Shape('(5332)')
assert len(deal.south.spades) == 5 or len(deal.south.hearts) == 5
assert deal.south.hcp in (7, 8)
# increment total points counter
points = deal.north.hcp + deal.south.hcp
try:
self.points[points] += 1
except KeyError:
self.points[points] = 1
# get tricks in NT and the major. Transfers, so NTer always plays.
nt = deal.dd_tricks('1NN')
if len(deal.south.spades) == 5:
s_contract = '2SN'
fit = len(deal.south.spades) + len(deal.north.spades) >= 8
else:
s_contract = '2HN'
fit = len(deal.south.hearts) + len(deal.north.hearts) >= 8
suit = deal.dd_tricks(s_contract)
# increment relevant counters for table.
# Note that bool() is guaranteed to be 1 or 0.
self.counters['accepted'] += 1
self.counters['nt_best'] += bool(deal.dd_score('1NN')
> deal.dd_score(s_contract))
self.counters['nt_minus_1'] += bool(nt - suit == 1)
self.counters['nt_down'] += bool(deal.dd_score('1NN') < 0)
self.counters['suit_down'] += bool(deal.dd_score(s_contract) < 0)
self.counters['fit'] += fit
# for debugging
# print('NT: {nt}, suit: {suit}, HCP: {hcp} {fit}'
# .format(nt=nt,
# suit=suit,
# hcp=deal.north.hcp + deal.south.hcp,
# fit='FIT' if fit else ''))
def final(self, n_tries):
"""After all processing, print out the results"""
print('{} hands processed of {} attempted:\n'
.format(self.counters['accepted'], n_tries))
print('NT scores better on {} deals'
.format(self.counters['nt_best']))
print('NT one trick less on {} deals'
.format(self.counters['nt_minus_1']))
print('1NT goes down on {} deals'.format(self.counters['nt_down']))
print('2M goes down on {} deals'.format(self.counters['suit_down']))
print('8-card M fit on {} deals'.format(self.counters['fit']))
print('frequencies of HCP totals: {}'
.format(sorted(self.points.items())))
simulation = MySim()
When I go to sea, don't fear for me, Fear For The Storm -- Birdie and the Swansong (tSCoSI)
Double dummy plays 5-2 fits brilliantly, as it knows exactly when the trumps will break 3-3.
In real life, if you draw a third trump and they break 4-2, you're probably in trouble, while if you don't draw a third trump and they break 3-3, you go down when it was an 'easy make'.
I'd say that trump fit is the most inaccurate of all situations for double dummy analysis.
Interests:Bridge, hiking, cycling, gardening, weight training
Posted 2022-March-24, 03:10
Does the NT strength matter when it comes to the transfer or pass question? If the combines strength is 20-22 HCP, if the 1NT is 15-17, responder has about 5 HCP which will mean limited (or no) entries to play toward the strong hand. A weak NT hand will have about 8 HCP opposite, so more chance of an entry or multiple entries. It is possible that playing in the suit can improve trick taking potential through the trump suit providing an extra entry through ruffing in order to play to the strong hand.
I would conject that if you use a weaker NT range ===say 13-15 , this will shade the results away from transfer and in the favor of NT....Just like 16 opposite 8 is usually a bad 3NT bid and 12 opposite 12 is probably a good NT bid, I'm thinking the larger point spread your simulation has between the two hands has skewed the result due to transportation problems ( I play 16+ is a 1C opening)
That is great that you ran the simulations...,Thanks for doing that and sharing the numbers
smerriman - argh, I'll look at that. That could *very easily* be is wrong and a huge issue. Fixed, running again.
Luckily, I have easy ways to check that.
Shugart, I did more changes to this, because I really did wonder about weak NT, so now it's "set these values in the first 10 lines, ignore everything below"; test run of 12-14 gave very similar numbers. Of course if that one's wrong...
When I go to sea, don't fear for me, Fear For The Storm -- Birdie and the Swansong (tSCoSI)
smerriman - argh, I'll look at that. That could *very easily* be wrong and a huge issue.
Luckily, I have easy ways to check that.
Shugart, I did more changes to this, because I really did wonder about weak NT, so now it's "set these values in the first 10 lines, ignore everything below"; test run of 12-14 gave very similar numbers. Of course if that one's wrong...
Much more reasonable, this time. Thanks smerriman - I hate dumb logic errors.
1000 hands processed of 40379 attempted:
NT scores better on 279 deals
NT one trick less on 375 deals
1NT goes down on 212 deals
2M goes down on 120 deals
8-card M fit on 730 deals
frequencies of HCP totals: [(21, 125), (22, 245), (23, 330), (24, 185), (25, 115)]
So it looks more like "it's a decent gamble, if you think you can beat DD by one trick more often than not playing 1NT-float." And, of course, this is ignoring the times the opponents get into the auction (which, at MPs against a NV strong NT, is "a lot"). And...
I think I'm staying with "save my brainpower for other hands" and auto-transfer, though.
When I go to sea, don't fear for me, Fear For The Storm -- Birdie and the Swansong (tSCoSI)
Much more reasonable, this time. Thanks smerriman - I hate dumb logic errors.
1000 hands processed of 40379 attempted:
NT scores better on 279 deals
NT one trick less on 375 deals
1NT goes down on 212 deals
2M goes down on 120 deals
8-card M fit on 730 deals
frequencies of HCP totals: [(21, 125), (22, 245), (23, 330), (24, 185), (25, 115)]
So it looks more like "it's a decent gamble, if you think you can beat DD by one trick more often than not playing 1NT-float." And, of course, this is ignoring the times the opponents get into the auction (which, at MPs against a NV strong NT, is "a lot"). And...
I think I'm staying with "save my brainpower for other hands" and auto-transfer, though.
cool and this is 13- 15 ?..if not, is it easy enough to run, since that is my current range
Double dummy plays 5-2 fits brilliantly, as it knows exactly when the trumps will break 3-3.
In real life, if you draw a third trump and they break 4-2, you're probably in trouble, while if you don't draw a third trump and they break 3-3, you go down when it was an 'easy make'.
I'd say that trump fit is the most inaccurate of all situations for double dummy analysis.
But it does give a bound, whereas before we were just pontificating based on how we feel
13-15 opposite 8-10, 5M332
1000 hands processed of 40960 attempted:
NT scores better on 346 deals
NT scores no worse on 377 deals
NT one trick less on 330 deals
1NT goes down on 181 deals
2M goes down on 143 deals
8-card M fit on 705 deals
frequencies of HCP totals: [(21, 123), (22, 262), (23, 339), (24, 174), (25, 102)]
seems about the same.
When I go to sea, don't fear for me, Fear For The Storm -- Birdie and the Swansong (tSCoSI)
13-15 opposite 8-10, 5M332
1000 hands processed of 40960 attempted:
NT scores better on 346 deals
NT scores no worse on 377 deals
NT one trick less on 330 deals
1NT goes down on 181 deals
2M goes down on 143 deals
8-card M fit on 705 deals
frequencies of HCP totals: [(21, 123), (22, 262), (23, 339), (24, 174), (25, 102)]
seems about the same.
If I read correctly, NT scores better on 346 deals and worse on 277 deals. That "seems about the same", at MP ?
13-15 opposite 8-10, 5M332
1000 hands processed of 40960 attempted:
NT scores better on 346 deals
NT scores no worse on 377 deals
NT one trick less on 330 deals
1NT goes down on 181 deals
2M goes down on 143 deals
8-card M fit on 705 deals
frequencies of HCP totals: [(21, 123), (22, 262), (23, 339), (24, 174), (25, 102)]
seems about the same.
can you elaborate what you mean by NT scores no worse on 377 deals? If you mean NT takes the same number of tricks as 2M, then the balance is going to tip further in favor of NT than the small 346 to 330 advantage it seems to enjoy......also I am not sure why 346+377+330 doesnt toal to 1000
"scores no worse" means "better or same" - that same "goes down the same amount as 2M". In this run, that happened 31/1000 times (or 31/143 times that 2M went down DD).
so in 60+% of the cases, doubledummy 2M strictly beats 1NT. All arguments about "1NT is the hardest contract to defend", "DDSims play 5-2 (and 5-3) fits much better than humans", ... come in now. It's interesting to see that fit is consistently about 70% - so only 30% of the time do we worry about the "DDSim plays 5-2 perfectly". How that matches with the 30% of "doesn't play as well" is a question, that of course I could sim up :-)
in 30% of cases at least, or about as many times as NT makes same tricks or better, NT loses to 2M by 2 tricks or more (which was my original point. When sitting works, it's great. When sitting doesn't work, it frequently isn't "90 into 110", it's "-50 into 110", losing to a fairly common 3m-1 the other way).
When I go to sea, don't fear for me, Fear For The Storm -- Birdie and the Swansong (tSCoSI)
"scores no worse" means "better or same" - that same "goes down the same amount as 2M". In this run, that happened 31/1000 times (or 31/143 times that 2M went down DD).
so in 60+% of the cases, doubledummy 2M strictly beats 1NT. All arguments about "1NT is the hardest contract to defend", "DDSims play 5-2 (and 5-3) fits much better than humans", ... come in now. It's interesting to see that fit is consistently about 70% - so only 30% of the time do we worry about the "DDSim plays 5-2 perfectly". How that matches with the 30% of "doesn't play as well" is a question, that of course I could sim up :-)
in 30% of cases at least, or about as many times as NT makes same tricks or better, NT loses to 2M by 2 tricks or more (which was my original point. When sitting works, it's great. When sitting doesn't work, it frequently isn't "90 into 110", it's "-50 into 110", losing to a fairly common 3m-1 the other way).
It does seem that 'the herd' is right to do the transfer when holding 22-25 HCP; I appreciate seeing the numbers. SO seemingly as the numbers decrease, the tilt should even be more so...eg. 13-15 opposite 4-6......can you stay in the pretend life just a little longer and run it ?