Перейти к содержимому
  • 0
artem211

Алгоритмирование "рудная жила"

Вопрос

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

 

Так вот, уже второй вечер пытаюсь измыслить новый тип геомайнера, использующего geolyzer.scan(), майнера под geolyzer.analyze()  - уже написал и отладил, пользуюсь, не выкладывал, т.к. народ не считает карьер "1 через 2" с использованием геолайзера оправданным. 

 

К делу: задумал разбивать указанный карьер(ширина,длинна) на кластеры(чанки) 20х20х20(вроде у геолайзера по горизонтали помех нет, потому границы по горизонтали можно так не ограничивать, но это потом решать буду).

 

В общем имеем заданный кластер объемом 20х20х20 блоков, просвеченный геолайзером на предмет руд, по сути имеем 3д массив(может проще будет обычный тейбл с 3 координатами в ячейке, опять же не суть) в данном объеме есть некоторое количество рудных жил, например 5, кататься в цикле к каждому блоку в слое - не рационально вообще никак, будет бегать от одной жилы к другой.

 

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

 

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

 

Есть идеи? Может свой вариант?

 

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

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


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

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

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

 

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

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

 

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

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


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

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

 

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

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

 

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

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

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


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

artem211, У тебя выбора нет - учи графы. swg4you правильно сказал. Остальные алгоритмы будут по разному эффективны на разных конфигурациях.

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

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


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

 

 

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

Преподавали графы, но специальность не программерская.. Что я делаю не так? 

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


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

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

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


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

Как интересно получается. Робота начинает неконтролируемо глючить на расстоянии 1 чанка от игрока, мой начинал жаловаться, что ему не проехать, с 3-5 попытки ему удавалось пробить цифровую "паутину" и вернуться сообщить о проблемах. В первый раз в локальных координатах (25, -25, 26), второй раз на координатах(уже именно точечно туда посылал оставаясь на месте) (25, 0, 17), каждый раз проверяя все блоки с той стороны где ему "мерещится" преграда, сообщал что это воздух. Наша "матрица" оказывается глючит, видимо происки Нео.... Установка чанклоадера и его включение гарантированно решают проблему, видимо алекс сделал прогрузку чанков вокруг игрока, как вокруг ЧЛ - 9 чанков 3х3 с игроком в центральном. Будьте осторожны при написании прог для роботов, в остальном реализация "соседского алгоритма" для геокопалки себя оправдала на 1000%, реализовать не особо сложно, производительность огромная. Вот скрины, один про ошибки робота 240620152a33e066da.png,

второй - сколько накопано в зоне 32х32х64 за 1 раз 240620157c50d96cf4.png

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

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


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

Ищи баг в программе :)

Никаких препятствий там нет и быть не может. Скорее всего, твой робот уперся в задницу криперу. Ее он, кстати, может принять за воздух=)

 

Игрок грузит 10 чанков радиус, это раз. Второе. даже если робот выгрузится вместе с чанком, произойдет просто останов программы и при подгрузке чанка программа продолжит выполнение. Это же азы=)

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


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

Ищи баг в программе :)

Никаких препятствий там нет и быть не может. Скорее всего, твой робот уперся в задницу криперу. Ее он, кстати, может принять за воздух=)

 

Игрок грузит 10 чанков радиус, это раз. Второе. даже если робот выгрузится вместе с чанком, произойдет просто останов программы и при подгрузке чанка программа продолжит выполнение. Это же азы=)

Я специально 15 раз тестил в сингле поведение робота со всеми мобами встречающимеся в овере - все умирали а робот проезжал это раз. Препятствий нет это верно, но что то заставляет robot.forward(), robot.up(), robot.down() возвращать FALSE, причем в рандомных точках, а не точно в одних и тех же, 3 раза посылал без чл - ошибки, 2 раза с чл - ошибок нет, еще раз без чл - ошибки. Поясни что думаешь Алекс? Прога безотказна.

function APIS.mForw(action,arg)
--шаг вперед с действием или безБ сквозь породу, координатные отметки
 local r = require("robot")
 local event = require("event")
 local try = 1
 local sides = require("sides")
 if action ~= nil then 
  action(arg)
 end
 while not r.forward() do
  r.swing()
  try = try + 1
  if try >= 15 then
   print("Препятствие у точки: x="..lc.x.." z="..lc.z.." y="..lc.y.." Направление Dr="..lc.dr)
   local _, det = require("robot").detect()
   print(det.." спереди.")
   print(require("component").geolyzer.analyze(3).name)
   APIS.back_to_the_future()
   return false  
  end
 end
 if try < 15 then
  way = way + 1
 if lc.dr==2 then
  lc.x = lc.x - 1
 elseif lc.dr==3 then
  lc.x = lc.x + 1
 elseif lc.dr==4 then
  lc.z = lc.z + 1
 elseif lc.dr==5 then
  lc.z = lc.z - 1
 end  
 --APIS.printState()
 return true
 end
