组合探索 C++

计算科学 C++ 组合学
2021-12-10 02:29:26

我有n个位置,每个位置有2 个可能的位置。

我想在 C++ 中使用循环探索所有这些可能性(或者如果有更好的选择的话)。

我正在考虑从 0 循环到 power(2,n) 并将其转换为二进制数,对于位置 j,取二进制数的第 j 位,使用 0 表示第一种可能性,使用 1 表示第二种可能性。

有没有更好的办法?因为这种做法引入了解析操作并且仅限于二进制位置问题,我的意思是如果问题对于每个位置都有更多的可能性我会遇到麻烦。

1个回答

我会用以下方式概括这个问题(如果我理解你的问题的话):

创建一个函数,该函数将根据先前探索的候选函数bool nextVariant(const &prev_x, &new_x)生成一个新候选函数然后你可以按如下方式组织你的代码(我用 C 风格的语法做了一个伪代码的草图)new_xprev_x

int main()
{
    CandidateType x(0); //initialize the starting candidate (possibility)
    do
    {
         performAnalysis(x); //do whatever you want with the candidate
         CandidateType prev_x = x; //maybe you need to save it, maybe not....
         bool isThereNext = nextVariant(prev_x,x);
    }
    while (isThereNext);
}

bool nextVariant(const CandidateType& prev_x, CandidateType& x)
{
    if (notReachTheEnd)
    {
       //your logic to create x from prev_x. (assign x)
       return true;
    }
    else return false;
}

这里,CandidateType是你的“可能性”的“类型”。您将根据您的问题来定义它,无论它是具有 2 个位置的 N 点,还是更复杂的东西。

有了这个,您将复杂性转移到从以前的可能性中产生新的可能性,这通常是一件容易的事情。由于我不确切知道产生这些“候选人”的可能意图是什么,我可能已经引入了某些可以避免的低效率。