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 程序从列表中删除每个第 n 个元素

    您能帮我解决以下问题吗 编写三元谓词delete nth从列表中删除每个第 n 个元素 样本运行 delete nth a b c d e f 2 L L a c e false delete nth a b c d e f 1 L L f
  • Prolog 追加与剪切运算符

    当我们使用append和cut操作符时会出现什么问题 append2 L L append2 H T L H TL append2 T L TL 我尝试了几种不同的输入 但总是成功 append2 1 2 5 L L 1 2 5 appen
  • 在有向图中使用 DFS 进行循环检测是否绝对需要回溯?

    我遇到了这个SO post https stackoverflow com questions 2869647 why dfs and not bfs for finding cycle in graphs其中建议由于回溯 在有向图中使用
  • Prolog - 删除非唯一元素

    我有一个谓词来检查元素是否是列表的成员 并且看起来如下 member X X member X T member X T 当我打电话时 member 1 2 3 1 4 我明白了 是的 现在我必须使用它来编写谓词 该谓词将从列表列表中删除所
  • Prolog 中的聊天机器人

    我一直在尝试在序言中创建一个聊天机器人 作为作业 到目前为止 我已经在 pl 文件中创建了一个数据库 并且列出了很多可能的对话 我知道序言是这样工作的 例如如果我们有 Chatbot good 然后我们输入 Chatbot good 它会回
  • TSP的一种变体:限制时间,访问尽可能多的节点

    让我们再次使用推销员上下文 如果销售员不需要拜访所有客户 但有时间限制 他必须拜访尽可能多的客户 我们怎样才能找到最佳路线 一个更高级的版本是 假设每个客户都被标记为货币收益 因此我们的销售人员希望最大化他实际访问的那些客户的总货币收益 只
  • Prolog 中的迷你数独求解器中途停止

    我正在学习 七周七种语言 我只是想从书中找到一个例子 它解决迷你数独网格 4x4 作者使用的是 gprolog 但我使用的是 swi prolog 无论出于何种原因 我都无法让 gprolog 在我的虚拟机上工作 但 swi prolog
  • 如何在 Prolog 中计算数字序列的和

    任务是计算从0到M的自然数之和 我使用SWI Prolog编写了以下代码 my sum From To From gt To my sum From To S From 0 Next is 1 S is 1 my sum Next To S
  • 在列表列表中查找形状

    节目说明 该计划的目的 我的程序旨在计算 20X15 大小的平面中形状的位置 我有一个形状列表 其中包含形状类型 其 ID 半径或高度以及其在平面上的预期 X Y 位置 我有一个不同的二元运算列表 仅包含形状类型 其 id 及其与另一个形状
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • 使用回溯(而不是 DFS)背后的直觉

    我正在解决单词搜索 https leetcode com problems word search description LeetCode com 上的问题 给定一个 2D 板和一个单词 查找该单词是否存在于网格中 该单词可以由顺序相邻单
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • Prolog 罗马数字(属性语法)

    我正在做一项作业prolog questions tagged prolog扫描数字列表并应返回该列表是否是有效的罗马数字以及数字的十进制值 前任 1 roman N I N 1 true 2 当我运行我认为应该工作的程序时 十进制值总是正
  • 用 ruby​​ 解决旅行商问题(50 多个位置)

    我在一家快递公司工作 目前 我们 手动 解决了 50 多个地点的路线 我一直在考虑使用 Google Maps API 来解决这个问题 但我读到有 24 点的限制 目前我们在服务器中使用 Rails 因此我正在考虑使用 ruby 脚本来获取
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • 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
  • 在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

    在 Windows 7 上 当我在 SWI Prolog 中使用 process create 3 打开 Notepad exe 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • 查找相邻成员

    我必须找出列表中的两个成员是否相邻 限制是使用append 3谓词 到目前为止 我已经完成了下面的操作 如果它是真的 它就有效 否则我得不到答案 就像它永远运行一样 adjacent X Y L append L1 X Y T1 appen
  • 如何在 ISO Prolog 中定义(和命名)相应的安全术语比较谓词?

    标准术语顺序 ISO IEC 13211 1 7 2 术语顺序 针对所有术语 包括变量 进行定义 虽然这有很好的用途 想想实施setof 3 这使得 8 4 术语比较中内置函数的许多其他干净且合乎逻辑的使用成为声明式噩梦 到处都是 imps
  • Prolog - 如何从输入文件的给定列表中创建变量列表?

    我有一个输入谓词将文件作为列表读取 输入 文件名 列表 该列表的格式将是 9 字面意思就是下划线字符 在这里 不是一个通配符 问题是我如何编写谓词 pred List List2 然后转换所有 进入变量但保留9还在同一个位置吗 所以如果我输

随机推荐

  • 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 事实 到目前为止我所做的事情如下