У меня есть вектор с двойными элементами, который я хочу ранжировать (на самом деле это вектор с объектами с двойным членом, называемым costs
). Если есть только уникальные значения или я игнорирую неуникальные значения, тогда проблем нет. Однако я хочу использовать средний ранг для неуникальных значений. Кроме того, я нашел в SO несколько вопросов о рангах, однако они игнорируют неуникальные значения.
Например, скажем, у нас есть (1, 5, 4, 5, 5), тогда соответствующие ранги должны быть (1, 4, 2, 4, 4). Когда мы игнорируем неуникальные значения, ранги равны (1, 3, 2, 4, 5).
При игнорировании неуникальных значений я использовал следующее:
void Population::create_ranks_costs(vector<Solution> &pop)
{
size_t const n = pop.size();
// Create an index vector
vector<size_t> index(n);
iota(begin(index), end(index), 0);
sort(begin(index), end(index),
[&pop] (size_t idx, size_t idy) {
return pop[idx].costs() < pop[idy].costs();
});
// Store the result in the corresponding solutions
for (size_t idx = 0; idx < n; ++idx)
pop[index[idx]].set_rank_costs(idx + 1);
}
Кто-нибудь знает, как учитывать неуникальные значения? Я предпочитаю использовать std::algorithm
, так как IMO это приводит к чистому коду.
average rank for non unique values
? Разве это не будет само (неуникальное) значение? - person barak manos   schedule 13.06.2015