问题标签 [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.

0 投票
1 回答
147 浏览

c++ - Gecode 中的替代分支策略

我在这里发帖询问是否有办法交替不同的分支策略。让我解释一下,我有一个有效的分支策略,我们称之为策略A。最大的问题是策略A不能经常使用。所以当我不能使用策略A时,我会使用另一种策略,我将其称为策略B,它的效率较低。

文档说:

分支订单。创建分支器会将其注册到其主空间。空间维护其分支器的队列,因为首先注册的分支器也首先用于分支。分支队列中的第一个分支称为当前分支。

所以,我想如果我发布分支 A 然后分支B,分支Astatus将具有优先级,并且每次A说没有分支要做,分支B将被使用。似乎我错了,因为当status分支返回false时,它再也不会被调用。这是一个“最小示例”:

在此示例中,如果要分配的下一个变量位于偶数索引上并且该变量可以采用( else )的值,status则分支器A的 如果下一个要分配的变量位于奇数索引上并且该变量可以取( else)的值,则分支器B返回。使用该代码,我希望获得解决方案和(以及其他组合,例如),但是由于分支在返回时被处理,因此只分配了前两个变量。true1false statustrue2false[1, 2, 1, 2, ...][!1, !2, !1, !2, ...][!1, 2, 1, !2, ...]statusfalse

有没有一种好方法可以使分支器在status返回后不被处理false(或交替使用两种不同的分支策略),还是应该将两个分支器合并为一个?

0 投票
1 回答
214 浏览

minizinc - 显示时间与 Minizinc 模型中的实际求解时间不同

我编写了一个大型 minizinc 模型,其中包括带有 int_search 语句的 var 变量,以便正确排序。它包含输出语句,我在其中使用 fix(var variables) 语句输出变量值,它包含一些使用内置函数 sum、bool2int 等的函数。现在,当我运行模型时,它会在屏幕上显示一个非常很长时间(比如 5-6 分钟),但运行时间/求解时间(默认情况下求解器的打印信息)仅显示 20 秒。为什么会发生这种奇怪的事情?是不是因为输出语句也很耗时?但是变量在那个时候已经固定了,那为什么会这样呢?

0 投票
1 回答
96 浏览

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

有谁知道如何摆脱这些错误?提前致谢。

0 投票
1 回答
71 浏览

minizinc - Gecode 和 G12 (MIP) 是否使用无限精度算术?

我只想知道这两个 MiniZinc 求解器是否默认使用无限精度算术。

0 投票
1 回答
52 浏览

c++ - 矩阵中的 GECODE 成对不同的列

我正在研究一个 GECODE 求解器来实现一个矩阵生成问题。我已经弄清楚了我需要的所有约束,除了一个:

Given a Matrix[M, N], all column vectors must be pairwise distinct.

这是我想写的代码:

但我不知道如何用提供的原始约束来表达这一点。我知道distinct()存在,但是我不知道如何对矩阵中的列进行操作,而不是对列矩阵本身中的元素进行操作。表达这种对矩阵的约束的最佳方式是什么?

0 投票
2 回答
84 浏览

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_但我需要将我的实验定义gmin1.5例如。

我检查了文档,没有找到linear同时使用Boolean/IntegerFloat变量的定义。

有没有办法使用 float 来定义这个约束gmin

提前致谢!

0 投票
1 回答
79 浏览

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 或编译阶段识别它们呢?

问候!阿尔贝托

0 投票
2 回答
257 浏览

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)

“制作” C++ 项目时出现错误消息

我当前无法正常工作的 CmakeLists.txt

0 投票
2 回答
208 浏览

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 一起使用吗?如果可以,如何?(使用浮点数不是一种选择)理想情况下,我想举一些例子来说明如何最大化某些东西

0 投票
1 回答
189 浏览

c++ - 用于约束随机化的 Gecode 与 Z3

我正在寻找 SystemVerilog 语言的基于 C++ 的替代方案。虽然我怀疑任何东西都可以与 SystemVerilog 约束语言的简单性和灵活性相匹配,但我已经决定使用 Z3 或 Gecode 来完成我的工作,主要是因为它们都在 MIT 许可下。

我正在寻找的是:

  1. 支持可变大小的位向量和位向量算术逻辑运算。例如:

据我所知,Gecode 的问题在于它没有提供开箱即用的位向量。然而,它的编程模型似乎有点简单,它确实提供了一种方法来创建自己的变量类型。所以我也许可以围绕 C++ 位集创建某种包装器,类似于IntVar围绕 32 位整数的包装器。但是,这将缺乏执行基于乘法的约束的能力,因为 C++ 位集不支持此类操作。

Z3 确实提供了开箱即用的位向量,但我不确定它会如何处理尝试设置约束,例如 128 位向量。我也不确定如何指定我想尽可能生成满足约束的各种随机变量。使用 Gecode,鉴于其文档的详尽程度,它会更加清晰。

  1. 一个简单的约束规划模型,接近或类似于 SystemVerilog。例如,我只需要输入 (x == y + z) 而不是 EQ(x, y + z) 之类的语言。据我所知,这两个 API 都提供了如此简单的编程模型。

  2. 为了产生随机刺激而执行约束随机化的一种方法。如,我可以提供一些随机种子,根据约束条件,产生的答案可能与之前的答案不同。类似于 SystemVerilog 随机调用可能会产生新的随机结果。Gecode 似乎支持使用随机种子。Z3,不太清楚。

  3. 支持加权分布。Gecode 似乎通过加权集支持这一点。我想我可以在某些条件和布尔变量之间建立关系,然后为这些变量添加权重。Z3 似乎更灵活,因为您可以通过优化类为表达式分配权重。

目前,我还没有决定,因为 Z3 缺乏 Gecode 在开箱即用的变量类型中所缺乏的文档。我想知道是否有人有任何使用这两种工具的经验来实现 SystemVerilog 的功能。我也想听听对灵活许可下的任何其他 API 的任何建议。