Перейти к содержимому
Pengoid

Вычисление погрешности геосканера

Рекомендуемые сообщения

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

 

Результаты

Максимальная погрешность NMax строго пропорциональна расстоянию R, которую можно вычислить по формуле NMax = R/16.5 (более точный вариант: NMax = R*0.0606 - товарищи посмотрели в код и подсказали).
При любом расположении сканируемого блока в зоне видимости сканера 65*65*64 (сканер находится в центре) расстояние можно вычислить по формуле: R = x^2 + y^2 + (z - 33)^2, где x и y - координаты сканируемого столба относительно сканера, а z - номер элемента в таблице, которую возвращает сканер.

 

Применение

Знание максимальной погрешности NMax для данного R позволяет нам рассчитать максимальное расстояние, на котором данным методом возможно первым же сканированием гарантированно отличить два блока с твердостями P1 и P2.
Для этого требуется вычислить максимально допустимый шум N, при котором полученные со сканера значения точно не будут пересекаться. Получаем неравенство: P1 + N < P2 - N, имеем: N < (P2 - P1)/2.
В итоге R = (P2 - P1)/(2*0.0606).

 

Пример применения

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

shcedevr-min.png.aab7a5adb2c794c1fba520c2e2e5002b.png
Воспользуемся описанным выше методом: R = (3 - 1,5)/(2*0.0606) = 12.376

Алмазы генерируются до 16 высоты, а бедрок - до 5. Если руда не заспавнилась на 3 высоте, ниже копать скорее всего нечего. Отсюда высота цилиндра H = 16 - 3 = 13 блоков. Тогда максимальное расстояние до края цилиндра по вертикали h = (H - 1)/2. За теоремой Пифагора найдем радиус цилиндра r = (R^2 - h^2)^(1/2).

Тогда за той же теоремой получаем, что r^2 = x^2 + y^2, где x и y - максимальные координаты сканирования относительно геосканера. Так мы узнаем, до каких x и y мы можем со 100% точностью отличить алмазную руду от камня.

 

Сам эксперимент

1. Создавался кубоид 65*65*64 из обсидиана, так как это максимальная зона сканирования для геосканера.

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

3. Загрузил в него с помощью дискеты программу, имеющую функцию "scan", которая многогратно сканирует один и тот же блок в определенных координатах, возвращает среднюю, минимальную и максимальную погрешность.

local component = require "component"
local io = require "io"

local geolyzer = component.geolyzer

local path = "/home/geoScanData.txt"
local accuracy = 10
local hardness = geolyzer.analyze(3).hardness
local radius = 32
local average, min, max = {}, {}, {}

local function compareData (scanData, sum, min, max)
  local lMin, lMax = min, max
  if scanData < min then
    lMin = scanData
  end
  if scanData > max then
    lMax = scanData
  end
  return sum + scanData, lMin, lMax
end

local function scan(x, y, zMin, zMax, hardness, accuracy)
  local sum, min, max = 0, 2, 0
  for i = 1, accuracy do
    local scanData = geolyzer.scan(x, y)
    for j = zMin, zMax do
      sum, min, max = compareData(math.abs(scanData[j]-hardness), sum, min, max)
    end
  end
  return sum/(accuracy*(zMax-zMin+1)), min, max
end

local function DGN(k, radius, x, y, z, hardness, accuracy)
  for i = 1, radius do
    average[i+k], min[i+k], max[i+k] = scan(i*x, i*y, 33-i*z, 33-i*z, hardness, accuracy)
    print(average[i+k].."\n"..min[i+k].."\n"..max[i+k].."\n"..i.."/"..radius.."/"..x+y+z.."\n")
  end
end

DGN(0, radius, 1, 0, 0, hardness, accuracy)
DGN(radius, radius, 1, 1, 0, hardness, accuracy)
DGN(radius*2, radius, 1, 1, 1, hardness, accuracy)

print("Done!")

file = io.open(path, "w")
local len = #average
for i = 1, len do file:write(average[i].."\n") end file:write("\n")
for i = 1, len do file:write(min[i].."\n") end file:write("\n")
for i = 1, len do file:write(max[i].."\n") end file:write("\n")
io.close()

Три вызова функции "DGN" вызывают функцию "scan" по порядку для каждого блока по определенной линии от робота до края кубоида.

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

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

