首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CLP求解Euler 4

用CLP求解Euler 4
EN

Stack Overflow用户
提问于 2021-07-10 02:07:44
回答 2查看 95关注 0票数 0

我得到了Euler 4项目的一个非常慢的解决方案,

代码语言:javascript
复制
:- use_module(library(clpfd)).

euler_004(P) :-
  A in 1..9,
  B in 0..9,
  C in 0..9,
  P #= A * 100001 + B * 10010 + C * 1100,
  D in 100..999,
  E in 100..999,
  E #>= D,
  P #= D * E,
  labeling([max(P)], [P]).

有办法加快速度吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-10 05:18:01

您的原始型号使用SWI在我的机器上使用32.8s。该版本使用ff,bisect作为搜索策略,采用3.1:

代码语言:javascript
复制
euler4c(P) :-
  A in 1..9,
  B in 0..9,
  C in 0..9,
  D in 100..999,
  E in 100..999,
  E #>= D,
  P #= D * E,
  P #= A * 100001 + B * 10010 + C * 1100,  
  labeling([max(P),ff,bisect], [P]). % 3.1s

此外,SWI Prolog的CLP解决程序通常不是最快的CLP解决程序,因此其他Prolog的解决程序可能更快。

另外,请参阅我的非CLP方法来解决这个问题:http://hakank.org/swi_prolog/euler4.pl (在0.2s内解决这个问题)。

票数 2
EN

Stack Overflow用户

发布于 2021-07-16 17:46:23

这里有一种替代搜索策略,可以极大地缩短搜索时间。

代码语言:javascript
复制
...
labeling([max(P),down], [A,B,C]).

理由是:

10^3.

  • In、BC上搜索
  1. ,而不是P,可能会将搜索空间的大小从10^6顺序减少到仅用P顺序来最大化P,使用搜索选项down.

来尝试更大的A值( BC (特别是A) )是很有趣的。

在SWISH中,这将时间从~63秒缩短到大约0.2秒。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68324157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档