FiftyMoveDistance in Houdini 2.0c

Discussion of anything and everything relating to chess playing software and machines.

Moderators: hgm, Rebel, chrisw

User avatar
Houdini
Posts: 1471
Joined: Tue Mar 16, 2010 12:00 am

FiftyMoveDistance in Houdini 2.0c

Post by Houdini »

Houdini 2.0c has an interesting new UCI option: FiftyMoveDistance.
The FiftyMoveDistance value defines the number of reversible moves after which the 50-move rule will kick in and the position is considered a draw.
The default value is obviously 50 moves, corresponding to the official FIDE 50-move rule.

Setting this option in the range of 10 to 15 moves can avoid the meaningless maneuvering that engines sometimes perform until they are close to the 50-move rule.
It can be also be useful to analyse more correctly one of the following situations:
- Closed positions in which no progress can be made without some sort of sacrifice;
- End games with a material advantage that is insufficient for winning.

The concept is easily demonstrated by two positions.

1) [D]4knQ1/7r/3p2p1/2bP1pP1/5P1N/6K1/8/8 b - -

A famous position (don't know from what game exactly), black can exchange the Rook on h4 to go into a position where the Queen is trapped and the result is a draw.

With default settings Houdini doesn't find the move, even at search depth 30+. The 50-move horizon is simply too far for Houdini to be able to see the draw.

Code: Select all

 32/55	 0:12 	+1.19 	1...Bf2+ 2.Kxf2 Rxh4 3.Ke3 Rh3+ 4.Ke2 Rh7 5.Kd3 Rh3+ 6.Kc4 Rh7 7.Kb5 Rc7 etc (99.099.674) 7671  TB:33
 33/62	 0:18 	+1.19 	1...Bf2+ 2.Kxf2 Rxh4 3.Ke3 Rh3+ 4.Ke2 Rh7 5.Kd3 Rh3+ 6.Kc4 Rh7 7.Kb5 Rc7 etc (141.867.654) 7685  TB:62
 34/82	 3:04 	+1.64 	1...Bf2+ 2.Kxf2 Rxh4 3.Ke3 Rh3+ 4.Ke2 Rh7 5.Kd3 Rh4 6.Qg7 Rxf4 7.Qf6 Rg4 etc (1.442.560.424) 7807  TB:354
With FiftyMoveDistance set to 15 moves Houdini nearly instantly plays Rxh4 and "understands" that it is a draw.

Code: Select all

 16/50	 0:00 	+0.90 	1...Bf2+ 2.Kxf2 Rxh4 3.Kf3 Rh3+ 4.Kg2 Rh7 5.Kf2 Ke7 6.Kg3 Ke8 7.Kg2 Ke7 etc (374.889) 5355
 17/50	 0:00 	+0.73 	1...Bf2+ 2.Kxf2 Rxh4 3.Qg7 Rxf4+ 4.Kg2 Rg4+ 5.Kf3 Rxg5 6.Qf6 Rg4 7.Qxd6 Re4 etc (2.062.056) 6423
 18/50	 0:00 	+0.97 	1...Bf2+ 2.Kxf2 Rxh4 3.Qg7 Rxf4+ 4.Kg2 Rg4+ 5.Kf3 Rxg5 6.Qf6 Rg4 7.Qxd6 Re4 etc (3.011.922) 6491
 19/50	 0:00 	+0.97 	1...Bf2+ 2.Kxf2 Rxh4 3.Qg7 Rxf4+ 4.Kg2 Rg4+ 5.Kf3 Rxg5 6.Qf6 Rg4 7.Qxd6 Re4 etc (4.451.608) 6508
 20/50	 0:00 	+0.93 	1...Bf2+ 2.Kxf2 Rxh4 3.Qg7 Rxf4+ 4.Kg2 Rg4+ 5.Kf3 Rxg5 6.Qf6 Rg4 7.Qxd6 Re4 etc (5.071.428) 6560
 20/50	 0:00 	+0.90++	1...Rxh4 (5.258.518) 6606
 20/50	 0:00 	+0.75++	1...Rxh4 (5.303.026) 6612
 20/50	 0:00 	+0.44++	1...Rxh4 (5.378.187) 6623
 20/50	 0:00 	+0.21 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kg3 Ke8 etc (5.581.632) 6644
 21/50	 0:00 	+0.21 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kg3 Ke8 etc (5.731.651) 6656
 ...
 28/50	 0:01 	+0.21 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kh3 Bc3 etc (14.179.628) 7267
 29/50	 0:02 	+0.21 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kh3 Bc3 etc (16.365.280) 7338  TB:1
 30/50	 0:02 	+0.16++	1...Rxh4 (22.129.889) 7396  TB:6
 30/50	 0:03 	+0.06++	1...Rxh4 (27.258.215) 7339  TB:7
 30/50	 0:04 	 0.00 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kh3 Bc3 etc (29.658.978) 7357  TB:7
 31/50	 0:04 	 0.00 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kh3 Bc3 etc (31.813.767) 7372  TB:10
2) [D]2k5/p7/Pp1p1b2/1P1P1p2/2P2P1p/3K3P/5B2/8 w - -

