我的问题是某种中国邮递员问题。计算所有可能的和有意义的排列
我得到了一个迷宫,其中程序放置n个代理和n个目标。现在每个代理都必须至少访问一次目标。因此,我必须使用A *算法来计算所有目标之间的最短路径,也许后面是D *。
现在我的问题是计算目标的排列。我的意思是我有一个计算所有可能的排列的程序。但这并不意味着全部了解它们是很聪明的。我的意思是如果我有4个目标,我得到n!排列(在本例中为24)。但是排列1234的路径长度与4321相同。所以我需要升级我的函数来找到所有排列中的对称性,并且只用A *来表示最小排列数。
所以这是我目前用来生成所有排列的代码。目前我只是将它们打印出来,但后来我想用一种数组或矢量来排列排列,但与我的主要问题相比,这非常简单。
#include <iostream>
#include <algorithm>
#include <iterator>
int main(int argc, char *argv[])
{
unsigned int n = atoi(argv[1]);
unsigned int f[n], *const fn = f + sizeof(f)/sizeof(*f);
for(int j=0; j<n; j++)
{
f[j]=(j+1);
}
unsigned int i = 0;
do
{
std::cout << ++i << ". Permutation: ";
copy(f, fn, std::ostream_iterator<int>(std::cout, " "));;
std::cout << std::endl;
}
while(std::next_permutation(f, fn));
return 0;
}
注意,[可变长度数组(HTTPS:/ /en.wikipedia.org/wiki/Variable-length_array)是一个非标准功能,有些编译器将其作为扩展。如果你真的想要可变长度的“数组”,那么使用'std :: vector'。 – 2014-11-21 08:05:44
还要注意,尽管从目标'1'到'4'的路径与从目标'4'到'1'的路径相同(只是颠倒过来),你忘记了*完整*路径包括到达它们的“代理”第一个目标。特定代理定位到'1'的路径很可能与定位到'4'的路径非常不同。 – 2014-11-21 08:08:38
@Joachim Pileborg:我知道路径包含代理的路径。我的方法是:用最短路径找到目的地的顺序,然后检查每个代理人最接近的目标并计算代理人必须行进的方式。 – user3794592 2014-11-21 08:15:13