我有:
1)“起始集”,多集,e.x。 {x,y,z,z},
2)一组转换,e.x。 {x,z} => {y},{z,z} => {z},{x} => {z},{y} => {x}和
3)我试图通过将转换应用于起始集e.x而获得的“目标集”。 {z}。
我想找到一种算法来生成(可能是无限的)转换到可能导致目标集的起始集的转换应用程序。例如:
{ x, y, z, z }, y => x
{ x, x, z, z }, x => z
{ z, x, z, z }, x => z
{ z, z, z, z }, {z, z} => z
{ z, z, z }, {z, z} => z
{ z, z }, {z, z} => z
{ z }
元素的顺序无处不在。
这听起来像是一个可能存在(命名)的问题,但我不认识它。任何人都可以帮助我追踪它,或建议进一步阅读类似的东西吗?
答案 0 :(得分:2)
您正在描述一个非常广泛的问题。它可以通过广义优先搜索来解决(如果转换是非终止的,则深度优先不起作用),只需按照广度优先顺序应用所有规则,直到达到目标集。
性能可能会很差,通过更多地考虑转换的语义可以获得更多的成果。每次重写并定义搜索策略并使用A *后,将当前状态减少到最小但等效的形式可以帮助您。
答案 1 :(得分:1)
这似乎是一个非常难的问题!我相信即使决定是否存在一系列变换(将源转换为目标)的决策问题仍然是Undecidable Problem。查看Tag System页面上的List of Undecidable Problems页面。
事实上,看起来问题的决定版本至少与Collatz Conjecture一样难,后者表明序列
n -> n/2 if n is even
n -> 3n+1 if n is odd
始终以1结尾。
这个猜想可以表述为:
给出一组变换
a -> bc
b -> a
c -> aaa
可以这个词
aaa...aaa (a repeated n times)
最终转变为
这个词a
(单个字母a)。
由于转换一次只占一个字符,因此顺序无关紧要:一个单词可以被视为多重集,适用于您的问题。
Collatz猜想的这组变换来自于此:http://logica.ugent.be/liesbeth/TagColOK.pdf(参见第7页)。
基本上我们甚至不能确定这个特定问题的算法是否会在所有输入上终止。
我想你只需要探索所有路径(使用BFS / A *无论如何),希望你能幸运。
当然,如果你的转换规则总是减少符号的数量,那么穷举搜索(甚至是DFS)肯定会停止。
所以,正如你所说,做一个BFS /启发式。但是,现在在这些信息之后,我想你可以自信地做到这一点。 : - )