Another famous position (Spassky - Byrne, 1974), white has no other winning plan than pushing c5.

With the default Houdini eventually c5 will be found at large search depth, but not yet here:

Code: Select all

 42/72	 2:27 	+0.89 	1.Bg1 Kc7 2.Bd4 Bxd4 3.Kxd4 Kd8 4.Kd3 Ke8 5.Ke3 Ke7 6.Ke2 Kf6 7.Kd3 Kf7 etc (1.063.366.041) 7187  TB:883
 43/79	 4:02 	+0.89 	1.Bg1 Kc7 2.Bd4 Bxd4 3.Kxd4 Kd8 4.Kd3 Ke8 5.Ke3 Ke7 6.Ke2 Kf6 7.Kd3 Kf7 etc (1.747.738.183) 7205  TB:2.025
With FiftyMoveDistance set to 10 moves Houdini finds c5 much faster because it now "understands" that shuffling with the Bishop and King doesn't do anything useful.

Code: Select all

 15/38	 0:00 	+0.89 	1.Bg1 Bd8 2.Bd4 Kd7 3.Bg7 Ke8 4.Ke3 Kf7 5.Bh6 Kg6 6.Bf8 Bc7 7.c5 bxc5 etc (1.005.684) 6888
 16/38	 0:00 	+0.89 	1.Bg1 Bd8 2.Bd4 Kd7 3.Bg7 Ke8 4.Ke3 Kf7 5.Bh6 Kg6 6.Bf8 Bc7 7.c5 bxc5 etc (1.022.212) 6906
 17/38	 0:00 	+0.83--	1.Bg1 Bd8 (1.052.109) 6876
 17/38	 0:00 	+0.71--	1.Bg1 Bd8 (1.072.525) 6831
 17/38	 0:00 	+0.47 	1.Bg1 Kc7 2.Be3 Kc8 3.Bf2 Bd8 4.Bd4 Kd7 5.Ke3 Ke7 6.Bg7 Kf7 7.Bh6 Kg6 etc (1.125.430) 6779
 18/38	 0:00 	+0.47 	1.Bg1 Kc7 2.Be3 Kc8 3.Bf2 Bd8 4.Bd4 Kd7 5.Ke3 Ke7 6.Bg7 Kf7 7.Bh6 Kg6 etc (1.228.861) 6789
 ...
 26/44	 0:01 	+0.47 	1.Bg1 Kc7 2.Be3 Kc8 3.Ke2 Kc7 4.Bg1 Kc8 5.Kd3 Kc7 6.Be3 Bd8 7.Bd4 Kd7 etc (7.735.561) 6937
 27/50	 0:03 	+0.47 	1.Bg1 Kc7 2.Be3 Bg7 3.Bd2 Bh8 4.Be1 Bf6 5.Bf2 Kc8 6.Bg1 Kc7 7.Bd4 Bxd4 etc (21.803.247) 7049
 27/52	 0:04 	+0.53++	1.c5 (35.153.154) 7080
 27/52	 0:06 	+0.65++	1.c5 (46.066.715) 7039
 27/62	 0:11 	+0.93++	1.c5 (81.572.405) 6967
 27/78	 0:32 	+1.46 	1.c5 bxc5 2.Be1 Be7 3.Bc3 Kc7 4.Kc4 Kc8 5.Bb2 Kb8 6.Bg7 Kc7 7.Bb2 Bd8 (227.347.834) 6892
 28/78	 0:45 	+1.54++	1.c5 (318.703.743) 6941  TB:2
 28/78	 0:59 	+1.70++	1.c5 (417.199.891) 6975  TB:4
 28/78	 1:11 	+1.75 	1.c5 bxc5 2.Be1 Be7 3.Bc3 Kc7 4.Ba5+ Kb8 5.Kc4 Bf6 6.b6 axb6 7.Bxb6 Bd4 etc (500.804.995) 6990  TB:4
