问题标签 [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.
prolog - 在编写纯粹的关系序言程序时,可以使用精心放置的剪辑吗?
我正在尝试编写一个管理键值存储的关系序言程序。初始代码取自我在互联网上找到的一些讲座幻灯片(http://people.eng.unimelb.edu.au/pstukey/book/course.html - 请参阅:使用数据结构幻灯片)。
这段代码允许用同一个键添加多个值——这对我来说很好。但是,它也会两次添加相同的键、值对,例如
D3 包含两次 p(a,1)。
为确保不会发生这种情况,我添加了以下代码;并且为了确保回溯找不到替代的 addkey 子句,我在第一个子句的末尾添加了一个剪切。
对于纯粹的关系程序来说,这是公平的游戏吗?或者是确保不添加重复键、值对的更好方法——而不使用切割。
这导致以下结果:
不,有更多解决方案可用——程序立即返回。
任何建议都非常感谢,
丹尼尔
注意:顺便说一句:如果我为相同的键添加不同的值,则剪切确实允许回溯以识别相同键的第二个值:
prolog - 如何关联和有效地处理每个键具有多个值的键、值字典
我现在正在尝试使用 sw-prolog 中的 assoc 库来创建一个关系 prolog 程序。我需要一个可以存储多个值的字典。这可以使用列表作为值轻松完成。
但是,我经常需要查找所有键、单个值——即识别包含一个特定值项的所有键。(但是,value 的数量通常限制为最多几十个项目)。
如果我只使用从键映射到多个值的关联存储,那么我需要遍历所有键,获取值,然后检查一个值是否是它的成员。
这效率不高,而且似乎也无法使用大量键进行扩展。
有没有更有效的方法来做到这一点?
我可以为每个值项管理其自己的“反向”键值存储,但这似乎效率很低。此外,如果我要使用 prolog 事实存储(带有 assert/ 和撤回),将每个键值对存储为一个单独的事实,我可能会免费获得这些查找“索引”。
这里关系方法的正确设计选择是什么?
[edit-1]:顺便说一句,一个“解决方案”可能是允许在 assoc 库中有多个键,以防值在内部被“索引” - 但是, assoc 库不支持这个(就我知道)。
[edit-2]:查看 swi-prolog 中的其他库,我注意到未加权的图表。也许使用图结构来处理键和值之间的这种多对多关系会更有效。并且,与关系方法保持一致。
[edit-3): 或者,ugraph 可能不是一个好主意,因为没有输入节点(和链接)。我需要在结构上指出哪个节点是键,哪些是值。
谢谢你,
丹尼尔
prolog - SWI Prolog 与 GNU Prolog - SWI 下的 CLP(FD) 问题
我在 Prolog 中写了一个快速谓词来尝试 CLP(FD) 及其求解方程组的能力。
当我在 SWI 中调用它时,我得到:
而在 GNU 中,我得到的正确答案是:
这里发生了什么?理想情况下,我希望在 SWI 中获得正确的结果,因为它是一个更强大的环境。
list - SWI:约束:域D中最多N个元素的列表?
我可以将可能值的域分配给变量,即:
有没有办法添加约束,以便变量可以接受指定域中的值列表?对最大 3 个元素列表的约束,其值在 1..5 范围内呢?
最后一个问题:一个变量 Y 可以接受最多 3 个元素的列表,这些元素在变量 X 接受的值域中(为了它恰好是 1..5)?
任何示例或提示如何开始建立这样的约束?
根据潜伏者:
只有最后一个是关闭的,应该是真的..让我改进一个约束:)
列出 1 到 3 个元素,而不是只有 3 个元素。
哈,这有效:
CLP 有多酷 :)
现在再细化。如何使列表的元素不重复?
prolog - CLP:对结构化变量的限制?
让我们有以下假设场景……一个 5x5 的网格,让我们说 3 个数字。我们要定义对位置的约束。在 CLP 中,我们通常用整数定义约束,所以这是一种方法:
即我们对每个 X 和 Y 位置都有单独的变量。有没有办法定义基于整数的结构化变量的约束。例如:
该场景仅用于说明。
我主要对您如何处理结构化变量感兴趣,是否有标准做法。
pyomo - Pyomo 5.1.1 求解器
任何人都知道我是否可以在 PyOMO 建模的问题中使用求解器 CLP?我只找到了有关旧版本 pyomo 的信息,这是不可能的。我想知道是否仍然无法将它们一起使用。提前致谢。
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.
python - 在 Pyomo 中获取决策变量以正确优化的问题
我正在使用 pyomo 解决一个简单的多周期优化问题。该模型的目标是根据该小时的火花价差(电价 - 燃气价格 * 热费 + 可变成本)确定发电厂应该在哪些时间开启或关闭。火花传播可以是负数,表示工厂应该关闭,也可以是正数,表示工厂应该运行。
目前的结果表明,尽管火花传播为负,但工厂刚刚启动并运行。
考虑到那个小时的火花传播,我怎样才能让植物在每个时间步长打开和关闭?
我确信这是一个相当简单的解决方案,但我对 pyomo 和优化问题非常陌生,因此非常感谢任何指导和帮助。
目前模型的输出为:
java - BridJ:加载 Clp.dll 时发生 LoadLibrary 错误:动态链接库 (DLL) 初始化例程失败
我正在使用 `clp-java 进行线性优化,但是当我尝试运行代码时,出现以下错误:进程一直在运行,并且以下内容不断重复打印。
BridJ:加载 C:\Users\Abhijay\AppData\Local\Temp\CLPExtractedLib1623275631902676\Clp.dll 时发生 LoadLibrary 错误:动态链接库 (DLL) 初始化例程失败。
我在 pom.xml 中添加了以下依赖项。
这是我的代码:
prolog - SWI Prolog CLP(FD) 调度
我正在使用 CLPFD 库在 SWI Prolog 中解决调度任务。由于这是我第一次解决比 sendmory 更严重的问题,我可能需要更有经验的用户提供一些好的建议。让我简要描述一下领域/任务。
领域
我有一个月的“日历”。每天全天 2 个,整晚 2 个(长 12 小时服务)。还有,只有周一至周五 10 名以上的工人工作 8 小时(短期服务)。
显然,域约束是:
- 没有连续的服务(没有日后夜,反之亦然,没有短日夜后的服务)
- On worker 最多可以连续提供 2 次夜间服务
- 每个工人一个月的工作时间有限
- 有 19 名工人可用
我的方法如下:
变量
对于日历中的每个字段,我都定义了一个变量:
DxD_y
其中x
是当天的数字,y
对于长日服务是 1 或 2DxN_y
其中x
是一天的数字,y
对于长夜服务是 1 或 2DxA_y
其中x
是当天的数字,y
短日服务为 0 .. 9SUM_x
其中x
是工人编号 (1..19),表示工人的小时数
每个D
变量都有一个域1..19
。现在为了简化它,SUM_X #=< 200
对于每个X
.
约束
all_distinct()
对于同一天的每个变量 - 每个工人每天只能提供一项服务global_cardinality()
计算每个数字 1..19 的出现次数,用于短期服务和长期服务的列表 - 这定义了变量LSUM_X
和- ong 或hort 服务SSUM_X
中工人的出现X
次数L
S
SUM_X #= 12*LSUM_X + 8*SSUM_X
对于每个工人DxN_y #\= Dx+1D_z
- 避免一晚后的长时间服务- 一堆类似的约束,如上面的约束,涵盖所有域约束
DxNy #= Dx+1Ny #==> DxNy #\= Dx+2Ny
- 为避免连续三晚服务,每个组合都有约束x
和y
笔记
所有变量和约束都直接在 pl 脚本中说明。我不使用 prolog 谓词来生成约束 - 因为我在 .NET 应用程序(前端)中有一个模型,我可以轻松地将所有东西从 .NET 代码生成到 prolog 代码中。
我认为我的方法总体上是好的。在一些较小的示例上运行调度程序效果很好(7 天,4 个长期服务,1 个短期服务,8 个工作人员)。此外,我还能够在完整的案例中获得一些有效的结果——30 天,19 名工人,每天 4 次长服务和 10 次短服务。
但是,我对目前的状态并不完全满意。让我解释一下为什么。
问题
- 我阅读了一些关于建模调度问题的文章,其中一些使用了一些不同的方法——只为我的变量(日历字段)和 worker 的每个组合引入布尔变量,以标记是否将 worker 分配给特定的日历字段。这是更好的方法吗?
- 如果您计算日历中的总工作量限制和总小时数,您会发现工人的利用率不是 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
过程以其他顺序而不是up
或down
(以某种伪随机方式)获取值。 - 我应该如何订购约束?我认为约束的顺序对标签的效率很重要。
- 如何调试/优化标签的性能?我希望解决这类任务需要几秒钟或最多几分钟,以防求和的条件非常紧张。例如,使用该
bisect
选项标记需要很长时间。
如果需要,我可以提供更多代码示例。