-
这个项目本来是室友@xihoo的密码学大作业,也就是破解替换密码啦,密文给我了,明文现在看起来是harry potter中的一段。
-
室友和他队友的想法是将单字频与双字频或者可能的话连带多字频一起考虑,但是如何加权之类的比较难以决定
-
作为被退火算法禁锢思维的本宝宝自然想用退火码一下,感觉挺合适的,于是刷了一个晚上,写下了这个repo
-
实际上并不是原本的退火算法,我记录了所有的历史状态,并根据能量随机选取一个点进行变异,这样的话感觉会好一些,可以避免跌入能量极值,虽然这样和退火算法不一样,但是能感觉到效果应该是一样的,虽然并没有来得及证明
-
变异算子即交换两个字母,交换概率是根据单字频插值的好像叫高斯范数的东西计算的,那个东西叫啥名字不记得了,以前在核回归里见到过,总之频率越接近则变异概率越大
-
为了计算能量,我统计了textfiles中的全体小说的单词频率,注意不是多字频,而是单词频,然后利用ac自动机在变异后的状态中搜索所有单词频率,每个单词权重不一样,频率与权重综合考虑得到能量
-
A字母和B字母交换的概率 = exp( -( log(p(A))-log(p(B)) )^2 / 系数^2 ),注意未归一化,这样做是为了让AB和BA可交换,同时我希望观察比值信息而不是差值信息
-
每个单词权重为单词正常频率*2^单词长度,能量为单词权重乘上文中单词频率,注意这样需要找能量极大值
-
退火时一个状态被选取以用来变异的相对概率为exp(能量/温度),计算历史状态的概率,依概率选择一状态后,根据变异算法变异,如果发现新状态未在历史中出现过,则计算,否则迭代变异算子
-
修改wordlist
-
归一化各个参数