问题标签 [clp]

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 投票
2 回答
108 浏览

prolog - 在编写纯粹的关系序言程序时,可以使用精心放置的剪辑吗?

我正在尝试编写一个管理键值存储的关系序言程序。初始代码取自我在互联网上找到的一些讲座幻灯片(http://people.eng.unimelb.edu.au/pstukey/book/course.html - 请参阅:使用数据结构幻灯片)。

这段代码允许用同一个键添加多个值——这对我来说很好。但是,它也会两次添加相同的键、值对,例如

D3 包含两次 p(a,1)。

为确保不会发生这种情况,我添加了以下代码;并且为了确保回溯找不到替代的 addkey 子句,我在第一个子句的末尾添加了一个剪切。

对于纯粹的关系程序来说,这是公平的游戏吗?或者是确保不添加重复键、值对的更好方法——而不使用切割。

这导致以下结果:

不,有更多解决方案可用——程序立即返回。

任何建议都非常感谢,

丹尼尔

注意:顺便说一句:如果我为相同的键添加不同的值,则剪切确实允许回溯以识别相同键的第二个值:

0 投票
0 回答
259 浏览

prolog - 如何关联和有效地处理每个键具有多个值的键、值字典

我现在正在尝试使用 sw-prolog 中的 assoc 库来创建一个关系 prolog 程序。我需要一个可以存储多个值的字典。这可以使用列表作为值轻松完成。

但是,我经常需要查找所有键、单个值——即识别包含一个特定值项的所有键。(但是,value 的数量通常限制为最多几十个项目)。

如果我只使用从键映射到多个值的关联存储,那么我需要遍历所有键,获取值,然后检查一个值是否是它的成员。

这效率不高,而且似乎也无法使用大量键进行扩展。

有没有更有效的方法来做到这一点?

我可以为每个值项管理其自己的“反向”键值存储,但这似乎效率很低。此外,如果我要使用 prolog 事实存储(带有 assert/ 和撤回),将每个键值对存储为一个单独的事实,我可能会免费获得这些查找“索引”。

这里关系方法的正确设计选择是什么?

[edit-1]:顺便说一句,一个“解决方案”可能是允许在 assoc 库中有多个键,以防值在内部被“索引” - 但是, assoc 库不支持这个(就我知道)。

[edit-2]:查看 swi-prolog 中的其他库,我注意到未加权的图表。也许使用图结构来处理键和值之间的这种多对多关系会更有效。并且,与关系方法保持一致。

[edit-3): 或者,ugraph 可能不是一个好主意,因为没有输入节点(和链接)。我需要在结构上指出哪个节点是键,哪些是值。

谢谢你,

丹尼尔

0 投票
1 回答
3969 浏览

prolog - SWI Prolog 与 GNU Prolog - SWI 下的 CLP(FD) 问题

我在 Prolog 中写了一个快速谓词来尝试 CLP(FD) 及其求解方程组的能力。

当我在 SWI 中调用它时,我得到:

而在 GNU 中,我得到的正确答案是:

这里发生了什么?理想情况下,我希望在 SWI 中获得正确的结果,因为它是一个更强大的环境。

0 投票
3 回答
169 浏览

list - SWI:约束:域D中最多N个元素的列表?

我可以将可能值的域分配给变量,即:

有没有办法添加约束,以便变量可以接受指定域中的值列表?对最大 3 个元素列表的约束,其值在 1..5 范围内呢?

最后一个问题:一个变量 Y 可以接受最多 3 个元素的列表,这些元素在变量 X 接受的值域中(为了它恰好是 1..5)?

任何示例或提示如何开始建立这样的约束?


根据潜伏者:

只有最后一个是关闭的,应该是真的..让我改进一个约束:)

列出 1 到 3 个元素,而不是只有 3 个元素。


哈,这有效:

CLP 有多酷 :)


现在再细化。如何使列表的元素不重复?

0 投票
2 回答
167 浏览

prolog - CLP:对结构化变量的限制?

让我们有以下假设场景……一个 5x5 的网格,让我们说 3 个数字。我们要定义对位置的约束。在 CLP 中,我们通常用整数定义约束,所以这是一种方法:

即我们对每个 X 和 Y 位置都有单独的变量。有没有办法定义基于整数的结构化变量的约束。例如:

该场景仅用于说明。

我主要对您如何处理结构化变量感兴趣,是否有标准做法。

0 投票
1 回答
501 浏览

pyomo - Pyomo 5.1.1 求解器

任何人都知道我是否可以在 PyOMO 建模的问题中使用求解器 CLP?我只找到了有关旧版本 pyomo 的信息,这是不可能的。我想知道是否仍然无法将它们一起使用。提前致谢。

0 投票
1 回答
99 浏览

vector - How to interface Prolog CLP(R) with real vectors?

I'm using Prolog to solve simple geometrical equations. For example, I can define all points p3 on a line passing trough two points p1 and p2 as:

And then a predicate like line((0, 0, 0), (1, 1, 1), _, (2, 2, 2)) is true.

But what I'd really want is to write down something like this:

Where P1, P2, and P3 are real vectors.

What's the best way of arriving at something similar? The best I found so far is to rewrite my own add, subtract and multiply predicates, but that's not as conveniant.

0 投票
1 回答
325 浏览

