2014-11-21 80 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