gpt4 book ai didi

artificial-intelligence - 如何着手创建一个 prolog 程序,该程序可以向后工作以确定达到目标所需的步骤

转载 作者:行者123 更新时间:2023-12-04 14:14:04 25 4
gpt4 key购买 nike

我不确定我到底想问什么。我希望能够编写一些代码,可以轻松地采用初始和最终状态以及一些规则,并确定到达那里的路径/选择。

所以想想,例如,在像星际争霸这样的游戏中。要建一个工厂,我需要有一个军营和一个指挥中心。所以如果我什么都没有,我想要一个工厂,我可能会说->指挥中心->兵营->工厂。每件事都需要时间和资源,应该在路径中加以注意和考虑。如果我希望我的工厂在 5 分钟内完成,那么如果我希望在 10 分钟内完成,那么选择就更少了。

此外,引擎应该能够计算可用资源并有效利用它们。这三座建筑可能总共需要 600 矿物,但引擎应该在有 200 矿物(或成本)时规划指挥中心。

这最终的要求类似于 10 名海军陆战队员 @ 5 分钟,6:30 步兵武器升级,10 分钟 30 名海军陆战队员,工厂 @ 11,等等......

那么,我该如何去做这样的事情呢?我的第一个想法是使用一些程序语言并从头开始做出所有决定。我可以模拟系统和分支并做出不同的选择。最终,一些选择很快就会使以后无法实现目标(如果我 build 20 个补给站,我可能不会按时制造那个工厂。)

那么我认为函数式语言不是为此而设计的吗?我试图写一些序言,但我一直在处理时间和距离计算等问题。而且我不确定返回“计划”的最佳方式。

我以为我可以写:

depends_on(factory, barracks)
depends_on(barracks, command_center)
builds_from(marine, barracks)
build_time(command_center, 60)
build_time(barracks, 45)
build_time(factory, 30)
minerals(command_center, 400)
...
build(X) :-
depends_on(X, Y),
build_time(X, T),
minerals(X, M),
...

这就是我感到困惑的地方。我不确定如何构造这个函数和一个查询来获得任何接近我想要的东西。我必须以某种方式解释在 build 和其他可能的路径上花费额外黄金的时间期间收集矿物的速度。如果我只想要 10 分钟内 1 名海军陆战队员,我希望引擎生成很多计划,因为有很多方法可以在 10 分钟内以 1 名海军陆战队员结束(也许在这么多之后将其切断,不知道你是如何在序言中做到这一点的) )。

我正在寻找有关如何继续沿着这条道路前进的建议或有关其他选择的建议。我找不到比汉诺塔和 AI 祖先示例更有用的东西了,所以即使是一些解释如何使用 prolog 做真实事情的好文章也会很棒。如果我能以一种有用的方式设置这些规则,除了像河内的所有塔楼一样写入标准输出之外,如何获得“计划”序言(解决查询的方法)?或者这是首选的方式?

我的另一个问题是,我的主要代码是 ruby​​(可能还有其他语言),与 prolog 通信的选项是从 ruby​​ 中调用我的 prolog 程序,从 prolog 中访问虚拟文件系统,或某种数据库结构(不太可能)。我正在使用 SWI-Prolog atm,我最好在 Ruby 中以程序方式执行此操作,还是以 prolog 或 haskall 等函数式语言构建它值得付出额外的努力来集成?

如果不清楚,我很抱歉,我感谢任何帮助的尝试,我会重新表述不清楚的事情。

最佳答案

对于第一次尝试 Prolog 的过程语言用户来说,您的问题很典型,也很常见。这很容易解决:您需要考虑世界上连续状态之间的关系。你的世界的状态包括例如耗时、可用的矿物、你已经 build 的东西等。这样的状态可以很容易地用 Prolog 术语表示,例如可以看起来像 time_minerals_buildings(10, 10000, [barracks,factory]) )。给定这样的状态,您需要描述该状态可能的后继状态是什么样的。例如:

state_successor(State0, State) :-
State0 = time_minerals_buildings(Time0, Minerals0, Buildings0),
Time is Time0 + 1,
can_build_new_building(Buildings0, Building),
building_minerals(Building, MB),
Minerals is Minerals0 - MB,
Minerals >= 0,
State = time_minerals_buildings(Time, Minerals, Building).

我使用显式命名约定( State0 -> State )来明确我们正在谈论连续状态。您当然也可以将统一拉入子句标题。示例代码纯粹是假设的,在您的最终应用程序中看起来可能大不相同。在这种情况下,我描述的是新状态的耗时是旧状态的时间 + 1,新的矿物数量减少了 build 所需的数量 Building ,而且我有一个谓词 can_build_new_building(Bs, B) , 新建筑时确实如此 B可以假设 Bs 中给出的建筑物被 build 已经建成。我假设它通常是一个非确定性谓词,并且会在回溯时产生所有可能的答案(= 可以 build 的新建筑物),我把它留作你定义这样一个谓词的练习。

给定这样的谓词 state_successor/2 ,它将世界状态与其直接可能的后继者联系起来,您可以轻松定义导致所需最终状态的状态路径。在最简单的形式中,它类似于以下描述连续状态列表的 DCG:
states(State0) -->
( { final_state(State0) } -> []
; [State0],
{ state_successor(State0, State1) },
states(State1)
).

然后,您可以使用例如迭代深化来搜索解决方案:
?- initial_state(S0), length(Path, _), phrase(states(S0), Path).

此外,您可以跟踪您已经考虑过的状态并避免重新探索它们等。

您对您发布的示例代码感到困惑的原因基本上是 build/1没有足够的论据来描述您想要什么。你至少需要两个参数:一个是世界的当前状态,另一个是这个给定状态的可能后继者。鉴于这种关系,您需要的其他一切都可以轻松描述。我希望这回答了你的问题。

关于artificial-intelligence - 如何着手创建一个 prolog 程序,该程序可以向后工作以确定达到目标所需的步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18601420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com