Prolog 中的简化旅行推销员

2023-12-25

我浏览过类似的问题,但找不到与我的问题相关的任何内容。我正在努力寻找一种算法或一组“循环”来找到一条路径CityA to CityB,使用数据库

distance(City1,City2,Distance)

事实。到目前为止我所做的事情如下,但它总是回溯到write(X),然后完成最终迭代,这就是我想要它做的事情,但仅限于一定程度。

例如,我不希望它打印出任何死胡同的城市名称,或使用最终迭代。我希望它基本上能够从CityA to CityB,写下它所经过的城市的名称。

我希望有人能帮助我!

all_possible_paths(CityA, CityB) :-
    write(CityA),
    nl,
    loop_process(CityA, CityB).

loop_process(CityA, CityB) :- 
    CityA == CityB.
loop_process(CityA, CityB) :-
    CityA \== CityB,
    distance(CityA, X, _),
    write(X),
    nl,
    loop_process(X, CityB).

我试图向您展示如何实现您正在做的事情,以便您可以更好地理解它是如何工作的。所以既然你的OP不是很完整,我就采取了一些自由行动!以下是我正在研究的事实:

road(birmingham,bristol, 9).
road(london,birmingham, 3).
road(london,bristol, 6).
road(london,plymouth, 5).
road(plymouth,london, 5).
road(portsmouth,london, 4).
road(portsmouth,plymouth, 8).

这是我们将调用来查找路径的谓词,获取道路/4。它基本上称为工作谓词,它有两个累加器(一个用于已访问的点,一个用于我们经过的距离)。

get_road(Start, End, Visited, Result) :-
    get_road(Start, End, [Start], 0, Visited, Result).

这是工作谓词,
获取道路/6: get_road(+Start, +End, +Waypoints, +DistanceAcc, -Visited, -TotalDistance) :
第一个子句告诉我们,如果我们的第一个点和最后一个点之间有一条路,我们就可以在这里结束。

get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :-
    road(Start, End, Distance),
    reverse([End|Waypoints], Visited),
    TotalDistance is DistanceAcc + Distance.

第二个子句告诉我们,如果我们的第一个点和中间点之间有一条路,我们可以采用它,然后求解 get_road(intermediate, end)。

get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :-
    road(Start, Waypoint, Distance),
    \+ member(Waypoint, Waypoints),
    NewDistanceAcc is DistanceAcc + Distance,
    get_road(Waypoint, End, [Waypoint|Waypoints], NewDistanceAcc, Visited, TotalDistance).

用法如下:

?- get_road(portsmouth, plymouth, Visited, Distance).

并产生:

Visited = [portsmouth, plymouth],
Distance = 8 ;
Visited = [portsmouth, london, plymouth],
Distance = 9 ;
Visited = [portsmouth, plymouth, london, plymouth],
Distance = 18 ;
false.

