曹操最终发现衣带密诏的
秘密,暴怒之下,就下令缉拿所有奉汉献帝之命密谋除去自己的大臣,刘备也是
追缉对象之一,于是与关羽、 张飞一同出逃
曹操的追缉小队将刘备的军队打得落花流水 混乱中三兄弟走散
但关羽却意外拾获刘备无意丢失的神算法板 曹操的士兵俘获刘备家人
无奈之下,关羽以降于汉室之名 归顺曹操。
日益壮大的曹操也向袁绍宣战 而归顺曹营的关羽答应辅助曹操
大战在即,曹操也需要增炼兵器
补强军队,关羽记起以前曾用神算法板解决类似问题
就答应为曹操制定最佳的兵器生产计划 但当关羽运用神算法板时
却发现当前的生产问题无解。
因此关羽利用神算法板 呼叫大师求助。
>> 曹操要求关羽 帮忙解决这个兵器生产的问题,关羽觉得这个非常容易
因为他们之前已经面对过相同的问题了,他们需要做就是 就是把新的数据输入就可以解决这个新的问题
所以他们就把这个模型再跑过了 但是出来的结果呢?就是不是他们想象的
出来呢就是不可以满足这个结果 到底哪里出了问题呢?
如果你们有编程的经验的话,很可能都明白
无论我们编的程序是怎么样,又或者是我们的数据都有可能 是有出错的机会。
我们搞计算机的人呢就叫这样子叫 BUGS!
就是虫了。
这个 bugs 的 表征呢在我们模型的求解过程里面,有可能是
没有解,不可以满足。
也可以呢是 过多的解,有些解出来了,我们觉得不是我们的问题的
解来的,也有可能就是 丢失了解,就是有一些我们觉得应该是解的,但是没有求出来
其实在 MiniZinc 里面呢我们可以有不同的方案
去帮助我们去找出哪里是出错了。
包括断言 一个叫追踪的功能,而且我们还需要理解这个 关系语义。
我们在这里呢先讲一讲断言
防御性的编程方法要求我们对我们数据的值的合法性 进行这个检测。
在 MiniZinc 里面我们可以利用断言 断言在 MiniZinc
里面是一个内置的函数,叫 assert assert
有两个参数,第一个参数呢是一个布尔型的表达式 第二个参数呢是一个字符串的表达式,它的语义是什么呢?
就是要求如果这个布尔型的表达式,它是错误的话
那我们就输出这个字符串的表达式的值,然后把这个 运行中断,不然的话这个 assert 就很简单,就返回
true 我们看看下面这个例子,在这个例子里面我们有一个 整型数组的变量叫
capacity,就是容量的意思,就是对于每一个资源它的容量是多少
我们就可以利用下面这个断言呢来检测到底这个
数组里面每一个元素是不是都是大于等于 0 如果出现错误的话,那这个
字符串表示一个错误就给输出出来了 我们再看看下面一个例子
我们有另外一个参数数据的声明,我们叫 consumption
它也是一个数组,是一个二维的数组,就是对于 每一个产品跟每一个资源呢
这个产品是用了这个资源是多少的 我们就可以看看,一个断言
这个断言呢,就是说对于每一个产品,也对于每一个资源呢
它们看一看,检测一下这个用量是不是大于等于 0
的 不然的话,它就把这个字符串输出出来了 但是这个例子不同的地方,我们看看,我们会把这个产品
跟这个资源出了问题的时候,把它们的值也输出出来
那我们就看了这个错误的信息呢,我们就直接可以知道 问题出了在哪里了。
所以我们在这里 看见的这个例子呢,比我们刚才看这个例子呢是比较好一点的
好了,所以对我们这个 武器生产的问题里面,我们里面的
不同的变量数据参数呢,我们都需要 加入这个断言来检测它们的合法性
然后我们再次求解了,然后发现 MiniZinc
呢有一大堆的信息出来了,但是最后我们可以看见呢 原来 capacity
这个参数它的第三个元素出了问题,原来它是小于 0
的 我们再看一看,这个就是我们新的数据文件了。
原来真的在 我们初始化这个 capacity
这个数组的时候,我们错误地把它的第三个元素 输入了一个负值的一个数字
我们看见这个文件呢比较小一点,但是 通常的情况之下,如果我们数据的量是非常大的时候
我们单凭我们的眼睛去看,是非常困难可以找出这个数据的错误的
我们来一个小结 非常简单,就是建议你们呢,我们
总是应该给所有我们输入的 数据的假设,我们都应该利用一个断言来检测一下
你们可能说,这个非常麻烦也非常费时
但是如果你们可以比较一下,如果你们要花费多过
几个小时来找出,为什么你们的模型没有输出你们期望的结果呢
我们给你们建议就是,利用这个断言来检测你们的数据就更好了
[空白_录音] [空白_录音]