Поиск пары чисел оптимально близких к заданному константному числу

 

Прошу помочь в решении задачи.

Даны два ряда чисел от 0 до 100, которые в паре друг с другом в случайном порядке (условно) и не могут переставляться по отдельности. Есть условное число, которое задается пользователем - от 0 до 100.

Нужно найти пары чисел, которые наиболее близки к заданному числу, при этом надо оценивать каждое число в паре по отдельности - чем ближе тем лучше.

Я начал с того, что нашел дельты от заданного числа для каждого ряда чисел, которые учитываю по модулю, т.е. без знака "-".

Таким образом, визуально я себе это представляю, как условное число пользователя находится по середине, а каждое из чисел ряда по обе стороны от него. Если провести отрезки, то видно, что одна пара, левей, другая правей от центра, т.е. они находятся не только на разном расстоянии друг от друга, но и на разном расстоянии от центра.

Проблема в том, что, если суммировать две дельты, то можно найти наименьшее общее расстояние, но этого не достаточно.

Вот, пусть заданное число 3, есть дельты пар чисел: (-2;4),(-2;4),(-4;1),(-3;3),(-5;1),(-6;0) - мне надо выбрать тот вариант, который с обеих сторон ближе к центру относительно других вариантов - т.е. дает меньшую совокупную погрешность. Казалось бы это будет (-3;3) - но как это автоматизировать, и хочется задать критерий отклонения, т.е. отклонение на 10 больше чем в два раза критичней, чес отклонение на 5.

Какие есть идеи, как решить подобную задачу?

 

Что то непонятна задача. Одно число может пасть только в одном месте между двух других чисел. Откуда такой выбор?

 
Dmitry Fedoseev:

Что то непонятна задача. Одно число может пасть только в одном месте между двух других чисел. Откуда такой выбор?


Ну, если интересен источник цифр, то расскажу, есть плавающий канал (пусть он по машке), после расчетов получаем для каждой настройки процент баров оказавшихся за верхней и нижней границей канала - вот и стоит задача, задав процент - пользовательское число, найти наиболее приемлемую настройку канала (индикатора), что б погрешность одновременно с обеих сторон при одних и тех же нестройках была минимальна.

 
Aleksey Vyazmikin:

Прошу помочь в решении задачи.

Даны два ряда чисел от 0 до 100, которые в паре друг с другом в случайном порядке (условно) и не могут переставляться по отдельности. Есть условное число, которое задается пользователем - от 0 до 100.

Нужно найти пары чисел, которые наиболее близки к заданному числу, при этом надо оценивать каждое число в паре по отдельности - чем ближе тем лучше.

Я начал с того, что нашел дельты от заданного числа для каждого ряда чисел, которые учитываю по модулю, т.е. без знака "-".

Таким образом, визуально я себе это представляю, как условное число пользователя находится по середине, а каждое из чисел ряда по обе стороны от него. Если провести отрезки, то видно, что одна пара, левей, другая правей от центра, т.е. они находятся не только на разном расстоянии друг от друга, но и на разном расстоянии от центра.

Проблема в том, что, если суммировать две дельты, то можно найти наименьшее общее расстояние, но этого не достаточно.

Вот, пусть заданное число 3, есть дельты пар чисел: (-2;4),(-2;4),(-4;1),(-3;3),(-5;1),(-6;0) - мне надо выбрать тот вариант, который с обеих сторон ближе к центру относительно других вариантов - т.е. дает меньшую совокупную погрешность. Казалось бы это будет (-3;3) - но как это автоматизировать, и хочется задать критерий отклонения, т.е. отклонение на 10 больше чем в два раза критичней, чес отклонение на 5.

Какие есть идеи, как решить подобную задачу?


МНК

 
Alexey Oreshkin:

МНК


Я не знаток высшей математики, увы, может от этого и не могу сообразить, как методом наименьших квадратов можно найти лучшую комбинацию.