Cheers,
Robert
MM
Posts: 766
Joined: Sun Oct 16, 2011 11:25 am

Re: FiftyMoveDistance in Houdini 2.0c

Post by MM »

Houdini wrote:Houdini 2.0c has an interesting new UCI option: FiftyMoveDistance.
The FiftyMoveDistance value defines the number of reversible moves after which the 50-move rule will kick in and the position is considered a draw.
The default value is obviously 50 moves, corresponding to the official FIDE 50-move rule.

Setting this option in the range of 10 to 15 moves can avoid the meaningless maneuvering that engines sometimes perform until they are close to the 50-move rule.
It can be also be useful to analyse more correctly one of the following situations:
- Closed positions in which no progress can be made without some sort of sacrifice;
- End games with a material advantage that is insufficient for winning.

The concept is easily demonstrated by two positions.

1) [D]4knQ1/7r/3p2p1/2bP1pP1/5P1N/6K1/8/8 b - -

A famous position (don't know from what game exactly), black can exchange the Rook on h4 to go into a position where the Queen is trapped and the result is a draw.

With default settings Houdini doesn't find the move, even at search depth 30+. The 50-move horizon is simply too far for Houdini to be able to see the draw.

Code: Select all

 32/55	 0:12 	+1.19 	1...Bf2+ 2.Kxf2 Rxh4 3.Ke3 Rh3+ 4.Ke2 Rh7 5.Kd3 Rh3+ 6.Kc4 Rh7 7.Kb5 Rc7 etc (99.099.674) 7671  TB:33
 33/62	 0:18 	+1.19 	1...Bf2+ 2.Kxf2 Rxh4 3.Ke3 Rh3+ 4.Ke2 Rh7 5.Kd3 Rh3+ 6.Kc4 Rh7 7.Kb5 Rc7 etc (141.867.654) 7685  TB:62
 34/82	 3:04 	+1.64 	1...Bf2+ 2.Kxf2 Rxh4 3.Ke3 Rh3+ 4.Ke2 Rh7 5.Kd3 Rh4 6.Qg7 Rxf4 7.Qf6 Rg4 etc (1.442.560.424) 7807  TB:354
With FiftyMoveDistance set to 15 moves Houdini nearly instantly plays Rxh4 and "understands" that it is a draw.

Code: Select all

 16/50	 0:00 	+0.90 	1...Bf2+ 2.Kxf2 Rxh4 3.Kf3 Rh3+ 4.Kg2 Rh7 5.Kf2 Ke7 6.Kg3 Ke8 7.Kg2 Ke7 etc (374.889) 5355
 17/50	 0:00 	+0.73 	1...Bf2+ 2.Kxf2 Rxh4 3.Qg7 Rxf4+ 4.Kg2 Rg4+ 5.Kf3 Rxg5 6.Qf6 Rg4 7.Qxd6 Re4 etc (2.062.056) 6423
 18/50	 0:00 	+0.97 	1...Bf2+ 2.Kxf2 Rxh4 3.Qg7 Rxf4+ 4.Kg2 Rg4+ 5.Kf3 Rxg5 6.Qf6 Rg4 7.Qxd6 Re4 etc (3.011.922) 6491
 19/50	 0:00 	+0.97 	1...Bf2+ 2.Kxf2 Rxh4 3.Qg7 Rxf4+ 4.Kg2 Rg4+ 5.Kf3 Rxg5 6.Qf6 Rg4 7.Qxd6 Re4 etc (4.451.608) 6508
 20/50	 0:00 	+0.93 	1...Bf2+ 2.Kxf2 Rxh4 3.Qg7 Rxf4+ 4.Kg2 Rg4+ 5.Kf3 Rxg5 6.Qf6 Rg4 7.Qxd6 Re4 etc (5.071.428) 6560
 20/50	 0:00 	+0.90++	1...Rxh4 (5.258.518) 6606
 20/50	 0:00 	+0.75++	1...Rxh4 (5.303.026) 6612
 20/50	 0:00 	+0.44++	1...Rxh4 (5.378.187) 6623
 20/50	 0:00 	+0.21 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kg3 Ke8 etc (5.581.632) 6644
 21/50	 0:00 	+0.21 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kg3 Ke8 etc (5.731.651) 6656
 ...
 28/50	 0:01 	+0.21 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kh3 Bc3 etc (14.179.628) 7267
 29/50	 0:02 	+0.21 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kh3 Bc3 etc (16.365.280) 7338  TB:1
 30/50	 0:02 	+0.16++	1...Rxh4 (22.129.889) 7396  TB:6
 30/50	 0:03 	+0.06++	1...Rxh4 (27.258.215) 7339  TB:7
 30/50	 0:04 	 0.00 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kh3 Bc3 etc (29.658.978) 7357  TB:7
 31/50	 0:04 	 0.00 	1...Rxh4 2.Kxh4 Bf2+ 3.Kh3 Bd4 4.Kg3 Ke7 5.Kf3 Ke8 6.Kg2 Ke7 7.Kh3 Bc3 etc (31.813.767) 7372  TB:10
2) [D]2k5/p7/Pp1p1b2/1P1P1p2/2P2P1p/3K3P/5B2/8 w - -

