我有一个服务,在4个不同的位置出现故障。我将每个位置的故障建模为Boost ICL interval_set。我想知道至少有N个位置有活动故障的时间。
因此,遵循这个答案,我实现了一种组合算法,以便通过interval_set交集创建元素之间的组合。
当这个过程结束时,我应该有一定数量的interval_set,每个interval_set都同时定义N个位置的故障,并且最终步骤将是将它们连接起来以获得所需的完整图像。
问题是我目前正在调试代码,当打印每个交集的时间到达时,输出文本变得混乱(即使我使用gdb逐步调试),我无法看到它们,导致CPU使用率很高。
我猜想我在某种程度上发送了比应该更大的内存部分到输出,但我无法看到问题所在。
以下是SSCCE:
有需要帮助的地方吗?
因此,遵循这个答案,我实现了一种组合算法,以便通过interval_set交集创建元素之间的组合。
当这个过程结束时,我应该有一定数量的interval_set,每个interval_set都同时定义N个位置的故障,并且最终步骤将是将它们连接起来以获得所需的完整图像。
问题是我目前正在调试代码,当打印每个交集的时间到达时,输出文本变得混乱(即使我使用gdb逐步调试),我无法看到它们,导致CPU使用率很高。
我猜想我在某种程度上发送了比应该更大的内存部分到输出,但我无法看到问题所在。
以下是SSCCE:
#include <boost/icl/interval_set.hpp>
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
// Initializing data for test
std::vector<boost::icl::interval_set<unsigned int> > outagesPerLocation;
for(unsigned int j=0; j<4; j++){
boost::icl::interval_set<unsigned int> outages;
for(unsigned int i=0; i<5; i++){
outages += boost::icl::discrete_interval<unsigned int>::closed(
(i*10), ((i*10) + 5 - j));
}
std::cout << "[Location " << (j+1) << "] " << outages << std::endl;
outagesPerLocation.push_back(outages);
}
// So now we have a vector of interval_sets, one per location. We will combine
// them so we get an interval_set defined for those periods where at least
// 2 locations have an outage (N)
unsigned int simultaneusOutagesRequired = 2; // (N)
// Create a bool vector in order to filter permutations, and only get
// the sorted permutations (which equals the combinations)
std::vector<bool> auxVector(outagesPerLocation.size());
std::fill(auxVector.begin() + simultaneusOutagesRequired, auxVector.end(), true);
// Create a vector where combinations will be stored
std::vector<boost::icl::interval_set<unsigned int> > combinations;
// Get all the combinations of N elements
unsigned int numCombinations = 0;
do{
bool firstElementSet = false;
for(unsigned int i=0; i<auxVector.size(); i++){
if(!auxVector[i]){
if(!firstElementSet){
// First location, insert to combinations vector
combinations.push_back(outagesPerLocation[i]);
firstElementSet = true;
}
else{
// Intersect with the other locations
combinations[numCombinations] -= outagesPerLocation[i];
}
}
}
numCombinations++;
std::cout << "[-INTERSEC-] " << combinations[numCombinations] << std::endl; // The problem appears here
}
while(std::next_permutation(auxVector.begin(), auxVector.end()));
// Get the union of the intersections and see the results
boost::icl::interval_set<unsigned int> finalOutages;
for(std::vector<boost::icl::interval_set<unsigned int> >::iterator
it = combinations.begin(); it != combinations.end(); it++){
finalOutages += *it;
}
std::cout << finalOutages << std::endl;
return 0;
}
有需要帮助的地方吗?