微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

clingo 中的谜语

如何解决clingo 中的谜语

因此,在标签序言中,someone 想要解决 Dan finkel 的 "the giant cat army riddle"(请参阅视频/链接了解谜题的说明)。

因为我想改进答案集编程,所以我在此挑战您比我更有效地解决难题。你会找到我的解决方案作为答案。我会接受最快的答案(除非它使用了肮脏的黑客)。

规则:

  • 对列表的长度(或类似的东西)进行硬编码算作脏黑客。
  • 输出必须在谓词 r/2 中,它的第一个参数是列表的索引,第二个参数是它的条目。
  • 测量的时间是第一个有效答案的时间。

解决方法

我的第一次尝试是生成数字排列并强制后继元素通过 3 个操作(+5+7sqrt)之一连接。我预先定义了操作以避免选择/计数问题。无需测试 <60,因为操作的输出必须是 059 之间的数字。生成的列表 l/2 被转发到输出 r/2,直到出现数字 14。我想有足够的空间来超越我的解决方案。

num(0..59).

%valid operation pairs
op(N*N,N):- N=2..7.  
op(Ori,New):- num(Ori),New = Ori+7,num(New).
op(Ori,New = Ori+5,num(New).

%for each position one number
l(0,0).
{l(T,N):num(N)}==1:-num(T).  
{l(T,N):num(T)}==1:-num(N).

% following numbers are connected with an operation until 14
:- l(T,Ori),not op(Ori,New),l(T+1,l(End,14),T+1<=End.

% 2 before 10 before 14
:- l(T2,2),l(T10,10),T10<T2.
:- l(T14,T14<T10.

% output
r(T,E):- l(T,E),T<=End.
#show r/2.

第一个答案:

r(0,0) r(1,5) r(2,12) r(3,19) r(4,26) r(5,31) r(6,36) r(7,6) 
r(8,11) r(9,16) r(10,4) r(11,2) r(12,9) r(13,3) r(14,10) r(15,15) 
r(16,20) r(17,25) r(18,30) r(19,37) r(20,42) r(21,49) r(22,7) r(23,14)

有多个不同长度的可能列表。

,
num(0..59).

%valid operation pairs
op(N*N,N):- N=2..7.  
% no need to add operations that start with 14
op(Ori,num(New),Ori!=14.
op(Ori,Ori!=14.

%iteratively create new numbers from old numbers
l(0,0).
{l(T+1,New) : op(Old,New)} = 1 :- l(T,Old),num(T+1),op(Old,_).

%no number twice
:- 2 #sum {1,T : l(T,Value)},num(Value).

%2 before 10 before 14
%linear encoding
reached(T,10) :- l(T,10).
reached(T+1,10) :- reached(T,num(T+1).
:- reached(T,l(T,2).

:- l(T,_).

%looks nicer,but quadratic
%:- l(T2,T10<T2.
%:- l(T14,T14<T10.

%we must have these three numbers in the list somewhere
:- not l(_,2).
:- not l(_,10).
:- not l(_,14).

#show r(T,V) : l(T,V).
#show.

使用稍微丑一点的编码可以大大改善基础(这是您的主要问题)。

  1. 我限制 op/2 不以 14 开头,因为这应该是列表中的最后一个元素
  2. 我确实以迭代方式创建列表,这可能不是很好,但至少在列表的开头,它已经删除了无法通过接地达到的值。所以你永远不会有 l(1,33)l(2,45) 等...... 当达到值 14 时,列表生成也会停止,因为不可能/不需要更多操作。
  3. 我还添加了“before”部分的线性缩放版本,尽管对于这个短列表并不是真正必要的(但是如果你有很长的列表,这通常是一个很酷的技巧!)这被称为“链接”。立>
  4. 另请注意,您的 show 语句非常重要,并且确实会创建一些约束/变量。

我希望这会有所帮助,否则也可以在我们的 potassco 邮件列表中提出此类问题;)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?