필자는 피트니스 값을 기반으로 한 가중치 적용 선택을 사용하여 N 개의 고유 오브젝트를 샘플링하려는 여러 오브젝트 인스턴스 (각 인스턴스가 적합도 값을 갖는 인스턴스)를 만드는 코드를 가지고 있습니다. 샘플링되지 않은 모든 객체는 버려집니다 (그러나 처음에는 체력 값을 결정하기 위해 만들어야합니다). N은 ~ 200 인으로, 멤버 함수의 결과 반복하기
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;
}
는 일반적으로 ~ 10,000 인스턴스가 처음 생성됩니다
내 현재 코드는 다음과 같이 보인다. 적합도 값은 음수가 아니며 대개 ~ 70까지 평가됩니다. ~ 3000까지 올라갈 수 있지만 더 높은 가치는 점점 더있을 법하지 않습니다.
fitnessVals 벡터를 없애는 우아한 방법이 있습니까? 또는 일반적으로이 작업을 수행하는 더 좋은 방법일까요? 효율성은 중요하지만 좋은 C++ 코딩 방법에 대해서도 궁금해합니다.
'discrete_distribution'의 사용법이 잘못되었습니다. 주어진 배포판 다음에 여러 항목을 생성하려면 모든 항목이 동일한 배포판 ** 객체 **를 사용해야합니다. 따라서 배포를 루프 외부에서 만들어야합니다. 물론, 나는 그것이 당신의 경우에 만족스럽지 않다는 것을 알지만, 아마 나쁜 선택의 분배를 암시하거나 어쩌면 그것을 사용하는 다른 방법이있을 수 있습니다. –
임의성 문제와 관련하여 뭔가를 발견했습니다 : [요소에 가중치가있는 목록에서 임의의 k 요소를 선택하십시오.] (http://stackoverflow.com/q/2140787/147192), 구현하기 위해 자신 만의 배포판을 만들어야한다고 생각합니다. 첫 번째 대답은'n_random_numbers_decreasing' 함수입니다. –