Прошу Вас помочь с алгоритмом, раз Вы его уже узрели.

 

А чем не устраивает

Возвращаемое значение

Возвращает индекс найденного элемента. Если искомое значение не найдено, то возвращает индекс ближайшего по значению элемента.

Примечание

Двоичный поиск обрабатывает только сортированные массивы. Для сортировки числового массива используется функция ArraySort().

int a = ArrayBsearch(const char& array[], 3);
int b = ArrayBsearch(const char& array[], -3);
 
Alexey Viktorov:

А чем не устраивает


Не понял, как реализовать предлагаете двоичный поиск. К тому же, как я отсортирую по возрастанию два массива - они же потеряют пару. 

 
Aleksey Vyazmikin:

Не понял, как реализовать предлагаете двоичный поиск. К тому же, как я отсортирую по возрастанию два массива - они же потеряют пару. 

В результате нужно значение или индекс в исходном массиве?

 
Алексей, приведите пару примеров. Задача не ясна. Логика какая? Дмитрий Федосеев правильно написал "Что то непонятна задача... "
 
Alexey Viktorov:

В результате нужно значение или индекс в исходном массиве?


Желательно найти индекс - он будет соответствовать значению настроек. Но, можно пробовать (так как число не целое, то могут быть погрешности) искать уже зная числа значения индекс. Главное не разбивать пару.

 
Dennis Kirichenko:
Алексей, приведите пару примеров. Задача не ясна. Логика какая? Дмитрий Федосеев правильно написал "Что то непонятна задача... "

Вот таблица с данными, и промежуточными вычислениями:

ИндексABКонстантаДельтаАДельтаBСуммДельт
1 5,36 5,80 5 0,36 0,80 1,16
2 4,92 5,45 5 0,08 0,45 0,52
3 4,47 4,98 5 0,53 0,02 0,55
4 4,05 4,56 5 0,95 0,44 1,39
5 4,89 5,53 5 0,11 0,53 0,64
6 4,32 5,00 5 0,68 0,00 0,68
7 5,03 5,80 5 0,03 0,80 0,82
8 4,45 5,21 5 0,55 0,21 0,76
9 5,06 5,88 5 0,06 0,88 0,94
10 4,42 5,30 5 0,58 0,30 0,88
11 4,95 5,92 5 0,05 0,92 0,97
12 4,32 5,34 5 0,68 0,34 1,02
13 4,79 5,84 5 0,21 0,84 1,05
14 4,24 5,27 5 0,76 0,27 1,04
15 4,68 5,68 5 0,32 0,68 1,00
16 4,11 5,11 5 0,89 0,11 1,00
17 4,50 5,50 5 0,50 0,50 1,00
18 4,88 5,89 5 0,12 0,89 1,01
19 4,23 5,29 5 0,77 0,29 1,07
20 4,52 5,64 5 0,48 0,64 1,11
21 4,85 5,98 5 0,15 0,98 1,13
22 4,24 5,38 5 0,76 0,38 1,15
23 4,56 5,73 5 0,44 0,73 1,17
24 4,26 5,46 5 0,74 0,46 1,20
25 4,56 5,71 5 0,44 0,71 1,15
26 4,04 5,19 5 0,96 0,19 1,15
27 4,32 5,46 5 0,68 0,46 1,14
28 4,60 5,76 5 0,40 0,76 1,17

Нам нужно найти пару чисел наиболее близко расположенных к числу 5.

Если усреднить последний столбец, то получим число 1, очевидно, что те суммы дельт, которые меньше единицы подлежат более пристальному рассмотрению. В нашем случае стоит, видимо выбирать между вторым и третьем индексом-вариантом, но это вовсе не обязательно, так как у нас дельта А могла быть 0,51 ,а дельта Б 0 - казалось бы этот вариант в сумме довал 0,51 и был бы предпочтительней, но это не так, из-за более сильного смещения дельты А.

Причина обращения: