七步成诗的覆面算 - 玩三国, 学【离散优化建模】基础篇 04
离散优化建模 基础篇
图片和内容摘自离散优化建模基础篇, MOOC由香港中文大学开发, 推荐各位到 Coursera 边看视频边学习, 链接见阅读原文.
问题描述
曹植是枭雄曹操的第三个儿子。他十岁以前就可以吟诗万首,因此曹操最喜爱他。
(图自网络)
不过他天生率性妄为,相比起来,他的大哥曹丕则更加沉稳。最终,曹操选择了曹丕作为他的继承者,这令曹植感到难以接受。
当曹操去世时,曹植没有出现在他的葬礼上,而是在家中醉酒。曹植非常生气地叫人把他绑了过来。
曹丕告诉曹植,若要告诉大家自己还有存在的价值而免于死罪,曹植需要证明自己的文学天赋。曹植需要在七步之内就他和大哥曹丕的关系作诗一首,但是诗中不能出现“兄弟”一词。
于是曹植毫不犹豫吟诗一首:
煮豆燃豆萁,
豆在釜中泣。
本自同根生,
相煎何太急。
曹丕听罢不禁感动落泪,然后释放了曹植。
我们这次需要解决与七步成诗故事相关的覆面算问题(Verbal arithmetic)。覆面算问题是一种数学谜题,它要求玩家找出在等式中字母各自代表的数字。其中最著名的谜题就是:
覆面算的规则如下:
- 每一个字母代表一个不同的数字;
- 每个单词的首字母不能为0(否则单词代表的并不是一个正常的数)
- 算术等式必须成立。
比如对上面题中,我们需要确定每个字母代表的数字,以下面的数字指定就可以让这个等式成立, S 对应 9, E 对应 5 , N 对应 6, ......
豆泣
来看第一道与七步诗相关的覆面算题目"豆泣", 让我们用 Wolfram 语言来看看求解,
首先将题目中的单词分解成字符, 也把首字母与余下字符给列举出来,对于该题目刚好是 10 个字符对应了 0 ~9 的数字:
再来建立约束条件, 为了快速求解出可能的解集, 先不添加每个字母互不相同的约束, 否则很多约束堆在 Sovle 里面, 程序跑的会非常慢:
共求出了 5000 个解, 下一步就要从这些解中, 将每个字母互不相同的解筛选出来, Pick 与 Unequal 来配合瞬间算出了结果:
注: 这里写出了一种方法, 如果有更简便快捷的解法, 不妨大家一起讨论!
曹植的试炼与七步成诗
再看看其他覆面算问题, 对于下面这个模型中需要额外约束 (丕)代表的数字是Z(植)代表的数字的三倍,而且 O 代表的是与它形状相似的数字 0:
七步成诗 - 这次的模型并不是要简单的找出可行解,还需要把 VERSE 这个单词所代表的数值最大化。
感兴趣的朋友也可以亲自动手算下上面的覆面算问题, 我这里只将算出来的结果列出来.
曹植的试炼:
七步成诗:
好, 上面就是利用Wolfram语言来解决七步诗的覆面算问题. 现在让我们在下一篇的课堂再见. 这里感谢各位每一位看到这里的老师和朋友!
祝春节假期愉快!