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

Оккультные практики при поиске руды

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

Я думаю, можно ещё пошаманить с функцией magic и не рассчитывать максимальную и минимальную плотность камня.

Если

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

2112 * (R - H) / D

это выражение - это RANDOM_BYTE, то его можно перед взятием дробной части проверить и на попадание в диапазон [-128; 127].

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


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

Да, действительно, эффект будет тот же.

Вот распределение результатов для руды и камня.

onqp1Vm.png

Дополнил тему.

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


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

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

 

В 06.01.2021 в 14:58, Doob сказал:

Нам известны все значения, кроме H и RANDOM_BYTE, что нам это дает?
Мы можем предположить значение H и обратить всю формулу.
(R - H) / D / N * 128 * 33
Для стандартного конфига можно сократить до:
2112 * (R - H) / D

 

Я даже на этом шаге "завис" на минуту. Во что мы обращаем формулу? Что мы вычисляем в итоге, где знак равенства, черт побери? Методом исключения предположу, что мы вычисляем тот самый байт, который выдал нам ГСПЧ, а логика сокращения формулы была следующая:

 

RANDOM_BYTE = (R - H) / D / N * 128 * 33

RANDOM_BYTE = (R - H) / D / 2 * 128 * 33

RANDOM_BYTE = (R - H) / D * 2112

 

Ага, понятно! Теперь я провожу своё первое сканирование, передаю параметры желаемой плотности и расстояния, получаю заветный шумовой байт в дробном виде. И что мне с ним делать?

 

В 06.01.2021 в 14:58, Doob сказал:

А теперь тайное знание для тех, кто не понял самостоятельно.


Мы взяли желаемую плотность блока (например 3 для руды).
Подставили вместо H.
Получили случайное значение.
Можем легко определить, угадали ли плотность или нет.

 

Да как определить-то? Нет, я понял, что при написании статьи это было легко, но я тоже хочу определить! *злобно топаю ножкой*

Что мне даёт этот срандомленный байт? Ну 15, ну 120, а что дальше? Какова именно логика определения, угадали мы плотность или нет?

 

В 06.01.2021 в 14:58, Doob сказал:

Из-за дискретности случайных значений генератора, распределение вероятностей для блоков с разной плотностью не одинаковое.

cbdzk30.png

 

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

 

Далее идёт исходник. Ага, ну тут-то наверняка должна быть логика из предыдущего шага, по которой можно понять, "угадали мы плотность или нет":

local function magic(R, H, D)
  return 2112 * (R - H) / D % 1
end

result = magic(blocks[i_y], hardness, distance(x, i_y+elevation-1, z))
if blocks[i_y] ~= 0 and (result > 0.9998 or result < 0.00005) then
  ...

Берем результат сканирования, вычисляем на его основе RANDOM_BYTE, берём от него дробную часть... А зачем? Откуда взялись магические константы 0.9998 и 0.00005? Что означает это сравнение? Пытаюсь перевести на человеческий: "если RANDOM_BYTE является целым или почти целым числом, то плотность блока валидна".

 

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

 

8xis8Hv.png

 

Пытаюсь читать дальше...

 

В 06.01.2021 в 14:58, Doob сказал:

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

onqp1Vm.png

 

Якорь мне в гузно, опять зависимость *магии* от *магии*! В порядке бреда можно предположить, что ось абсцисс олицетворяет расстояние до блока, но что за что тогда отвечает ось ординат? Стопудова не за плотность блока. Вероятно, за RANDOM_BYTE? Да вроде не, нижняя точка графика в -300 и диапазон signed byte в [-127, 127) как бы намекают... или по какой-то причине график построен в ином масштабе. Ой, всё, я сдаюсь

 

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

 

Но если не трудно, то не мог бы ты прояснить момент хотя бы с логикой сравнения остатка от деления? Мне правда очень интересно

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


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

Хотелось, чтобы была загадка, да и в теме по ссылке больше информации, хотя многое довольно расплывчато.

 

10 часов назад, ECS сказал:

Я даже на этом шаге "завис" на минуту. Во что мы обращаем формулу? Что мы вычисляем в итоге, где знак равенства, черт побери?

Там вроде все ясно, нить рассуждений не прерывается, есть формула из кода, мы берем обратные функции и получаем формулу для извлечения неизвестного значения. Знак равенства пропал, т. к. это функция f(x) и мы не можем пока записать результат, иначе можно запутаться.

 