希望对您有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prolog 中的简化旅行推销员 的相关文章

  • Prolog 中的匹配元组

    为什么Prolog匹配 X Xs 包含更多元素的元组 一个例子 test2 X Xs write X nl test2 Xs test2 X write X nl test
  • 在 prolog 中读取用户输入的字符串

    我是 Prolog 初学者 我正在使用 swi prolog 刚刚开始使用它 我需要将用户输入字符串拆分到列表中 我尝试了以下代码 但出现错误 指出 在子句正文中完全停止 无法重新定义 2 write Enter the String nl
  • 导入 csv 文件数据以填充 Prolog 知识库

    我有一个 csv 文件example csv其中包含两列 标题为 var1 和 var2 我想填充一个最初为空的 Prolog 知识库文件import pl具有重复的事实 而每一行example csv处理方式相同 fact A1 A2 f
  • Prolog 过滤自定义目标失败的所有元素的列表

    我正在尝试写一个谓词filter List PredName Result 过滤一个List目标的所有要素PredName失败并随后返回Result列表 谓词PredName 1应该在调用过程时定义filter 3例如可以是 test N
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • 斜线(/)在序言中做什么?

    我有这个代码 set value X Value X T X Value T set value X Value Y V T Y V NewT X Y set value X Value T NewT set value X Value X
  • Prolog 展平列表

    flatten A B R islist A gt flatten A R1 R R1 write A append A R1 R flatten B R1 flatten X X islist 这是我写的代码 但我有奇怪的问题 I get
  • 谓词对于列表中的所有元素都必须为 true

    我有一组事实 likes john mary likes mary robert likes robert kate likes alan george likes alan mary likes george mary likes har
  • Prolog家谱

    我做到了 但没有显示答案 当我询问兄弟姐妹 叔叔 阿姨时 这是我写的 有什么问题吗 uncle X Y male X sibling X Z parent Z Y uncle X Y male X spouse X W sibling W
  • 查找相邻成员

    我必须找出列表中的两个成员是否相邻 限制是使用append 3谓词 到目前为止 我已经完成了下面的操作 如果它是真的 它就有效 否则我得不到答案 就像它永远运行一样 adjacent X Y L append L1 X Y T1 appen
  • Prolog 中的隔离列表

    我很难理解如何让我的代码显示由偶数和奇数组成的隔离列表 我什至不确定我的理解缺乏什么 显然我对这门语言很陌生 必须在学校使用它 我的命令式和功能性思维不会让我知道这到底是怎么回事 哈哈 现在 不 我不是要求你做我的作业 我只是请你帮我看看我
  • 使用 Google 地图实现最佳地图路线

    有没有办法使用 Google Maps API 来获取给定一组航路点的 优化 路线 换句话说 旅行推销员问题的 足够好 解决方案 或者它是否总是返回带有按指定顺序点 Google Maps API DirectionsRequest 中有一
  • 高阶“解决方案”谓词

    我正在使用一个更高阶的 Prolog 变体 它缺少findall 还有一个关于实现我们自己的问题findall here 获取 Prolog 中的解决方案列表 https stackoverflow com questions 419103
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • 如何编写高效的配对算法?

    我需要一种算法的帮助 该算法可以有效地将人们分组 并确保以前的配对不会重复 例如 假设我们有 10 位候选人 candidates 0 1 2 3 4 5 6 7 8 9 并假设我们有一个先前匹配的字典 这样每个键值对即candidate
  • 序言中的“如果”?

    有没有办法在序言中执行 if 操作 例如如果变量为 0 则执行一些操作 将文本写入终端 甚至不需要 else 但我找不到 if 的任何文档 是的 ISO Prolog 中有这样一个控制结构 称为 gt 你像这样使用它 condition g
  • 将“mod”运算符与“or”一起使用时是否强制具体化?

    我使用 CLP FD 和 SWI Prolog 编写了一个 CSP 程序 我认为当我使用时我需要改进我的约束写作mod操作员 和 一起 在我的谓词中 一个简短的例子 use module library clpfd constr X Y Z
  • WAM 中的扁平化形式

    WAM 教程重构指出查询 p Z h Z W f W 需要使用以下原则进行扁平化 话虽这么说 查询扁平化形式是 X3 h X2 X5 X4 f X5 X1 p X2 X3 X4 我对外部变量的定义感到困惑 请考虑以下内容 p Z h Y a
  • 简单的布尔表达式测试

    user compiling user for byte code formula 0 P Q P Q P user compiled 2 lines read 768 bytes written 37208 ms yes formula
  • prolog跟踪如何使用

    跟踪prolog程序时如何进行第二步 例如 我想跟踪以下简单程序 length1 0 length1 X Xs N length1 Xs N1 N is N1 1 我跟踪程序 trace length 1 2 3 N Call 7 leng