Another famous position (Spassky - Byrne, 1974), white has no other winning plan than pushing c5.

With the default Houdini eventually c5 will be found at large search depth, but not yet here:

Code: Select all

 42/72	 2:27 	+0.89 	1.Bg1 Kc7 2.Bd4 Bxd4 3.Kxd4 Kd8 4.Kd3 Ke8 5.Ke3 Ke7 6.Ke2 Kf6 7.Kd3 Kf7 etc (1.063.366.041) 7187  TB:883
 43/79	 4:02 	+0.89 	1.Bg1 Kc7 2.Bd4 Bxd4 3.Kxd4 Kd8 4.Kd3 Ke8 5.Ke3 Ke7 6.Ke2 Kf6 7.Kd3 Kf7 etc (1.747.738.183) 7205  TB:2.025
With FiftyMoveDistance set to 10 moves Houdini finds c5 much faster because it now "understands" that shuffling with the Bishop and King doesn't do anything useful.

Code: Select all

 15/38	 0:00 	+0.89 	1.Bg1 Bd8 2.Bd4 Kd7 3.Bg7 Ke8 4.Ke3 Kf7 5.Bh6 Kg6 6.Bf8 Bc7 7.c5 bxc5 etc (1.005.684) 6888
 16/38	 0:00 	+0.89 	1.Bg1 Bd8 2.Bd4 Kd7 3.Bg7 Ke8 4.Ke3 Kf7 5.Bh6 Kg6 6.Bf8 Bc7 7.c5 bxc5 etc (1.022.212) 6906
 17/38	 0:00 	+0.83--	1.Bg1 Bd8 (1.052.109) 6876
 17/38	 0:00 	+0.71--	1.Bg1 Bd8 (1.072.525) 6831
 17/38	 0:00 	+0.47 	1.Bg1 Kc7 2.Be3 Kc8 3.Bf2 Bd8 4.Bd4 Kd7 5.Ke3 Ke7 6.Bg7 Kf7 7.Bh6 Kg6 etc (1.125.430) 6779
 18/38	 0:00 	+0.47 	1.Bg1 Kc7 2.Be3 Kc8 3.Bf2 Bd8 4.Bd4 Kd7 5.Ke3 Ke7 6.Bg7 Kf7 7.Bh6 Kg6 etc (1.228.861) 6789
 ...
 26/44	 0:01 	+0.47 	1.Bg1 Kc7 2.Be3 Kc8 3.Ke2 Kc7 4.Bg1 Kc8 5.Kd3 Kc7 6.Be3 Bd8 7.Bd4 Kd7 etc (7.735.561) 6937
 27/50	 0:03 	+0.47 	1.Bg1 Kc7 2.Be3 Bg7 3.Bd2 Bh8 4.Be1 Bf6 5.Bf2 Kc8 6.Bg1 Kc7 7.Bd4 Bxd4 etc (21.803.247) 7049
 27/52	 0:04 	+0.53++	1.c5 (35.153.154) 7080
 27/52	 0:06 	+0.65++	1.c5 (46.066.715) 7039
 27/62	 0:11 	+0.93++	1.c5 (81.572.405) 6967
 27/78	 0:32 	+1.46 	1.c5 bxc5 2.Be1 Be7 3.Bc3 Kc7 4.Kc4 Kc8 5.Bb2 Kb8 6.Bg7 Kc7 7.Bb2 Bd8 (227.347.834) 6892
 28/78	 0:45 	+1.54++	1.c5 (318.703.743) 6941  TB:2
 28/78	 0:59 	+1.70++	1.c5 (417.199.891) 6975  TB:4
 28/78	 1:11 	+1.75 	1.c5 bxc5 2.Be1 Be7 3.Bc3 Kc7 4.Ba5+ Kb8 5.Kc4 Bf6 6.b6 axb6 7.Bxb6 Bd4 etc (500.804.995) 6990  TB:4
