Ответы пользователя по тегу Алгоритмы
  • Как найти границы объекта на фото?

    twobomb
    @twobomb
    Границы, границы чего? По поводу машинного обучения не подскажу, это наверно нужно иметь большую базу объектов и позиций их границ для обучения.
    Ну если без машинного, то например как вариант по примеру фотошопа.
    1. Берем изоражение.
    2. Обесцвечиваем
    3. Самый важный и сложный этап, настраиваем правильно уровни.
    4. Находим границы черного и белого, но в идеале еще перед этим этапом придумать алгоритм растушевки хотя можно это сделать и уже следующим шагом исключив большие скопления точек.

    Я думаю можно даже несколько раз прогнать этот алгоритм, на разных уровнях(шаг3), для нахождения как можно большего количества границ и в итоге совместить в одну карту границ. Ну это сидеть, пробовать играть с параметрами...
    Ну это как один из первых же вариантом который пришёл в голову. Если нужен какой-то более ускоспециализированный поиск, это нужно посидеть подумать, потому-что "границы объекта" слишком абстрактно, объектов на фото может быть много и чьи границы искать неясно и что считать границами...
    638475e948731019030245.png

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

    twobomb
    @twobomb
    Не совсем не пойму, ну возможно необходимо уменьшить шаг приращения attemp что даст более плавные и долгие значения.
    А если вам нужно чтобы сначала все быстро шло, а конце более плавно. То в начале делаете шаг большим, а чем ближе к конце тем шаг меньше. Таким образом вначале быстро пойдет набор, а в дальнешем перерастет в более медленный и плавный, в зависимости от того насколько сильно поменяете шаг приращения.
    Можно шаг приращение каждый умножать на такую херню
    (1 - last_delay/max_delay)
    last_delay это предыдущая задержка, первый шагом её можно сделать равно нулю
    Но всеравно в таком случае чем ближе к концу тем оно сильнее стремится к бесконечности и крч есть вариант что оно никогда не закончится поэтому нужно немного доработать например так
    (0.2 + (1 - last_delay/max_delay) * 0.8)
    Как это применять? Шаг приращения вашего attemp умножайте на эту хрень
    Например у вас step = 0.5
    Значит каждую итерация
    step = 0.5 * (0.2 + (1 - last_delay/max_delay) * 0.8)
    Крч я не матетематик, думайте пробуйте
    Ответ написан
    Комментировать
  • Самый быстрый алгоритм для определения, находится ли точка внутри области?

    twobomb
    @twobomb
    Игра очень серьезная? Я в том плане что
    клиенту, естественно, верить нельзя

    Подумайте кому-то это вообще нахрен нужно будет, лазить разбираться в вашем коде и подменять запросы, я думаю никому, ну допустим всё серьезно.
    Я бы начал с того что именно взял первый попавшийся алгоритм и реализовал бы его, в реале пока вы дождесь какого либо толкового ответа вы могли бы уже реализовать все алгоритмы и протестить.
    Всего скорее скорости работы первого попавшегося алгоритма должно хватить, если у вас не сумасшедшая нагрузка и не нужно выполнять тысячи таких проверок ежесекундно.
    Крч проверьте на первом попавшемся алгоритме и если не хватит скорости тогда приходите будем думать как оптимизировать.
    P.S. Сделал "тестовый стенд" на js на канве

    На моей машине 100тысяч полигонов проверяются на 0.4мс
    Ответ написан
    6 комментариев
  • Как реализовать алгоритм преследования игрока с учётом препятствий-полигонов?

    twobomb
    @twobomb
    Делите поле на клетки, это лучше всего, и подумайте важно ли вам найти именно кратчайший путь или можно через A* с эвристическим алгоритмом.
    Ну и нужно думать оптимизацию если скорость будет не достаточной, чем больше размер клетки тем быстрее будет работать алгоритм, но тем меньше точность, не следует делать размер клеток больше размеров бота(он просто может не пролезть в маленькие щели). Не нужно искать путь на каждом шаге, делайте это реже. Возможно стоит искать путь не для каждого бота отдельно, а например берет бота и все кто от него в определенном радиусе и прямой видимости и ищем путь для всей этой группы. Ну сделайте сначала самым не оптимизированным способом, а дальше уже смотрите по скорости работы
    Ответ написан
  • Как восстановить окружность по массиву точек?

    twobomb
    @twobomb
    Ну как вариант, находим крайние точки: левую верхнюю, правую верхнюю, правую нижнюю и левую нижнюю.
    В итоге получаем прямоугольник и вписываем окружность в этот прямоугольник
    Ответ написан
  • Как перемешать массив одинаково для всех?

    twobomb
    @twobomb
    Псевдорандом
    let arr = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3];
    var seed = 12837823631;
    arr = arr.sort((a,b)=>rand() - rand());
    
    function rand(){
     	seed = (45 * seed + 21) % 67;
     	return seed/67;
    }
    Ответ написан
  • Предложение алгоритма решения тестового задания?

    twobomb
    @twobomb
    Особо не вчитывался ну судя по второму примеру так как д на я заменили, а значит мы не можем сразу менять на туже букву что есть с обоих словах. Значит если у нас ограничение равное алфавиту, то если мы подадим на вход
    "абвгдежзийклмнопрстуфхцчшщъыьэюя яюэьыъщшчцхфутсрпонмлкйизжедгвба"
    , то должен вернуться 0.
    P.S. Крч что-то набыдлокодил, вроде должно работать хотя далеко не самый оптимальный вариант. Ну также можно посмотреть именно вывод замен
    function result(line) {
      let arr = line.split(' ');
    
      let word1 = arr[0].split('');
      let word2 = arr[1].split('');
    
      if (word1.length != word2.length)
        return 0;
      var abc = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    
      for (var i = 0; i < word1.length; i++)
        if (!word1.every((e, j) => (e !== word1[i]) || (e == word1[i] && word2[j] == word2[i])))
          return 0;
    
      var i = 0;
      while (word1.join("") != word2.join("")) {
        if (word1[i] != word2[i]) {
          var repS = word2[i];
          if (word1.join("").indexOf(repS) != -1) {
            var tempAbc = abc.split("").filter(w => word1.join("").indexOf(w) == -1);
            if (tempAbc.length == 0)
              return 0;
            repS = tempAbc.pop();
          }
          word1 = word1.join("").replace(new RegExp(word1[i], "g"), repS).split("");
          console.log(word1)
    
        }
        i = (i + 1) % word1.length;
      }
    
      return 1;
    }
    Ответ написан
  • Случайный рандом с коэффициентом шанса, как сделать?

    twobomb
    @twobomb
    Можно типа такого
    double getRand(){//возвращает рандом от 0 до 1
        return (double)rand()/(double)RAND_MAX;
    }
    
    string ChanceItemDrop(){
            string itemsRandom[] = {
                "a", "b", "c", "d", "e"
            };
            
            float itemsChance[] = {
                .30f, .80f, .50f, .30f, .40f //шансы от 0 до 1,  1 -100% , 0 - 0%
            };
            int arrLen = sizeof(itemsChance)/sizeof(*itemsChance);
            double r;
            int arrSize;
            do{
                r = getRand();
                arrSize = 0;
                for(int i=0;i < arrLen;i++)
                    arrSize += r <= itemsChance[i]?1:0;
            }while(arrSize == 0);
            int* inxs= new int[arrSize];
            for(int i=0,p = 0;i < arrLen;i++)
                if(r <= itemsChance[i])
                    inxs[p++] = i;
            string result = itemsRandom[inxs[(int)floor(getRand()*arrSize)]];
            free(inxs);
            return result;
        }
    Ответ написан
    Комментировать
  • Как найти в строке первый уникальный символ без учёта регистра?

    twobomb
    @twobomb
    Ну если не переписывая код, а добавляя то так
    const firstNonRepeatingLetter = str => {
      let charMap = {};
      let strToLower = str.toLowerCase();
      for (let char of strToLower) {
        if (!charMap[char]) {
          charMap[char] = 1;
        } else {
          charMap[char]++;
        }
      }
    
      for (let char in charMap) {
        if (charMap[char] === 1) {
          var i = str.indexOf(char);
          if( i == -1)
            i = str.indexOf(char.toUpperCase())
          else if(str.indexOf(char.toUpperCase()) != -1 && str.indexOf(char.toUpperCase()) < i)
            i = str.indexOf(char.toUpperCase());
          return str.charAt(i);
        }
      }
      return '';
    };

    P.S. А вообще можно немного короче сделать
    function firstNonRepeatingLetter(str) {
      for(var i = 0 ; i < str.length;i++)
      if((str.substring(0,i)+str.substring(i+1)).indexOf(str.charAt(i).toLowerCase()) == -1 && (str.substring(0,i)+ str.substring(i+1)).indexOf(str.charAt(i).toUpperCase()) == -1)
          return str.charAt(i);
    	return '';
    }

    Хотя я уверен что можно еще короче
    Ответ написан
  • Как зациклить индекс массива?

    twobomb
    @twobomb
    int l = 6, n = 6;
    int f = n < 0? l - Math.abs(n%l):n%l;
    Ответ написан
    Комментировать