10 часов назад, ECS сказал:

Что мне даёт этот срандомленный байт? Ну 15, ну 120, а что дальше? Какова именно логика определения, угадали мы плотность или нет?

Далее по тексту это проясняется.

 

10 часов назад, ECS сказал:

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

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

 

10 часов назад, ECS сказал:

Берем результат сканирования, вычисляем на его основе RANDOM_BYTE, берём от него дробную часть... А зачем? Откуда взялись магические константы 0.9998 и 0.00005? Что означает это сравнение? Пытаюсь перевести на человеческий: "если RANDOM_BYTE является целым или почти целым числом, то плотность блока валидна".

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

 

10 часов назад, ECS сказал:

Да вроде не, нижняя точка графика в -300 и диапазон signed byte в [-127, 127) как бы намекают... или по какой-то причине график построен в ином масштабе.

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

 

10 часов назад, ECS сказал:

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

Ха, у меня еще со школы проблемы с усвоением материала, так как он везде подается в этой манере. Да и у кого таких проблем нет? Разве кому-то нравится математический язык?

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

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


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

Хотелось, чтобы была загадка

 

Спасибо, Алексейюрич, примерно в том же ключе вы меня отправили на пересдачу хд

 

5 часов назад, Doob сказал:

Там вроде все ясно, нить рассуждений не прерывается, есть формула из кода, мы берем обратные функции и получаем формулу для извлечения неизвестного значения. Знак равенства пропал, т. к. это функция f(x) и мы не можем пока записать результат, иначе можно запутаться.

 

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

 

А почему мы не можем записать результат? Именованные переменные ушли на забастовку? И давно ли знак равенства для функций не указывается? Я пропустил всемирный апокалипсис? А если это так, то почему он присутствовал здесь?

 

В 06.01.2021 в 14:58, Doob сказал:

R = G(RANDOM_BYTE / 128 / 33) * D * N + H

 

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

 

GPe5XX9.png

 

5 часов назад, Doob сказал:

Далее по тексту это проясняется

 

Спасибо, прям как в кирпиче по матанализу от Виноградовой: ща пойду почитаю следующую главу, не дочитав текущую. Гениальная многоходовочка от автора, ставлю 5/5 на литресе!

 

5 часов назад, Doob сказал:

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

 

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

 

5 часов назад, Doob сказал:

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

 

Фух, хоть это я угадал. А каким образом читатель должен допереть, не имея графиков и исходных данных о геосканировании, что максимальная близость RANDOM_BYTE к целому числу означает "угаданность" плотности? Гипотетически это действительно будет так, и в идеальном случае, когда геосканер вернул результат без шума, RANDOM_BYTE будет целым, т.к. переменные из формулы оказали на результат минимальное влияние. Но чёрт возьми, это ж просто предположение, а вдруг нет! *кусаю ногти*

 

5 часов назад, Doob сказал:

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

 

Ага, значит, догадка была близка к истине. Хотя это было вовсе не очевидно, т.к. диапазон signed byte в [-127; 127) противоречит этой очевидности. Да, глянув на код и условие по отсечению данных, у меня возникла мысль, что возвращаемое значение функции magic() может находиться в ином диапазоне, но, блин, даже в коде "ошибочный" диапазон просто игнорируется. А на графике - нет. Магия! Неужели рисовалка графиков не имеет фичи именования координатных осей для упрощения понимания?

 

5 часов назад, Doob сказал:

Ха, у меня еще со школы проблемы с усвоением материала, так как он везде подается в этой манере. Да и у кого таких проблем нет? Разве кому-то нравится математический язык?

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

 

О-о-о, на сократщину можно такую дискуссию развернуть, что счетчик PK БД форума выйдет за допустимые пределы. С методикой и подходом к самостоятельному обучению и личной интерпретации я полностью согласен, однако в данной ситуации мы имеем уже завершённый материал. Материал интересный, на актуальную тему, с хорошей науч. базой и даже наличием исследований с практическим опытом - это ж золотая жила знаний, пускай и в кубаче! Но... исходные данные только у автора. Упс.

 

Я, может быть, очень хочу "пощупать руками и понять своим языком", открыть консольку, подставить исходники в формулу, рассчитать, порадоваться, что результат изящно сходится. А не могу. Ну то есть да, конечно, я могу запустить кубач, воссоздать исследовательскую среду, понатыкать руд, поставить пайтон и матплотлиб, построить график - но чёрт побери, за меня это уже сделали! Зачем тратить столько времени на подтверждение рабочей теории? Лучше потрачу время на срач))0

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


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

Кому нужны такие подробные объяснения? Идея лежит на поверхности, ухватившись за нее, можно легко разобраться своим ходом.

 

Это ведь прикладная задача. Берешь код, вставляешь в свою прогу и пользуешься.

 

716f682901a8f1cc8a3aae12be528ac5.jpg

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


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

Кому нужны такие подробные объяснения? Идея лежит на поверхности, ухватившись за нее, можно легко разобраться своим ходом

 

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

 

Но за исследование ищо раз спасибо, это было занятно!

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


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

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

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

 

А так, да: урок мутноватый, его поймут только подготовленные умы. Я стараюсь писать ясно и просто, но не продолжил серию. Зато взялся @Doob. Если он не захочет переписать этот урок, эту эстафету может принять кто-то другой, чтобы описать методику понятным языком. Сам я надеюсь вернуться к этой теме, но не в ближайшее время.

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


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

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

 

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


Поэтому, собсна, и спросил про логику расчётов именно тут, в разделе "уроки", а не в "беседке". Есть урок - есть вопрос. Мало ли вы там тупиковых ветвей в исследованиях наплодили, но уж тут-то наверняка должна быть квинтэссенция объективной истины! Мне показалось, что так будет быстрее... 

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


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

Чтобы узнать плотность всех блоков на 100% требуется затратить примерно на 30% больше энергии и времени из-за дополнительных сканирований. (19% если немного усложнить алгоритм)

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

 

Вот списки расстояний с коллизиями руды и окружающей породы:

Скрытый текст

stone
16
18
22
24
30.757112998459
32
32.326459750489
33
36
36.837480912788
44
48

 

dirt

22

24

30

32
33

40

44

48
 

gravel

31.288975694324

34.957116585897
44.463468150831

 

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

 

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

Поэтому лучше потратить энергию на сканирование и тогда абсолютная точность будет достигнута для объема 65x65x63.

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


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

Чтобы узнать плотность всех блоков на 100% требуется затратить примерно на 30% больше энергии и времени из-за дополнительных сканирований.

Чтобы узнать плотность на 100%, нужно бесконечно много сканов))

Потому что сканы могут постоянно попадать в коллизию.

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


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

Нет, коллизии возникают на фиксированных расстояниях, если сместить геосканер в любую сторону, те расстояния покрываются областью где плотность определяется на 100% без коллизий.

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


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

Неочевидная идея, однако, перемещать робота)

А есть список перемещений в виде (dx,dy,dz), на которых могут возникать коллизии?

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


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

Их очень много, можно визуализировать при помощи дебаг платы таким скриптом:

local l_x, l_y, l_z = 1427, 44, 816 -- координаты центральной точки
local setblock, block = 'setblock ', ' minecraft:redstone_block'

local run = require('component').debug.runCommand
local sqrt = math.sqrt

local collision = {
  [16] = true,
  [18] = true,
  [22] = true,
  [24] = true,
  [30.757112998459] = true,
  [32] = true,
  [32.326459750489] = true,
  [33] = true,
  [36] = true,
  [36.837480912788] = true,
  [44] = true,
  [48] = true
}

for x = 0, 32 do
  for z = 0, x do
    for y = 0, x do
      if collision[sqrt(x^2 + y^2 + z^2)] then
        for xm = -1, 1, 2 do
          for ym = -1, 1, 2 do
            for zm = -1, 1, 2 do
              run(setblock .. l_x + x*xm .. ' ' .. l_y + y*ym .. ' ' .. l_z + z*zm .. block)
              run(setblock .. l_x + z*xm .. ' ' .. l_y + y*ym .. ' ' .. l_z + x*zm .. block)
              run(setblock .. l_x + y*xm .. ' ' .. l_y + x*ym .. ' ' .. l_z + z*zm .. block)
            end
          end
        end
      end
    end
  end
end
Скрытый текст

ZztiAt5.png

G21rmDn.png

 

Для разных расстояний разные вероятности, в среднем при однократном сканировании бывает около 30% ошибок от общего числа, это ~216 блоков на весь объем.

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


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

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

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

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

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

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

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

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

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


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