Cheers,
Robert
Hi, yes, it's very interesting, but do you suggest to use this option by default in games? And, in this case, it could allow to gain some elo?

Thank you

Regards
MM
User avatar
Houdini
Posts: 1471
Joined: Tue Mar 16, 2010 12:00 am

Re: FiftyMoveDistance in Houdini 2.0c

Post by Houdini »

MM wrote:Hi, yes, it's very interesting, but do you suggest to use this option by default in games? And, in this case, it could allow to gain some elo?

Thank you

Regards
It's an interesting analysis feature, probably not something that will add a lot of Elo.
You cannot really use it in competitive games unless everyone agrees to accept the accelerated 50-move rule, because after FiftyMoveDistance moves Houdini will think the game is draw whatever move it plays.

Robert
mwyoung
Posts: 2727
Joined: Wed May 12, 2010 10:00 pm

Re: What is going on here?

Post by mwyoung »

What is going on here? Version c seems a bit more crushing then normal.

Is this luck or is version c truely this strong?

Blitz 5m 0

1 Houdini 2.0c Pro x64 +165 ..........½11½½½1111½01½½½111½½½1½1½1½½½½111 24.5/34
2 Deep Rybka 4.1 SSE42 x64 -165 ½00½½½0000½10½½½000½½½0½0½0½½½½000 9.5/34
User avatar
hgm
Posts: 27812
Joined: Fri Mar 10, 2006 10:06 am
Location: Amsterdam
Full name: H G Muller

Re: FiftyMoveDistance in Houdini 2.0c

Post by hgm »

Houdini wrote:You cannot really use it in competitive games unless everyone agrees to accept the accelerated 50-move rule, because after FiftyMoveDistance moves Houdini will think the game is draw whatever move it plays.
To prevent that you could of course make it one-sided: if the reversible-move count is between the set value and 50, correct positive scores fort he side Houdini is playing to zero, but leave positive scores for the opponent as they are.

You could also slowly ramp down the score from the given count on, rather than setting it abruptly to zero. This would make the hash corruption by 50-move draws less severe.
User avatar
Laskos
Posts: 10948
Joined: Wed Jul 26, 2006 10:21 pm
Full name: Kai Laskos

Re: FiftyMoveDistance in Houdini 2.0c