2020-04-23_10_22_14.png.ae61a671292a118386347205fe40ddda.png

Потом программа сохраняет все результаты в файл, после чего я ввожу данные в excel: GeolyzerNoise.xlsx.

Первый график показывает зависимость максимальной погрешности от расстояния для 500 сканирований каждого блока. Таким образом расстояние до блока можно вычислять по указанной ранее формулой, результат не зависит от количества осей, по которым блок смещен относительно сканера.

Shedule1-min.png.f0e83ca7a505c0eb9323dd6672ed4f50.png

Отсюда я и получил константу 1/16.5

 

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

Shedule2-min.png.15aa402e9c049db9b2f2b0fd0f32e7fc.png

 

Третий график показывает, что средняя арифметическая погрешность приблизительно в два раза меньше максимальной. Сам не знаю что с этим делать.

Shedule3-min.png.84de6cd37d21a9d190ef72c9cdd96ead.png

Изменено пользователем Pengoid
Попытка сделать понятнее

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Pengoid Тема оформлена не очень удобно для восприятия, но почему она во флудилке? Предлагаю переместить её в беседку программистов. В теме есть рациональное зерно, которое можно развить дальше.

 

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

56 минут назад, Pengoid сказал:

даже при 30 проверках среднее значение твердости сильно отличается от реального, и получать твердость из среднего арифметического очень невыгодно по затратам времени и энергии.

Свет не сошёлся клином на одном лишь среднем арифметическом, можно придумать вычисления, обеспечивающие более быструю сходимость.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, eu_tomat сказал:

@Pengoid Тема оформлена не очень удобно для восприятия

Можно несколько советов касательно оформления? Я абсолютный новичок в этом деле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ничего не понятно, но очень интересно.

Принятие решения сводится к оценке вероятности попадания плотности в нужный диапазон. Сканирование очень затратно по времени.

Если будем сканировать и усреднять, то для уточнения понадобится линейное увеличение количества сканирований на каждый блок.

 

Можно поступить проще.

Берем минимальную и максимальную плотность для руды и камня, сравниваем их.

YY3ps3W.png

Видим, что на расстоянии в 12 блоков имеется пересечение плотностей, при максимально возможном уровне шума. Следовательно, до 12 блока можно легко обнаруживать и добывать руду.

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

 

Путем нехитрых манипуляций, выводим формулу получения максимального шума из расстояния. N = R * 0.0606

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

 

Чтобы отнять максимум плотности камня от минимума плотности руды, можно заюзать функцию math.max, в результате имеем возможность с вероятностью примерно в 99.99% не перепутать камень с рудой на любом расстоянии.

 

Получаем уровень шума: N = math.sqrt(x^2 + y^2 + z^2) * 0.0606

Вычисляем минимально возможную плотность для текущего расстояния: math.max(3 - N, 1.5 + N)

Если полученное число меньше результата сканирования, то все норм, этот блок точно плотнее камня и за ним можно ехать.

 

Для примера я взял предельный случай, который возникает довольно редко. Можно поиграться с параметрами, например уменьшить коэффициент шума при оценке. Или на расстоянии больше 25 блоков устанавливать минимальную плотность на 3.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Doob сказал:

Берем минимальную и максимальную плотность для руды и камня, сравниваем их.

YY3ps3W.png

Видим, что на расстоянии в 12 блоков имеется пересечение плотностей, при максимально возможном уровне шума. Следовательно, до 12 блока можно легко обнаруживать и добывать руду.

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

 

Путем нехитрых манипуляций, выводим формулу получения максимального шума из расстояния. N = R * 0.0606

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

 

Чтобы отнять максимум плотности камня от минимума плотности руды, можно заюзать функцию math.max, в результате имеем возможность с вероятностью примерно в 99.99% не перепутать камень с рудой на любом расстоянии.

Получаем уровень шума: N = math.sqrt(x^2 + y^2 + z^2) * 0.0606

Вычисляем минимально возможную плотность для текущего расстояния: math.max(3 - N, 1.5 + N)

Если полученное число меньше результата сканирования, то все норм, этот блок точно плотнее камня и за ним можно ехать.

Разве это не то же самое, что я описал выше? Правда, в вашем примере все понятнее, также разница в другом порядке вычислений и в том, что я получил константу 0.0606 очень глупым, экспериментальным путем в виде 1/16.5, что почти не отличается от реальности, а все остальные вычисления такие же. Только еще я приводил способ получения оптимальной области сканирования в зависимости от диапазона высот генерации руды.

