2014-11-21 71 views
1

我的问题是某种中国邮递员问题。计算所有可能的和有意义的排列

我得到了一个迷宫,其中程序放置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; 
} 
+0

注意,[可变长度数组(HTTPS:/ /en.wikipedia.org/wiki/Variable-length_array)是一个非标准功能,有些编译器将其作为扩展。如果你真的想要可变长度的“数组”,那么使用'std :: vector'。 – 2014-11-21 08:05:44

+0

还要注意,尽管从目标'1'到'4'的路径与从目标'4'到'1'的路径相同(只是颠倒过来),你忘记了*完整*路径包括到达它们的“代理”第一个目标。特定代理定位到'1'的路径很可能与定位到'4'的路径非常不同。 – 2014-11-21 08:08:38

+0

@Joachim Pileborg:我知道路径包含代理的路径。我的方法是:用最短路径找到目的地的顺序,然后检查每个代理人最接近的目标并计算代理人必须行进的方式。 – user3794592 2014-11-21 08:15:13

回答

0

要跳过对称排列,可以跳过所述一个其中最后节点是劣于第一节点:

void show_permutation(std::vector<unsigned int> v) 
{ 
    int i = 0; 
    do { 
     if (v.back() < v.front()) { 
      continue; 
     } 
     std::cout << ++i << ". Permutation: "; 
     copy(v.begin(), v.end(), std::ostream_iterator<unsigned int>(std::cout, " ")); 
     std::cout << std::endl; 
    } while(std::next_permutation(v.begin(), v.end())); 
} 

Live example

+0

我刚试过刚刚发布的实例中的代码。因此,我添加了#include 和#include ,但仍然收到错误消息:[错误]'iota'不是'std'的成员。 – user3794592 2014-11-21 10:24:25

+1

'std :: iota'来自C++ 11的''。如果你没有,使用正常的循环:'for(std :: size_t i = 0; i!= v.size(); ++ i){v [i] = i;}'。 – Jarod42 2014-11-21 10:31:58

+0

我刚刚尝试了Jarod42提供的代码。所以我尝试了10个目标,通常返回3.628.800排列。所以使用高级代码我只有1.814.400排列。但是计算所有排列仍然需要将近49分钟。 有没有人有提示,我怎么可以减少超过两倍的排列量? – user3794592 2014-11-21 17:44:50