R.pop_back(); - в этой строчке у меня вызываетс...
Creato il: 6 settembre 2025
Creato il: 6 settembre 2025
textR.pop_back(); - в этой строчке у меня вызывается исключение, но я не понимаю с чем это может быть связано так как на каждой итерации алгоритма у меня удаляется один интервал и вместо него добавляются два новых это просто невозможно чтобы вектор опустел: static __declspec(noalias)std::vector<float> Base_LNA_1_2_Mer_AGP(const uint32_t N, const uint32_t global_iterations, const float a, const float b, const float c, const float d, const float r, const bool mode, const float epsilon, const float seed) noexcept
{
textif (N == 1u) { const float initial_length = b - a; float dmax = initial_length; const float start_val = ShekelFunc(a, seed); float best_f = ShekelFunc(b, seed); uint32_t schetchick = 0u; std::pair<float, float> x_Rmax = std::make_pair(a, b); std::pair<float, float> y_Rmax = std::make_pair(start_val, best_f); std::vector<float> Extr; Extr.reserve((global_iterations << 1u) + 4u); std::vector<Interval> R; R.reserve(global_iterations + 1u); R.emplace_back(std::make_pair(a, start_val), std::make_pair(b, best_f), N); float Mmax = R.back().M; float m = r * Mmax; const float threshold_03 = 0.3f * initial_length; const float inv_threshold_03 = 1.0f / threshold_03; while (true) { const float new_point = Shag(m, x_Rmax.first, x_Rmax.second, y_Rmax.first, y_Rmax.second, N, r); const float new_value = ShekelFunc(new_point, seed); const std::pair<float, float> promejutochnaya_tochka{ new_point, new_value }; if (new_value < best_f) { best_f = new_value; Extr.emplace_back(best_f); Extr.emplace_back(new_point); } std::pop_heap(R.begin(), R.end(), Compare); Interval promejutochny_otrezok = std::move(R.back()); R.pop_back(); const size_t r_size = R.size(); const float len2 = promejutochny_otrezok.end.first - new_point; const float len1 = new_point - promejutochny_otrezok.start.first; const float dmin = len1 < len2 ? len1 : len2; if (++schetchick == global_iterations || dmin < epsilon) { Extr.emplace_back(dmin); Extr.emplace_back(schetchick); return Extr; } Interval curr(promejutochny_otrezok.start, promejutochnaya_tochka, N); Interval curr1(promejutochnaya_tochka, promejutochny_otrezok.end, N); const float currM = curr.M > curr1.M ? curr.M : curr1.M; if (len2 + len1 == dmax) { dmax = len2 > len1 ? len2 : len1;
#pragma loop(ivdep)
for (size_t i = 0u; i < r_size; ++i) {
const float len = R[i].end.first - R[i].start.first;
if (len > dmax) {
dmax = len;
}
}
}
textif (mode) { if (threshold_03 > dmax && schetchick % 3u == 0u || 10.0f * dmax < initial_length) { if (currM > Mmax) { Mmax = currM; m = r * Mmax; } const float progress = fmaf(-inv_threshold_03, dmax, 1.0f); const float alpha = fmaf(progress, progress, 1.0f); const float betta = 2.0f - alpha; const float MULTIPLIER = (1.0f / dmax) * Mmax; const float global_coeff = fmaf(MULTIPLIER, r, -MULTIPLIER); const float GLOBAL_FACTOR = betta * global_coeff; curr.ChangeCharacteristic(fmaf(GLOBAL_FACTOR, len1, curr.M * alpha), N); curr1.ChangeCharacteristic(fmaf(GLOBAL_FACTOR, len2, curr1.M * alpha), N);
#pragma loop(ivdep)
for (size_t i = 0u; i < r_size; ++i) {
const float len_item = R[i].end.first - R[i].start.first;
R[i].ChangeCharacteristic(fmaf(GLOBAL_FACTOR, len_item, R[i].M * alpha), N);
}
std::make_heap(R.begin(), R.end(), Compare);
}
else {
if (currM > Mmax) {
Mmax = currM;
m = r * Mmax;
curr.ChangeCharacteristic(m, N);
curr1.ChangeCharacteristic(m, N);
#pragma loop(ivdep)
for (size_t i = 0u; i < r_size; ++i) {
R[i].ChangeCharacteristic(m, N);
}
std::make_heap(R.begin(), R.end(), Compare);
}
else {
curr.ChangeCharacteristic(m, N);
curr1.ChangeCharacteristic(m, N);
}
}
}
else {
if (currM > Mmax) {
Mmax = currM;
m = r * Mmax;
curr.ChangeCharacteristic(m, N);
curr1.ChangeCharacteristic(m, N);
#pragma loop(ivdep)
for (size_t i = 0u; i < r_size; ++i) {
R[i].ChangeCharacteristic(m, N);
}
std::make_heap(R.begin(), R.end(), Compare);
}
else {
curr.ChangeCharacteristic(m, N);
curr1.ChangeCharacteristic(m, N);
}
}
textR.emplace_back(std::move(curr)); std::push_heap(R.begin(), R.end(), Compare); R.emplace_back(std::move(curr1)); std::push_heap(R.begin(), R.end(), Compare); const Interval& top = R.front(); x_Rmax = std::make_pair(top.start.first, top.end.first); y_Rmax = std::make_pair(top.start.second, top.end.second); } }
Почти наверняка проблема в том, что вы вызываете std::pop_heap
на диапазоне, который ещё ни разу не был преобразован в кучу. Сразу после первого emplace_back
вектор R
НЕ является кучей, а алгоритмы pop_heap/push_heap
требуют, чтобы диапазон уже удовлетворял свойствам кучи. В результате первый же pop_heap(R.begin(), R.end(), Compare)
— это UB; в MSVC-дебаге это часто проявляется как “исключение” на R.pop_back()
(на деле контейнер уже в некорректном состоянии).
Сразу после первичной вставки элемента в R
сделайте make_heap
:
cppR.emplace_back(std::make_pair(a, start_val), std::make_pair(b, best_f), N); std::make_heap(R.begin(), R.end(), Compare); // <— ВАЖНО: инициализация кучи float Mmax = R.back().M; float m = r * Mmax;
Дальше вы уже корректно используете push_heap
после каждого emplace_back
и периодически пересобираете кучу make_heap
после массовых изменений при ChangeCharacteristic
.
cppif (R.empty()) { /* обработать ситуацию или assert */ } std::pop_heap(R.begin(), R.end(), Compare); Interval promejutochny_otrezok = std::move(R.back()); R.pop_back();
Корректность компаратора. Убедитесь, что Compare
задаёт строгий слабый порядок и не опирается на меняющееся внешнее состояние. Иначе pop_heap
/make_heap
могут вести себя непредсказуемо.
NaN/Inf в ключах кучи. У вас есть участок:
cppconst float MULTIPLIER = (1.0f / dmax) * Mmax;
Если dmax
когда-нибудь станет нулём, получите Inf/NaN
, и сравнения в Compare
перестанут быть строгими → кучу «ломает». Подстелите соломку:
cppif (dmax <= std::numeric_limits<float>::epsilon()) { // зафиксировать коэффициенты, пересчитать dmax или выйти }
if (len2 + len1 == dmax)
лучше заменить на сравнение с допуском.После добавления одного std::make_heap
сразу после первой вставки проблема с R.pop_back()
должна исчезнуть.