Чуть подробнее опишу, как делал я и почему предпочитаю немного иной порядок действий.

Сначала единоразово вычисляю: максимально допустимую погрешность для того, чтобы отличить блок с плотностью P1 от P2:

N = math.abs(P1-P2)/2, максимальное R^2 = (N/0.0606)^2 для вычисления области сканирования, порог допустимых значений PMin, PMax = P1 - N, P1 + N. Если уже вычислена область, на которой происходит сканирование, остается только сравнивать полученную плотность P0 сканированного блока: PMin < P0 < PMax. Если условие выполняется, то результат аналогичный вашему и моему первому примерам.

 

Изменено пользователем Pengoid
Ошибка, поменял местами + и -

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Хотя, конфиг сервера вроде-бы всегда копируется клиенту, поэтому если множитель не стандартный, то можно посмотреть в конфиг и подогнать уже известную константу.

 

Для своей копалки я тупо взял самый дальний блок и прикинул какой у него будет разброс, затем захардкодил константу. Область сканирования 16x16 блоков, поэтому на расстоянии 8 блоков по диагонали +1 смещение слоя, как раз все попадает в чистые 12 блоков.

Хотя это не очень умный вариант, получается, что при статичном минимуме 2.25, робот загребает всякую шелуху типа досок/заборов/сундуков. Но свинец имеет плотность деревяхи, поэтому тупой подход как нельзя кстати.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
29 минут назад, Doob сказал:

Хотя, конфиг сервера вроде-бы всегда копируется клиенту, поэтому если множитель не стандартный, то можно посмотреть в конфиг и подогнать уже известную константу.

Точно? Я знаю что алекс правит вроде как на сервере только конфиги.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 23.04.2020 в 06:16, Pengoid сказал:

Можно несколько советов касательно оформления? Я абсолютный новичок в этом деле.

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


В первом предложении темы желательно объяснить читателю, куда он попал, зачем нужна эта тема, и к чему его может привести чтение. Например, так: в этой теме я предлагаю обсудить способность геосканера различать плотности руд с учётом шума. Или так: в этой теме я хочу описать своё исследование возможностей геосканера и оптимальных способов сканирования руд.


Для примера я попробую воспроизвести своё восприятие темы.


Сначала я вижу заголовок темы "Вычисление погрешности геосканера". Название интересное, но в теме может быть что угодно: программа, методика, исследование, вопрос, приглашение к обсуждению. Учитывая, что тема изначально находилась в разделе флудилки, можно было строить самые безумные предположения. Сейчас тема находится в беседке, что настраивает читателя и комментатора на более серьёзное отношение, но всё равно не понятно, чего автор ожидает от читателей темы.


В начале я вижу следующее "Решил измерить зависимость погрешности геосканера от расстояния". Я не понимаю, к чему ведёт автор. Он хочет что-то спросить? Он хочет чем-то поделиться? Хочет обсудить? Я быстро просматриваю первый абзац (или что-то напоминающее абзац), вижу, что автор что-то для себя уже понял, сделал какие-то выводы.


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

 

И так почти до самого конца этого текста я пытался понять, к чему ведёт меня автор. Но понял лишь смутно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, Pengoid сказал:

@eu_tomat@eu_tomat Есть смысл попытаться написать все заново? 

Смотря для какой цели. И смотря насколько заново.

 

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

 

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

 

Возвращаясь к вопросу: я вижу смысл в доработке. А решение переписать всё заново может принять лишь автор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
17 часов назад, Pengoid сказал:

Разве это не то же самое, что я описал выше? Правда, в вашем примере все понятнее, также разница в другом порядке вычислений и в том, что я получил константу 0.0606 очень глупым, экспериментальным путем в виде 1/16.5, что почти не отличается от реальности, а все остальные вычисления такие же.

Это не то же самое. Оба способа имеют право на существование. Можно сказать, что @Pengoid выполнил экспериментальное исследование, а @Doob теоретическое. И так как результаты совпали, то теория, скорее всего, верна, и эксперимент тоже поставлен верно, скорее всего. Оба молодцы.

 

Ничего удивительного в том, что теоретические выкладки дают более короткое и наглядное объяснение, и красивые графики. В этом и заключается назначение теории.

 

