我的代碼創建了幾個對象實例(每個實例都有一個適應值等等),我想從中根據它們的適應值使用加權選擇對N個獨特對象進行採樣。然後丟棄所有未採樣的物體(但它們需要初始創建以確定其適應值)。對成員函數的結果進行迭代
我當前的代碼看起來是這樣的:
vector<Item> getItems(..) {
std::vector<Item> items
.. // generate N values for items
int N = items.size();
std::vector<double> fitnessVals;
for(auto it = items.begin(); it != items.end(); ++it)
fitnessVals.push_back(it->getFitness());
std::mt19937& rng = getRng();
for(int i = 0, i < N, ++i) {
std::discrete_distribution<int> dist(fitnessVals.begin() + i, fitnessVals.end());
unsigned int pick = dist(rng);
std::swap(fitnessVals.at(i), fitnessVals.at(pick));
std::swap(items.at(i), items.at(pick));
}
items.erase(items.begin() + N, items.end());
return items;
}
通常〜萬個實例最初創建的,其中N〜200。適應值是非負的,通常估值爲70。它可能高達3000,但更高的價值越來越不可能。
有沒有一種優雅的方式來擺脫fitnessVals矢量?或者更好的方法來做到這一點?效率很重要,但我也很好奇C++編碼的良好做法。
您使用'discrete_distribution'不正確;當您想要在給定分配後生成多個項目時,所有項目都需要使用相同的分配**對象**。因此,需要在循環外部創建分配。當然,我認識到你的情況並不令人滿意,但也許這只是暗示了一個糟糕的分銷選擇,或者有另一種方式來使用它。 –
我發現了一些關於你的隨機性問題:[從元素有重量的列表中選擇隨機k元素](http://stackoverflow.com/q/2140787/147192),我相信這意味着你應該創建自己的發行版來實現第一個答案是'n_random_numbers_decreasing'函數。 –