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

时间:2013-05-30 23:55:08

标签: algorithm

我是炼金术士。根据我的食谱书,我可以用其他东西来制作东西。例如:

 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枚金币。

最后一点:食谱是加权的;例如如果可以的话,我更喜欢用铅和铋制造碳。

有没有一种优雅的方式来制定和解决这个问题?一个天真的递归解决方案看起来很诱人,但我可以想到会导致它做一定数量工作的配方集。

(并且,作为后续,有一天我的研究可能会发现一套循环的食谱 - 也许我可以用1氦气和1个氢气中的1个氦气制造1个氢气 - 我希望能够处理这种情况也是如此。)

1 个答案:

答案 0 :(得分:2)

问题是NP难。

鉴于CNF-SAT的一个实例,准备含有试剂的炼金术表

  1. 每个变量
  2. 每个文字
  3. 每个条款(不满意的版本)
  4. 每个条款(满意的版本)
  5. 输出。
  6. 反应是

    1. 变量为相应正面文字的大量供应
    2. 变量为相应负面文字的大量供应
    3. 子句(不满意版本)和满足文字条款(满意版本)
    4. 输出的所有子句(满意的版本)。
    5. 问题是我们是否可以根据每个变量和每个子句中的一个(不满意的版本)给出输出。

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