Благодаря этой теме я тоже кое-что понял про геосканер. Я раньше замечал, что абсолютное значение минимальных отрицательных величин шума всегда больше абсолютного значения его максимальных положительных величин. Например, -0.06060 против +0.06013 на единичном расстоянии при стандартной константе шума. Но в код я не заглядывал и понять причину не пытался. Но когда @Doob кинул ссылку на код, и я не поленился его почитать, причина аномалии стала очевидной. Дело в том, что исходными значениями для получения шума является набор случайных байт, которые затем преобразуются в числа с плавающей точкой. Это приводит к двум последствиям:

 

1) Шум геосканера имеет дискретную структуру, не смотря на то, что выражается значениями с плавающей точкой. Есть всего 256 фиксированных значений шума для определённого расстояния и константы шума.

 

2) Минимальное значение шума всегда больше его максимального значения в абсолютном выражении, т.к. исходный байт в архитектуре Intel кодирует 128 отрицательных значений, одно нулевое и 127 положительных. Cоотношение 128/127 равно соотношению 0.06060/0.06013 с погрешностью представления.

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Довольно не очевидно. Для меня, шапочно знакомого с жавой и скалой, казалось, что byte должен быть unsigned char, а оказалось совсем странно.

Получается, что точная константа для "положительного шума" будет 127 / 128 / 33 * 2

А для отрицательного -128 / 128 / 33 * 2

Где 2 - это константа конфига.

С учетом, что точность float там 32 бита, получаем значения -0.060606062412261962890625 и 0.0601325742900371551513671875

Разница кажется не очень существенной. 0.0004734881...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хорошо. Сканирование «в лоб» все более-менее понимают. Существует некоторое критическое расстояние, за пределами которого результаты сканирования становятся неочевидными. И это расстояние можно точно вычислить.

 

За пределами же этого расстояния приходится прибегать к множественному сканированию и к помощи математики и логики.

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

 

Предлагаю найти не столь очевидные подходы в геосканировании, решая следующую задачу:

 

Произведено три сканирования одного и того же блока, находящегося на расстоянии 30 блоков от геосканера. Известно, что это либо руда с плотностью 3, либо камень с плотностью 1.5. Доски, булыжник, свинцовую руду пока не рассматриваем для упрощения задачи. Полученные значения (округлённо): {1.295, 3.341, 1.580}.

 

Вопросы: что за блок мы просканировали: это руда или камень? Почему? Какое количество сканирований оказалось достаточным для однозначной идентификации блока?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
21 минуту назад, Doob сказал:

Довольно не очевидно. Для меня, шапочно знакомого с жавой и скалой, казалось, что byte должен быть unsigned char, а оказалось совсем странно.

Жаву и скалу я тоже читаю на уровне интуиции, и далеко не все конструкции понимаю однозначно. Есть лишь знание архитектуры Intel 8086 и каких-то других языков программирования. И если я знаю, что на выходе должно получиться отрицательное значение, а вычитания в коде нет, то отрицательно исходное значение. Тем более, в коде присутствует деление на 128 для нормализации значения. А оно как раз-таки соответствует примерным границам unsigned char, чтобы вогнать его в диапазон (-1,1). Вот как-то так в полупонятном для меня языке иногда что-то становится очевидным. Но ложные срабатывания тоже случаются, таковы издержки подхода.

 

Upd:

21 минуту назад, Doob сказал:

Разница кажется не очень существенной. 0.0004734881...

Но даже такую разницу можно будет использовать для ускорения множественного сканирования на длинных дистанциях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, eu_tomat сказал:

Вопросы: что за блок мы просканировали: это руда или камень? Почему? Какое количество сканирований оказалось достаточным для однозначной идентификации блока?

  • Руда.
  • math.max(3 - 30 * 0.606, 1.5 + 30 * 0.06013) < 3.341
  • Два.

Накидал простой скрипт на питоне, для наглядного представления сканирований.

P4v8cL8.png

import matplotlib.pyplot as plt
import numpy as np

CONST_A = 0.0601325742900371551513671875
CONST_B = -0.060606062412261962890625

x, y = np.array([0, 56, 56, 0]), np.array([0, 56 * CONST_A, 56 * CONST_B, 0])

plt.fill(x, y + 1.5, color = 'k', alpha = 0.5)
plt.fill(x, y + 3, color = 'c', alpha = 0.5)

