back

by pentestercrab·7y ago·view on hn ↗
My best so far, but not using the improvements above, just small tweaks to the code from the blog post:

  [[ 9 15  4 20  6 12]
   [18 23 11  1 22 17]
   [ 7  2 16 24  3  8]
   [13 21  5 10 19 14]]
  376.364049355
1 comments
My Go code, slightly tweaked from the pure random approach, got this one:

    [[17 11  6 19 14  8]
     [ 4 22 24  1  3 21]
     [ 9 15  2 23 12 16]
     [13 20  7 18  5 10]]
    375.998672775885
Ooh nice! That's the first one I've seen below 376.0

I've gotten close, but not cracked it yet. I was wondering if anyone would break the 376.0 barrier!

Added to https://rjp.is/calendars/topthree.png (which is now four but nvm) to show the exceptional symmetry. I'm thinking we might be right on the lower limit here - doesn't seem much room for more symmetricalising.
I'm wondering if vertical symmetry might be involved (and a way of optimising future efforts) - plotting the journeys of the top three on this post definitely seems to imply that.

https://rjp.is/calendars/topthree.png

Compare and contrast the original set from @jgc's article:

https://rjp.is/calendars/originals.png

Thanks for keeping track. Quite fascinating how algorithms employing so much randomization can arrive at such structure and symmetry.

Finally got a < 376.0 from my own code using simulated annealing method...

375.998672775885

  [[13 20  7 18  5 10]
   [ 9 15  2 23 12 16]
   [ 4 22 24  1  3 21]
   [17 11  6 19 14  8]]
...only to realise it's the same as yours, but with the rows reversed! Rather surprised, but I now wonder if there is only a small number of very-low-scoring solutions. So perhaps this is less of a coincidence than it first appears.

I'm now using a much more aggressive temperature drop-off to find decent candidates early, followed by a tempering phase to search for nearby solutions, and a final cool-off to refine the final answer. I'm still using only random pair swaps in Python, so probably wasting a lot of cycles, but I'm still quite surprised how quickly it converges to some pretty decent scores. Beyond that I'm just going to try lots of random starting layouts.

I'm interested to see if my method can find any of the other posted solutions or (fingers crossed!) any new ones, but I may need to crunch through a lot more candidates... I will have to translate from Python into something faster to up my game!

Not entirely scientific but starting from the trivial 1-24 board, I did 100M random swaps (in Go, keeping all of them, takes about 4 minutes) and counted how many scores were in each bucket of 10 (ie 370-379.99, 380-389.99, etc.) Having done this a few times and never got anything in 37, I'm thinking the number of solutions below 380 must be relatively small, yeah.

    37	0
    38	2377
    39	1103812
    40	16535778
    41	39376324
    42	29525491
    43	10609914
    44	2394340
    45	395239
    46	51463
    47	4880
    48	363
    49	19
    50	0
The symmetry thing makes sense, but now I wonder if there's are really "interesting" or not. Does the symmetry spoil the fun of searching or not?