【发布时间】:2019-11-08 01:23:00
【问题描述】:
我正在学习使用 minizinc 的 coursera 课程。在其中一项任务中,我一直在旋转我的轮子,因为我的模型在隐藏的测试用例上表现得不够好。我终于通过在我的模型中更改以下类型的访问来解决它
来自
constraint sum(neg1,neg2 in party where neg1 < neg2)(joint[neg1,neg2]) >= m;
到
constraint sum(i,j in 1..u where i < j)(joint[party[i],party[j]]) >= m;
我不知道我错过了什么,但是为什么这两个的表现会有所不同呢?似乎它们的性能应该相似,前者可能会稍快一些,但性能差异是巨大的。我猜前者错过了某种优化?或者,我真的错过了什么吗?这些行真的会导致不同的行为吗?我的目的是总结团队中每个元素的强度。
杂项。详情:
- party 是一个枚举变量数组
- party 的索引集是 1..real_u
- 方中的每个元素应该是唯一的,除了一个虚拟变量。
- 求解器是 Gecode
- 我的模型验证是在 coursera 服务器上完成的,所以我不知道他们的编译器使用了什么优化级别。
edit:由于 minizinc(mz) 是一种声明性语言,我意识到 mz 中的“数组访问”在命令式语言中不一定有直接的推论。然而,对我来说,这两行在语义上是同一个意思。所以我想我的问题更多的是“为什么上述行在 mz 中的语义不同?”
edit2:我不得不更改有问题的示例,我违反了 coursera 的荣誉代码。
【问题讨论】:
-
我不确定是否会共享 FlatZinc。我不知道如何阅读 FZ,但我会看看并研究共享 FZ。这是在“离散优化的基本建模”课程中,它是作业 2。我得到了教授的回复,他给出了简短的回复,基本上说 mz 编译器在第二种情况下利用了优化,但不是首先。
-
我看到了他的回答。如果能对这种“更有效的形式”有所了解,那就太好了。
标签: constraint-programming minizinc