Rust,得分= 4997216,时间= 2017-07-12 00:18 UTC
这比我在文献中找到的最佳结果(即1148805)(Ronan Le Bras,Carla P. Gomes,Bart Selman,关于Erdős差异问题,2014)提高了4.3倍。
长度为4997216的输出序列
GitHub上的源代码
跑步
程序接受最大差异作为参数(挑战语言为x − 1,以符合更常见的数学惯例)。它以略微压缩的格式生成增量输出,对于x = 3 ,它看起来像这样:
$ cargo run --release 2
add +--+-++-++--+-++--+--+-++--+--+-++-++--+-++--+--+-++-++--+-++-++--+-++--+--+-++-++--+-++-+
length 90
delete 12
add --++--+-++-++--+-++--+--+-++--+-
length 110
delete 4
add +-+--+-++-++--+-++--+--+-++-++--+-++-+
length 144
delete 6
add --++-++--+-++--+--++++--+--+-++-++--+-++--+--+-++--+--+-++-++--+-++--+--+-+-
length 214
delete 208
add --+++--+++--+-+--+++--+-+--+++--++---+-+--+-+-++-+--+++--+++--+---++-+--+-++-+++---++--+-++-++--++--+--++--+++--+-+-++-+--+-+--+++---+++-+----+++--+-++--++-+-++--+-+--+-+-++-+--+++--++--+--+--+-++-++---++-++-++-+--+-++
length 224
delete 2
add -+++--+-+--+++---++--+--
length 246
done
其中,add
手段是在当前序列的末尾附加一个符号序列,delete
手段是从当前序列的末尾除去一些符号,并length
断言当前序列的长度。由于发现了越来越长的序列,该方案避免了产生大量千兆字节的中间结果。您可以使用以下Python程序提取迄今为止最好的结果:
import sys
s = ''
for line in sys.stdin:
cmd = line.split()
if cmd[0] == 'delete': s = s[:-int(cmd[1])]
elif cmd[0] == 'add': s += cmd[1]
elif cmd[0] == 'length': assert len(s) == int(cmd[1])
print(s)
怎么运行的
这里大约有一千行代码,因此这只是一个非常粗略的概述。
我们将搜索限制在完全乘法的序列(具有f(a · b)= f(a)· f(b)的序列)上,因为这意味着我们只需要考虑对n = 1的部分和和对于此种ñ ≥2将满足自动绑定相同的。
对于部分分配的符号序列的任何子串f(i + 1),…,f(j)(因此每个元素为'+','-'或未知),将危险+(i,j)定义为两倍“ +”的数量减去长度j − i(为方便起见,我们允许i小至− x + 2并假设f(− x + 3)=⋯= f(0)=“ +”这个目的)。类似地定义危险-(i,j)。然后对n的部分和定界= 1相当于条件,当我 ≡ Ĵ ≡ X(模2),危险+(我,Ĵ)≤ X - 2和危险- (我,Ĵ)≤ X - 2。
我们建立了一个增量数据结构,该结构支持对具有最大危险的子字符串进行恒定时间查询,并进行对数时间更新。它通过关联四个值来工作:
- 危险(i,j),
- 最大我 ≤ ķ ≤ Ĵ危险(我,ķ),
- 最大我 ≤ ķ ≤ Ĵ危险(ķ,Ĵ),和
- 最大我 ≤ ķ ≤ 升 ≤ Ĵ危险(ķ,升),
每个长度为2的字符串,每个其他长度为4的字符串,每个第四长度为8的字符串,依此类推。与更长的字符串相关联的值可以在恒定的时间内从与其两个一半相关联的值中计算出来。
这种结构,加上一些辅助信息,使我们可以非常快速地对部分序列进行约束传播和冲突检测。我们使用它来进行类似于CDCL的搜索,包括单元传播,决策级别和非按时间顺序回溯(但暂时没有子句学习),以获取长度越来越长的完整序列。
在每个搜索步骤中,我们都会猜测最早的未分配符号。用于进行此猜测的启发式方法对于避免大量回溯非常重要。我们使用f(3· k)= − f(k),f(3· k + 1)='+',f(3· k + 2)='−'。
结果
差异0、1和2搜索立即找到长度为0、9和246的最佳完全乘法序列。
差异3搜索在几秒钟内停留在41319处,这与Le Bras等人(2014年)发现的已知的最佳长度127645的最佳完全乘法序列(以及不久之后发现的长度130000的更长的非乘法扩展)相距甚远),但比长度17000之前的最佳已知序列好得多。
差异4搜索在大约5分钟内连续或多或少地改善了最长序列,直到卡在4997216为止。之前的最佳已知长度1148805 = 9·127645的序列是通过用+ − 替换每个符号s从差异3序列扩展而来的− +++++ s。据我所知,这么长的序列对于一般的SAT求解器来说很难直接进行合理的改进(但是,亲爱的读者,也许您能证明我错了!)。
我希望我需要在程序中添加某种子句学习功能,以克服这些障碍。
该序列为2187×2285位图
(单击以查看完整分辨率。)