Я пытаюсь написать небольшую программу на Go, которая будет генерировать еженедельное расписание для списка предметов. Мне пришла в голову следующая идея - создать расписание, которое будет генерировать несколько случайное расписание, которое не позволит одному и тому же предмету подойти дважды близко друг к другу.
- Он принимает целочисленное значение
length
, котороесколько дней должно длиться расписание. - Он принимает целочисленное значение
each
, представляющее собой количество предметов в каждом дне. - Само расписание представляется как
[][]string
, поэтомукаждый день представляет собой список предметов.
Идея заключается в следующем:
- Начните со списка предметов
- Перетасуйте список и разместите последовательнодо тех пор, пока список не станет пустым или мы не достигнем желаемого размера расписания.
- Немного перетасуем список, который мы только что использовали, меняя пары случайным образом, перемещаясь слева направо.
- Хотя расписание не имеет желаемой длины, перейдите к пункту 2.
Это код, который я использовал для реализации этого:
func timetable(list []string, length int, each int) [][]string {
table := [][]string{}
shuffled := shuffle(list)
chunks := chunk(shuffled, each)
for i := 0; i < len(chunks) && i < length; i++ {
table = append(table, chunks[i])
}
for len(table) < length {
// Somehow shuffling this list changes the table
fmt.Println("Before slightly shuffle =>", table)
shuffled = slightlyShuffle(shuffled)
fmt.Println("After slightly shuffle =>", table)
chunks = chunk(shuffled, each)
for i := 0; i < len(chunks); i++ {
table = append(table, chunks[i])
}
}
return table
}
shuffle
тасованиясписок usiАлгоритм Фишера-Йетса slightlyShuffle
перемещается слева направо и меняет значения рядом друг с другом в 2/3 времени. chunk
берет список и разбивает его накуски n
размера. Например:
chunk([]string{"a", "b", "c", "d", "e"}, 2) => ["a", "b"], ["c", "d"], ["e"]
Однако проблема возникает, когда мы слегка перетасовываем список. По какой-то причине легкое перетасовывание списка изменит переменную table
. Запуск вышеуказанной программы сгенерирует вывод:
Before slightly shuffle => [[Music Biology Chemistry] [Computing Maths English] [Physics]]
After slightly shuffle => [[Music Biology Computing] [Maths Chemistry Physics] [English]]
Как видите, несмотря на вызов slightlyShuffle
для переменной shuffled
, она меняет табличную переменную. Любая помощь в том, почему это или потенциальное решение проблемы будет принята с благодарностью.
Полная программа: https://play.golang.org/p/ayNxxnqSE3s