随机推荐

  • Laravel + Inertia SSR 如何更改默认端口?错误:监听 EADDRINUSE:地址已在使用中 :::13714

    所以我有一个生产站点和一个暂存站点 两者都在 Laravel 上 并使用服务器端渲染 SSR Node js 服务器是 Ubuntu 22 04 1 LTS 我使用 PM2 作为 Node js 的生产流程管理器 当我跑步时pm2 star
  • 手动触发 jQuery 自动完成

    我将 jQuery UI 自动完成与一些 AJAX 结合使用 直到停止输入后才会提取数据 我想做到这样 一旦找到数据 自动完成就会作为搜索结果弹出 但是 只有当我再次开始输入时 这才有效 下拉列表在我输入之前不会触发 因为直到我停止输入后它
  • 除了在Java中获取屏幕尺寸之外,还可以使用其他方式设置全屏

    我想知道是否有一种方法比使用更好Toolkit getDefaultToolkit getScreenSize getHeight getWidth 然后使用它作为 JFrame 的尺寸 然后将 JFrame 设置为undecorated
  • 使用 PHP 脚本转发电子邮件

    我们有一个 cron 的 PHP 脚本 每十分钟检查一次收件箱 该脚本的目的是处理我们提供的短信通知服务的 停止退出 功能 如果脚本发现任何电子邮件开头带有 STOP 一词的电子邮件 我们会从通知数据库中删除该用户 为了覆盖我们的基地 我们
  • 将字符串列表转换为由分隔符分隔的字符串

    将字符串列表转换为字符串的最佳方法是什么 其中值以逗号分隔 String Join myListOfStrings ToArray
  • Java中判断一个字符串是否为整数[重复]

    这个问题在这里已经有答案了 我试图确定字符串数组中的特定项目是否是整数 I am split 中的中缀表达式String形式 然后尝试将结果数组拆分为两个数组 一种用于整数 一种用于运算符 同时丢弃括号和其他杂项 实现这一目标的最佳方法是什
  • WPF ListView 的资源管理器主题?

    如何在 WPF ListView 中获取资源管理器主题 我知道一个答案是 GridView 但这就像Details在 Windows 资源管理器中查看 我需要列表 图块和图标查看主题如资源管理器 我怎样才能得到它 The Windows A
  • 跟踪 Rails 中 ActiveRecord 对象中非持久属性的脏信息

    我有一个继承自 ActiveRecord 的对象 但它有一个未保留在数据库中的属性 例如 class Foo lt ActiveRecord Base attr accessor bar end 我希望能够使用 ActiveModel Di
  • GAC 正在进行编辑流程吗?

    每次我对库类进行编辑时 我都会对其进行编译以获得更新的 DLL 但是为了对使用该库的项目进行有效编辑 我必须执行以下命令 gacutil I
  • 如何使用 Python 通过 XMPP 传输文件?

    我在用着xmpppy http xmpppy sourceforge net 我的 jabber 远程管理机器人的库 但我找不到如何发送 接收文件并将其保存在指定的目录中 文档很差 也没有任何示例 但我真的很想制作它 任何人都可以展示一些示
  • 将自定义表单元素添加到 Adminhtml 表单

    有没有办法将自定义表单元素添加到 Magento Adminhtml 表单中 而不将自定义元素放置在lib Varian folder 我已经找到了本质上是一个的代码Varian Data Form Element factory publ
  • 如何等待Spark服务停止?

    对于我的 Spark API 我正在构建集成测试 有时我想停止并启动 Spark 实例 当我这样做时 有时会遇到这样的问题 我正在创建一个新的 Spark 实例 而旧的实例仍在单独的线程上关闭 了解 Spark 实例何时实际关闭会很有帮助
  • QTcpSocket / QTcpServer 内存管理 / 服务器崩溃

    我正在设计和制作一个服务器 它应该能够每秒处理大约 100 次以上的点击 我从服务器获取的信息只是 HTTP 标头 根据标头中的信息 它将查询数据库 不同线程 中的某些信息 并将最终信息发送回 QTcpServer QTcpServer 创
  • FBSQLException 键大小超出实现

    create table RHP EmployeElement amount double precision not null comment varchar 255 loan blob element codeId varchar 30
  • 同源图像 texImage2D 的安全错误

    我目前正在学习WebGL 在对 texImage2D 的调用 纹理加载完成时调用 中 我得到以下信息SecurityError Uncaught SecurityError Failed to execute texImage2D on W
  • Windows 中是否有代表“C:\Documents and Settings”文件夹或 C:\Users 文件夹的环境变量?

    Windows 中是否有表示配置文件路径的任何环境变量或其他格式 我想以这样的方式查询 我应该获取值 C Documents and Settings 如果是 windows XP 或 2k3 或 C users 如果是 vista 或 w
  • jQuery 对向后兼容性的支持程度如何?

    我们遇到了 Mootools 不太向后兼容的问题 特别是在拖放功能方面 我想知道是否有人遇到过 jQuery 不向后兼容的类似问题 我们开始大量使用它 并考虑升级到新版本以开始使用多个需要它的插件 如果我们摆脱旧版本会遇到任何问题吗 jQu
  • 如何从 Scala 执行 shell 内置命令

    我需要检查一些系统设置 例如ulimit n来自 Linux 中的 Scala 脚本 如果我处理普通命令 我会使用scala sys process封装如 import scala sys process println ls lha 不幸
  • 扩展隐藏了我想要访问的属性。解决方法?

    我正在使用两个 Pod DropDown https github com AssistoLab DropDown and SwiftyUtils https github com tbaranes SwiftyUtils DropDown
  • Prolog 中的简化旅行推销员

    我浏览过类似的问题 但找不到与我的问题相关的任何内容 我正在努力寻找一种算法或一组 循环 来找到一条路径CityA to CityB 使用数据库 distance City1 City2 Distance 事实 到目前为止我所做的事情如下