end
Изменено пользователем artem211

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


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

Ищи баг. ЧЛ здесь не при чем. Он никак не влияет на то, что робот найдет блок или воздух. Тем более в радиусе 30 блоков от тебя ЧЛ нужен роботу, как рыбке зонтик. Ты грузишь 121 чанк сам.

 

Где-то ошибка в логике алгоритма.

Два раза без ЧЛ и два раза с ЧЛ не было ошибки, это еще ни о чем не говорит.

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


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

Ищи баг. ЧЛ здесь не при чем. Он никак не влияет на то, что робот найдет блок или воздух. Тем более в радиусе 30 блоков от тебя ЧЛ нужен роботу, как рыбке зонтик. Ты грузишь 121 чанк сам.

 

Где-то ошибка в логике алгоритма.

Два раза без ЧЛ и два раза с ЧЛ не было ошибки, это еще ни о чем не говорит.

См выше запостил логику алгоритма. Мб я совсем дурак? или это особая "уличная магия" ?

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


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

См выше запостил логику алгоритма. Мб я совсем дурак? или это особая "уличная магия" ?

Ты кроме geolyzer.analyze приставь robot.detect(). robot.detect() показывает всё,может это правда существо.

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


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

Ты кроме geolyzer.analyze приставь robot.detect(). robot.detect() показывает всё,может это правда существо.

Асум ты слепой что ли?

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


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

Асум ты слепой что ли?

Увидел=)

А в цикле swing не вариант?

Пока препятствие не пропадёт

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


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

Увидел=)

А в цикле swing не вариант?

Пока препятствие не пропадёт

 

 

Монстрик. Вот эта хреновина

local robot = require("robot")

attempt = 0
while not robot.forward() do
	robot.swing()
  	attempt = attempt + 1

  	if attempt>15 then 
  		return false, 'имя блока впереди: инфа с геолайзера'
  	end
end

и так бьет 15 раз, но робот у него проехать не может все равно и возвращает воздух.  Это может быть только существо :) (например, админ в инвизе :giggle: )

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


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

Монстрик. Вот эта хреновина

local robot = require("robot")

attempt = 0
while not robot.forward() do
	robot.swing()
  	attempt = attempt + 1

  	if attempt>15 then 
  		return false, 'имя блока впереди: инфа с геолайзера'
  	end
end

и так бьет 15 раз, но робот у него проехать не может все равно и возвращает воздух.  Это может быть только существо :) (например, админ в инвизе :giggle: )

А вдруг там зомби с 93 хп?Я такого ан новом ИТ видел=)Либо вайла шалит=)

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


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

Монстрик. Вот эта хреновина

local robot = require("robot")

attempt = 0
while not robot.forward() do
	robot.swing()
  	attempt = attempt + 1

  	if attempt>15 then 
  		return false, 'имя блока впереди: инфа с геолайзера'
  	end
end

и так бьет 15 раз, но робот у него проехать не может все равно и возвращает воздух.  Это может быть только существо :) (например, админ в инвизе :giggle: )

Если бы было существо - детект робота вернул бы не воздух, а энтити

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


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

Если бы было существо - детект робота вернул бы не воздух, а энтити

 

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

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


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

Попробуй взорвать возле себя крипера в майне. А потом запусти в место взрыва робота. Если начнёт выдавать ошибку, то это робот наткнулся у тебя на блок которого как-бы нет, но он - есть. После взрывов криперов остаются блоки, текстуры которых сервер почему-то не востанавливает. Вот может быть и вся, так называемая "магия". :unsure:

очередной гениал, считающий что программа робота запускается и работает на клиенте, а не на сервере?

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


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

очередной гениал, считающий что программа робота запускается и работает на клиенте, а не на сервере?

Ты прав. Забыл я об этом .

Каюсь. Впредь это не повторится.

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

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


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

Ищи баг в программе :)

Никаких препятствий там нет и быть не может. Скорее всего, твой робот уперся в задницу криперу. Ее он, кстати, может принять за воздух=)

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

 

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

 

Такой вот баг.

 

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

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


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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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


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