Рандомизация заказов в населении ГА не работает должным образом в Lua - PullRequest
3 голосов
/ 10 апреля 2019

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

Я отладил, чтобы локализовать проблему, и я 'Я уверен, что это происходит, но независимо от того, сколько раз я прохожу это, я не могу понять, почему.Есть ли что-то явно очевидное, чего мне не хватает?

Просто показывает, что таблицы создаются правильно и задано начальное значение рандомизатора.

order = {}
population = {}
math.randomseed(os.time())

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

function swap(tbl, i, j)
  tbl[i], tbl[j] = tbl[j], tbl[i]
end

function shuffle(tbl)
  for i = #tbl, 2, -1 do
    local j = math.random(#tbl)
    swap(tbl, i, j)
  end
  return tbl
end

Установка начального порядка

for i = 1, 10 do
  order[i] = i
end

Вероятно, это проблемная область

for i = 1, 10 do
  population[i] = order
  shuffle(population[i])
end

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

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

Любые идеи приветствуются, спасибо

1 Ответ

3 голосов
/ 10 апреля 2019

Проблема, с которой вы столкнулись, связана с тем, как lua ​​обрабатывает таблицы.

Вот пример:

tbl1 = {}
tbl2 = tbl1

tbl2[1] = 1

print(tbl1[1])

В результате tbl1[1] печатает 1. Это потому, что tbl2 и tbl1 - это одна и та же таблица только под разными именами.

Это то, что вы испытываете, когда делаете population[i] = order у вас есть только 1 таблица с 10 разными именами.

Чтобы избежать этого, вы можете скопировать таблицу. Вот ресурсы по копированию таблиц:

http://lua -users.org / вики / CopyTable

Самый быстрый способ настроить ваш код:

for i = 1, 10 do
  population[i] = {table.unpack(order)}
  shuffle(population[i])
end

Этот метод работает только с последовательными числовыми индексами

https://www.lua.org/manual/5.2/manual.html#pdf-table.unpack


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

function init_order()
    local order = {}

    for i = 1, 10 do
        order[i] = i
    end

    return order
end

затем вызовите функцию в вашем цикле for:

for i = 1, 10 do
  population[i] = init_order()
  shuffle(population[i])
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...