Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 用于规划从依赖项创建对象的算法_Algorithm - Fatal编程技术网

Algorithm 用于规划从依赖项创建对象的算法

Algorithm 用于规划从依赖项创建对象的算法,algorithm,Algorithm,我是炼金术士。我可以根据我的食谱用其他东西做东西。例如: 2 lead + 1 bismuth -> 1 carbon 1 oxygen + 5 hydrogen + 3 nitrogen -> 2 carbon 5 carbon + 5 titanium -> 1 gold ...etc. 我的食谱书包含数千份食谱,每一份都消耗一个或多个输入的离散量,并产生一个输出的离散量。作为一个懒惰的炼金术士,我不想记住我所有的食谱。我想写一个计算机程序来解决这个问题。该程序的

我是炼金术士。我可以根据我的食谱用其他东西做东西。例如:

 2 lead + 1 bismuth -> 1 carbon
 1 oxygen + 5 hydrogen + 3 nitrogen -> 2 carbon
 5 carbon + 5 titanium -> 1 gold
 ...etc.
我的食谱书包含数千份食谱,每一份都消耗一个或多个输入的离散量,并产生一个输出的离散量。作为一个懒惰的炼金术士,我不想记住我所有的食谱。我想写一个计算机程序来解决这个问题。该程序的输入是对我想要的东西的描述,如“2金”,以及对我库存的描述,如“5钛、6铅、3铋、2碳、1金”。输出应该是“无法生成”或一系列用于创建对象的指令。对于这里给出的示例,输出可以是:

make 2 carbon out of 4 lead + 2 bismuth
make 1 gold out of 4 carbon + 4 titanium
然后,再加上我已经拥有的1枚金牌,我得到了我想要的2枚金牌

最后一点注意:配方是加权的;e、 如果可以的话,我更喜欢用铅和铋做碳

有没有一种优雅的方法来描述和解决这个问题?一个简单的递归解决方案看起来很诱人,但我可以想到一些配方集,它们会使它做指数级的工作


(作为后续行动,有一天我的研究可能会发现一套循环的配方——也许我可以用一个氦制造一个氢,用一个氢制造一个氦——我也希望能够处理这个问题。)

这个问题是NP难的

给出CNF-SAT的一个实例,准备炼金术表,其中包含用于测试的试剂

  • 每个变量
  • 每种文字
  • 各条款(未满足的版本)
  • 各条款(满意版本)
  • 输出
  • 反应是

  • 变量,以大量提供相应的正文本
  • 变量以大量提供相应的负文本
  • 条款(不满意的版本)和符合文字要求的条款(满意的版本)
  • 将所有子句(满意版本)添加到输出
  • 问题是我们是否可以让每个变量和每个子句(不满意的版本)的输出都给定一个


    该问题与向量加法系统/Petri网的可达性判定问题有关;我的约简部分基于文献中出现的约简。

    拓扑排序是答案。我对此进行了一点思考,但不知道如何处理可能有多个配方的事实。(不清楚的不是拓扑排序,而是如何使用拓扑排序的一组东西来解决问题。)我不得不在纸上把它计算出来,以说服自己你是正确的,但现在我很确定你是正确的。很好的折扣。:)我还要感谢你提到Petri网——我从未听说过它们,它们看起来正是我想要的泛化。