问题标签 [gecode]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Gecode 中的替代分支策略
我在这里发帖询问是否有办法交替不同的分支策略。让我解释一下,我有一个有效的分支策略,我们称之为策略A。最大的问题是策略A不能经常使用。所以当我不能使用策略A时,我会使用另一种策略,我将其称为策略B,它的效率较低。
文档说:
分支订单。创建分支器会将其注册到其主空间。空间维护其分支器的队列,因为首先注册的分支器也首先用于分支。分支队列中的第一个分支称为当前分支。
所以,我想如果我发布分支 A 然后分支B,分支Astatus
将具有优先级,并且每次A说没有分支要做,分支B将被使用。似乎我错了,因为当status
分支返回false
时,它再也不会被调用。这是一个“最小示例”:
在此示例中,如果要分配的下一个变量位于偶数索引上并且该变量可以采用( else )的值,status
则分支器A的 如果下一个要分配的变量位于奇数索引上并且该变量可以取( else)的值,则分支器B返回。使用该代码,我希望获得解决方案和(以及其他组合,例如),但是由于分支在返回时被处理,因此只分配了前两个变量。true
1
false
status
true
2
false
[1, 2, 1, 2, ...]
[!1, !2, !1, !2, ...]
[!1, 2, 1, !2, ...]
status
false
有没有一种好方法可以使分支器在status
返回后不被处理false
(或交替使用两种不同的分支策略),还是应该将两个分支器合并为一个?
minizinc - 显示时间与 Minizinc 模型中的实际求解时间不同
我编写了一个大型 minizinc 模型,其中包括带有 int_search 语句的 var 变量,以便正确排序。它包含输出语句,我在其中使用 fix(var variables) 语句输出变量值,它包含一些使用内置函数 sum、bool2int 等的函数。现在,当我运行模型时,它会在屏幕上显示一个非常很长时间(比如 5-6 分钟),但运行时间/求解时间(默认情况下求解器的打印信息)仅显示 20 秒。为什么会发生这种奇怪的事情?是不是因为输出语句也很耗时?但是变量在那个时候已经固定了,那为什么会这样呢?
c++ - Gecode,使用 gecode.int.hh 编译程序时出错
我为 VS 2017 安装了 Gecode 6.0。将目录添加到 /lib 和 /include。然后将 gecode/int.hh 包含到 Hello World 程序中。在编译过程中出现了 3 个奇怪的错误:
错误 C2084 函数“void Gecode::cmb_hash(size_t &,::size_t)”已经有一个主体 ConsoleApplication3 c:\program files\gecode\include\gecode\support\hash.hpp 61
错误 C2264“Gecode::cmb_hash”:函数定义或声明错误;函数未调用 ConsoleApplication3 c:\program files\gecode\include\gecode\support\hash.hpp 62
错误 C2264“Gecode::cmb_hash”:函数定义或声明错误;函数未调用 ConsoleApplication3 c:\program files\gecode\include\gecode\int\extensional\dfa.hpp 100
有谁知道如何摆脱这些错误?提前致谢。
minizinc - Gecode 和 G12 (MIP) 是否使用无限精度算术?
我只想知道这两个 MiniZinc 求解器是否默认使用无限精度算术。
c++ - 矩阵中的 GECODE 成对不同的列
我正在研究一个 GECODE 求解器来实现一个矩阵生成问题。我已经弄清楚了我需要的所有约束,除了一个:
Given a Matrix[M, N], all column vectors must be pairwise distinct.
这是我想写的代码:
但我不知道如何用提供的原始约束来表达这一点。我知道distinct()
存在,但是我不知道如何对矩阵中的列进行操作,而不是对列矩阵本身中的元素进行操作。表达这种对矩阵的约束的最佳方式是什么?
c++ - Gecode:使用浮点值约束整数变量
我Gecode
通过它的C++
API 在一种带有正面和负面例子的学习环境中使用。在这种情况下,我有两个BoolVarArray
:positive_bags_
和negative_bags_
.
而且我想做的事情似乎很简单:我想根据用户参数以最小的增长率约束来约束这些袋子gmin
。
因此,约束应如下所示:sum(positive_bags_) >= gmin * sum(negative_bags_)
. 它使用这样rel
定义的函数工作:rel(*this, sum(positive_bags_) >= gmin * sum(negative_bags_))
但我的问题是,在我的情况下gmin
是一个浮点数,但被转换rel
为整数。
因此,我只能将其限制positive_bags_
为2
, 3
, ... 倍,negative_bags_
但我需要将我的实验定义gmin
为1.5
例如。
我检查了文档,没有找到linear
同时使用Boolean
/Integer
和Float
变量的定义。
有没有办法使用 float 来定义这个约束gmin
?
提前致谢!
c++ - 如何在 Linux 上使用 Gecode Framework 运行 .cpp 文件?
我使用 Ubuntu 18.04 并尝试编译 Gecode 带来的示例“money.cpp”文件。我下载了(gecode-release-5.1.0.tar.gz)并解压。然后安装 Gecode,我执行以下步骤:
(1) ./config (2) 使
我得到满意的安装。
然后我尝试编译money.cpp,像这样:$g++ money.cpp
我收到以下错误:
致命错误:gecode / driver.hh: No such file or directory #include ^ ~~~~~~~~~~~~~~~~~
我知道问题在于它无法识别这些库,但我怎样才能让我的 .cpp 或编译阶段识别它们呢?
问候!阿尔贝托
linux - 如何使用 cmake 将 gecode 作为外部库包含在我的 c++ 项目中?
我是 CMake 新手,在一个简单的问题上需要一些指导:我通过以下链接在我的 Ubuntu 18.04 机器中从源代码构建 gecode 。该库安装在/opt/gecode-release-6.2.0
目录中。我有一个 C++ 简单项目,其源代码使用 gecode 库函数,并且该项目是使用 CMake 构建的。但是,计算机似乎找不到安装 gecode 的位置。
我已经尝试了以下方法,CMakeLists.txt
希望可以正确定位 gecode 库,但没有一个有效:
include_directories(${LD_LIBRARY_PATH})
find_library(GECODE_LIB gecode)
link_directories(${LD_LIBRARY_PATH})
include_directories(/opt/gecode-release-6.2.0)
optimization - 如何最大化大于 32 位的 var int?
我正在使用带有内置 Gecode 6.1.1 的 minizinc,我想最大化一个目标函数,其值远大于 max int 32。32 位整数的最大值是 2147483646。虽然似乎没有太多信息与minizinc 参考中的整数最大值相关。然而,以下测试表明 Minizinc 使用 32 位整数。
测试非常简单,它只是试图最大化一个 var int。
结果是
最大整数 = 2147483646
结果接近最大 int32 值,并且 miniZinc 似乎无法进一步“最大化”它。以下示例返回一个奇怪的错误。
错误消息如下。该错误消息的信息量不是很大,但在尝试使用大于 2147483646 的数字时会显示。
错误:行号中的整数文字无效。2 错误:语法错误,行号中出现意外的“,”。2 进程以非零退出代码 1 结束
我的问题如下:我可以将 int64 位整数或任何其他大整数表示与 minizinc 一起使用吗?如果可以,如何?(使用浮点数不是一种选择)理想情况下,我想举一些例子来说明如何最大化某些东西
c++ - 用于约束随机化的 Gecode 与 Z3
我正在寻找 SystemVerilog 语言的基于 C++ 的替代方案。虽然我怀疑任何东西都可以与 SystemVerilog 约束语言的简单性和灵活性相匹配,但我已经决定使用 Z3 或 Gecode 来完成我的工作,主要是因为它们都在 MIT 许可下。
我正在寻找的是:
- 支持可变大小的位向量和位向量算术逻辑运算。例如:
据我所知,Gecode 的问题在于它没有提供开箱即用的位向量。然而,它的编程模型似乎有点简单,它确实提供了一种方法来创建自己的变量类型。所以我也许可以围绕 C++ 位集创建某种包装器,类似于IntVar
围绕 32 位整数的包装器。但是,这将缺乏执行基于乘法的约束的能力,因为 C++ 位集不支持此类操作。
Z3 确实提供了开箱即用的位向量,但我不确定它会如何处理尝试设置约束,例如 128 位向量。我也不确定如何指定我想尽可能生成满足约束的各种随机变量。使用 Gecode,鉴于其文档的详尽程度,它会更加清晰。
一个简单的约束规划模型,接近或类似于 SystemVerilog。例如,我只需要输入 (x == y + z) 而不是 EQ(x, y + z) 之类的语言。据我所知,这两个 API 都提供了如此简单的编程模型。
为了产生随机刺激而执行约束随机化的一种方法。如,我可以提供一些随机种子,根据约束条件,产生的答案可能与之前的答案不同。类似于 SystemVerilog 随机调用可能会产生新的随机结果。Gecode 似乎支持使用随机种子。Z3,不太清楚。
支持加权分布。Gecode 似乎通过加权集支持这一点。我想我可以在某些条件和布尔变量之间建立关系,然后为这些变量添加权重。Z3 似乎更灵活,因为您可以通过优化类为表达式分配权重。
目前,我还没有决定,因为 Z3 缺乏 Gecode 在开箱即用的变量类型中所缺乏的文档。我想知道是否有人有任何使用这两种工具的经验来实现 SystemVerilog 的功能。我也想听听对灵活许可下的任何其他 API 的任何建议。