python - 在 Pyomo 中获取决策变量以正确优化的问题

我正在使用 pyomo 解决一个简单的多周期优化问题。该模型的目标是根据该小时的火花价差(电价 - 燃气价格 * 热费 + 可变成本)确定发电厂应该在哪些时间开启或关闭。火花传播可以是负数,表示工厂应该关闭,也可以是正数,表示工厂应该运行。

目前的结果表明,尽管火花传播为负,但工厂刚刚启动并运行。

考虑到那个小时的火花传播,我怎样才能让植物在每个时间步长打开和关闭?

我确信这是一个相当简单的解决方案,但我对 pyomo 和优化问题非常陌生,因此非常感谢任何指导和帮助。

目前模型的输出为:

0 投票
2 回答
902 浏览

java - BridJ:加载 Clp.dll 时发生 LoadLibrary 错误:动态链接库 (DLL) 初始化例程失败

我正在使用 `clp-java 进行线性优化,但是当我尝试运行代码时,出现以下错误:进程一直在运行,并且以下内容不断重复打印。

BridJ:加载 C:\Users\Abhijay\AppData\Local\Temp\CLPExtractedLib1623275631902676\Clp.dll 时发生 LoadLibrary 错误:动态链接库 (DLL) 初始化例程失败。

我在 pom.xml 中添加了以下依赖项。

这是我的代码:

0 投票
1 回答
459 浏览

prolog - SWI Prolog CLP(FD) 调度

我正在使用 CLPFD 库在 SWI Prolog 中解决调度任务。由于这是我第一次解决比 sendmory 更严重的问题,我可能需要更有经验的用户提供一些好的建议。让我简要描述一下领域/任务。

领域

我有一个月的“日历”。每天全天 2 个,整晚 2 个(长 12 小时服务)。还有,只有周一至周五 10 名以上的工人工作 8 小时(短期服务)。

显然,域约束是:

  1. 没有连续的服务(没有日后夜,反之亦然,没有短日夜后的服务)
  2. On worker 最多可以连续提供 2 次夜间服务
  3. 每个工人一个月的工作时间有限
  4. 有 19 名工人可用

我的方法如下:

变量

对于日历中的每个字段,我都定义了一个变量:

  • DxD_y其中x是当天的数字,y对于长日服务是 1 或 2
  • DxN_y其中x是一天的数字,y对于长夜服务是 1 或 2
  • DxA_y其中x是当天的数字,y短日服务为 0 .. 9
  • SUM_x其中x是工人编号 (1..19),表示工人的小时数

每个D变量都有一个域1..19。现在为了简化它,SUM_X #=< 200对于每个X.

约束

  • all_distinct()对于同一天的每个变量 - 每个工人每天只能提供一项服务
  • global_cardinality()计算每个数字 1..19 的出现次数,用于短期服务和长期服务的列表 - 这定义了变量LSUM_X和- ong 或hort 服务SSUM_X中工人的出现X次数LS
  • SUM_X #= 12*LSUM_X + 8*SSUM_X对于每个工人
  • DxN_y #\= Dx+1D_z- 避免一晚后的长时间服务
    • 一堆类似的约束,如上面的约束,涵盖所有域约束
  • DxNy #= Dx+1Ny #==> DxNy #\= Dx+2Ny- 为避免连续三晚服务,每个组合都有约束xy

笔记

所有变量和约束都直接在 pl 脚本中说明。我不使用 prolog 谓词来生成约束 - 因为我在 .NET 应用程序(前端)中有一个模型,我可以轻松地将所有东西从 .NET 代码生成到 prolog 代码中。

我认为我的方法总体上是好的。在一些较小的示例上运行调度程序效果很好(7 天,4 个长期服务,1 个短期服务,8 个工作人员)。此外,我还能够在完整的案例中获得一些有效的结果——30 天,19 名工人,每天 4 次长服务和 10 次短服务。

但是,我对目前的状态并不完全满意。让我解释一下为什么。

问题

  1. 我阅读了一些关于建模调度问题的文章,其中一些使用了一些不同的方法——只为我的变量(日历字段)和 worker 的每个组合引入布尔变量,以标记是否将 worker 分配给特定的日历字段。这是更好的方法吗?
  2. 如果您计算日历中的总工作量限制和总小时数,您会发现工人的利用率不是 100%。但是求解器最有可能以这种方式创建解决方案:utilize the first worker for 100% and then grab the next one. 所以解决方案中的 SUM 看起来像[200,200,200...200,160,140,80,50,0,]. 如果工人或多或少得到平等利用,我会很高兴。有没有一些简单/有效的方法来实现这一目标?我考虑定义有点像定义工人之间的差异并将其最小化,但这对我来说听起来非常复杂,我担心我需要很长时间才能计算出来。我使用labeling([random_variable(29)], Vars),但它只对变量重新排序,所以仍然存在这些差距,只是顺序不同。可能我希望该labeling过程以其他顺序而不是updown(以某种伪随机方式)获取值。
  3. 我应该如何订购约束?我认为约束的顺序对标签的效率很重要。
  4. 如何调试/优化标签的性能?我希望解决这类任务需要几秒钟或最多几分钟,以防求和的条件非常紧张。例如,使用该bisect选项标记需要很长时间。

如果需要,我可以提供更多代码示例。