# scans
plt.scatter([30, 30, 30], [1.295, 3.341, 1.580], color = 'DarkBlue')
plt.show()

В scatter подать список расстояний и список полученных плотностей.

 

Все-таки я сильно сомневаюсь, что многократное сканирование это рационально. Там ведь распределение равномерное и с расстоянием пересекающаяся область увеличивается до 72%, а это примерно 1.7% на каждый блок

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, eu_tomat сказал:

Произведено три сканирования одного и того же блока, находящегося на расстоянии 30 блоков от геосканера. Известно, что это либо руда с плотностью 3, либо камень с плотностью 1.5. Доски, булыжник, свинцовую руду пока не рассматриваем для упрощения задачи. Полученные значения (округлённо): {1.295, 3.341, 1.580}.

 

Вопросы: что за блок мы просканировали: это руда или камень? Почему? Какое количество сканирований оказалось достаточным для однозначной идентификации блока?

Вариант, чтобы определить со 100% точностью за пока-что неопределенное количество сканирований.
 

Алгоритм

Имеем две возможные плотности для блока P1 и P2, причем P1 < P2.

Находим R и максимальный шум Nmax = R*0.0606

Пусть, наш диапазон определяется переменными PMin, PMax = P2 - NMax, P1 + Nmax.

Сканируем, блок пока полученное значение P0 не выйдет за диапазон [PMin; PMax].

При выходе из диапазона: если P0 < PMin - блок имеет плотность P1, если P0 > PMin - блок имеет плотность P2.

 

Примерная оценка шанса выпадения за установленный диапазон

Минимально требуемую погрешность можно вычислить за формулой: Nmin = Nmax - math.abs(P1-P2), причем если Nmin < 0, блок определяется с первого сканирования. Чем больше соотношение NMax/NMin, тем меньше сканирований в среднем понадобится для определения блока.

 

Применение на примере

R уже дано, а N = 30*0.0606 = 1.8 (округленно). Находим диапазон значений для блоков с данными плотностями, имеем [1.2; 3.3]. Сканируем до тех пор, пока значение не выйдет за промежуток, и точно узнаем блок. Если это был блок с плотностью 1.5, то условие выполнится, когда погрешность будет <-0.3, а для 3 - >0.3, а это довольно таки немного, 0.3 в 6 раз меньше 1.8, по этому шанс попадания в этом случае довольно большой.

Кстати, если не округлять 1.818 + 1,5 < 3.341 (из примера), а значит плотность равна 3.

Изменено пользователем Pengoid

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

S1 = S1 + math.abs(P1 - P0) и S2 = S2 math.abs(P2 - P0), а потом сравнивать эти суммы.

Если S1 < S2, то скорее всего плотность блока - P1, и наоборот.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
31 минуту назад, Doob сказал:
  • Руда.
  • math.max(3 - 30 * 0.606, 1.5 + 30 * 0.06013) < 3.341
  • Два.

Шикарно пояснил, с иллюстрацией и кодом.

 

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

35 минут назад, Doob сказал:

Все-таки я сильно сомневаюсь, что многократное сканирование это рационально. Там ведь распределение равномерное и с расстоянием пересекающаяся область увеличивается до 72%, а это примерно 1.7% на каждый блок

Да, я тоже продолжаю сомневаться. Но и продолжаю попытки улучшить даже плохой результат. Думаю, что мы его сильно улучшим в этой теме. Ударим, так сказать, алгоритмами по шуму.

  

1 час назад, Pengoid сказал:

Вариант, чтобы определить со 100% точностью за пока-что неопределенное количество сканирований.

В своём вопросе я имел в виду количество сканирований применительно к условиями задачи. В нашем случае решение было обеспечено вторым  сканированием. Да, в общем случае мы не можем знать, сколько конкретно сканирований нам потребуется. Но ставя эту задачу, я стремился продемонстрировать, что есть лучшие альтернативы среднему арифметическому.

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не проще посмотреть код генератора "рандомных " чисел? он не криптографически стойкий, тобишь не должен быть сложно устроенным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 минут назад, NEO сказал:

Не проще посмотреть код генератора "рандомных " чисел? он не криптографически стойкий, тобишь не должен быть сложно устроенным.

Кинь ссылочку на код этого генератора. Посмотрим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...