Post by Laskos »

Houdini wrote:
MM wrote:Hi, yes, it's very interesting, but do you suggest to use this option by default in games? And, in this case, it could allow to gain some elo?

Thank you

Regards
It's an interesting analysis feature, probably not something that will add a lot of Elo.
You cannot really use it in competitive games unless everyone agrees to accept the accelerated 50-move rule, because after FiftyMoveDistance moves Houdini will think the game is draw whatever move it plays.

Robert
Very nice, I often used your second position to see what engines do, only few modern engines find c5!, and after quite a bit of time, Houdini with this setting finds it in a matter of seconds. I have several questions:

1) How much Elo decrease would be setting the rule to 15 moves in real games? If only by say 10 Elo points, then it's still applicable in games, to avoid boring and stupid shuffling of pieces.

2) Could you make a Houdini Winfinder? Meaning sacrificing strength for finding tactical shots? Could be useful in analysis too, besides test suites. I think Critter is a bit more of a Winfinder.

3) Could you plot a middlegame performance curve with the evaluation? The evaluation of Houdini 1.5a is damped compared to Rybka, and Rybka is damped compared to Stockfish, they have different performance curves with the evaluation. An evaluation of 0.70 in the middlegame means what for Houdini? Something like 80% performance?

Thanks,

Kai
User avatar
Houdini
Posts: 1471
Joined: Tue Mar 16, 2010 12:00 am

Re: FiftyMoveDistance in Houdini 2.0c

Post by Houdini »

1) I have no idea about the Elo loss, I've never tested it with engine games.
Note that it would be possible to make a version that uses the same distance, say 10 moves, to a 50-move draw irrespective of the number of reversible moves already played in the starting position of the analysis.
The only purpose of the FiftyMoveDistance idea is to bring the 50-move rule within the engine's computational horizon, instead of having to wait 40 moves before this happens.

2) It's possible, but probably not very interesting. Houdini is tactically sufficiently strong for nearly every purpose.

3) A long time ago I matched an eval of +1.00 with about 85% win. Not sure whether that is still the case with Houdini 2.
User avatar
Peter Skinner
Posts: 1763
Joined: Sun Feb 26, 2006 1:49 pm
Location: Edmonton, Alberta, Canada
Full name: Peter Skinner

Re: FiftyMoveDistance in Houdini 2.0c

Post by Peter Skinner »

I've recently added Houdini to my "scrape" that removes pirated links from file share websites.

It would be helpful to have the md5 signatures for your installers and your executables so it is easier to track down and remove.

Peter
I was kicked out of Chapters because I moved all the Bibles to the fiction section.
Werewolf
Posts: 1797
Joined: Thu Sep 18, 2008 10:24 pm

Re: FiftyMoveDistance in Houdini 2.0c

Post by Werewolf »

Hi Robert,

Thank you for your hard work. I have purchased H2 but I saw a description that the Aquarium version has a fatter evaluation profile for IDeA.

Is this right and does it make much difference under IDeA do you know?
User avatar
Evert
Posts: 2929
Joined: Sat Jan 22, 2011 12:42 am
Location: NL

Re: FiftyMoveDistance in Houdini 2.0c

Post by Evert »

hgm wrote: To prevent that you could of course make it one-sided: if the reversible-move count is between the set value and 50, correct positive scores fort he side Houdini is playing to zero, but leave positive scores for the opponent as they are.

You could also slowly ramp down the score from the given count on, rather than setting it abruptly to zero. This would make the hash corruption by 50-move draws less severe.
It's an interesting idea.
I'm going to try the following: if for a number of iterations (say 5) no progress has been made (the best move has not changed and the evaluation has not improved much, maybe since the first few plies or so), set the half-move counter to a value closer to the limit (I start adjusting the score to 0 at 80, reaching 0 at 100). If we now find a move that makes progress (this will be a sacrifice or a pawn push, obviously), smoothly return the half-move counter to its proper value (otherwise the score will keep being dragged down to 0).

I don't expect much in terms of playing strength, since by the time this kicks in, the game is probably already decided.