np.matrix('12 19 6 14 4 9; 8 17 1 24 22 16; 21 3 23 2 20 11; 15 10 5 13 18 7')
which has a score of 376.899. This was produced in 20K swaps with the line: best, score = anneal(n=10000)
which was then further refined with: best, score = anneal(start_temp=0.2, advent=best, n=10000)
where anneal() is defined here: https://pastebin.com/xBVGJfQdThe score() function is a bit slow at the moment. If I get some time later, I might see if I can speed it up a bit, which will allow for some faster experimentation.
EDIT: replaced code with pastebin link to save space in comments
[[12, 19, 6, 14, 4, 9],
[ 8, 17, 1, 24, 22, 16],
[21, 3, 23, 20, 2, 11],
[15, 10, 5, 13, 7, 18]]
Score = 376.6144674353488Found by increasing number of iterations to 100000
Sim.annealing followed by an exhaustive pair-swap search to find the local minimum would have found this more efficiently. Possibly there are some further refinements left -- I haven't run the exhaustive pair search on the above!
[[ 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 [[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.998672775885I've gotten close, but not cracked it yet. I was wondering if anyone would break the 376.0 barrier!
https://gist.github.com/jffry/fab43b5b65499c3f513fea70159780...
https://rjp.is/calendars/topthree.png
Compare and contrast the original set from @jgc's article:
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!
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