Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357

Пишу программу составления школьных расписаний на Лисп, уже на первом этапе возникли трудности

11.08.2021, 00:15. Показов 4921. Ответов 36

Студворк — интернет-сервис помощи студентам
Здравствуйте, пишу в качестве выпускного проекта программу составления расписаний на Лиспе, при этом испытываю большие сложности с самого начала, в голове практически пусто.
Начать решил с функции проверки расписания на корректность, при этом само расписание представил так:
Lisp
1
2
3
4
5
'((1 "A" (("математика"  "Мария Ивановна" 210) ("русский"     "Мария Ивановна" 210))
         (("физкультура" "Иван Иванович"  102) ("литература"  "Румиль"         210)))
 
  (2 "А" (("литература"  "Румиль"         211) ("физкультура" "Иван Иванович"  102))
         (("математика"  "Мария Ивановна" 211) ("русский"     "Мария Ивановна" 211))))
В корневом списке содержатся классы. Каждый класс - это тоже список. Первым в нем идет номер класса, за ним буква. дальше подряд идут дни.
Каждый день - тоже список. И содержит он ряд описаний уроков. Описание урока (какая неожиданность) - и на этот раз список. Первым в нем идет строка с названием предмета, дальше имя учителя и в конце номер аудитории.
В каждом классе дни начинаются с одного и того-же, и уроки каждый день с одного и того-же. Вся эта мишура списков - суть есть таблица, и для проверки нужно проверить, не ведут ли учителя уроки у разных классов или не занят ли один кабинет сразу несколькими классами.
С чего мне начать? Если бы у всех классов каждый день было одно и тоже количество уроков, было бы проще (тут напрашивается мысль про выравнивание).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.08.2021, 00:15
Ответы с готовыми решениями:

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

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

Возникли трудности(

36
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
15.08.2021, 15:47  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от helter Посмотреть сообщение
К счастью, я не знаю, что такое методические дни.
Это дни, выделяемые учителям, когда они не ведут уроков, а заняты бумажной работой и подготовкой к занятиям.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
15.08.2021, 16:10
А, ну это укладывается в мой "фреймворк": с точки зрения методических дней, добавленный урок ломает расписание, если после добавления у учителя, ведущего этот урок, заняты все дни.
0
 Аватар для chessman2
164 / 144 / 10
Регистрация: 21.10.2012
Сообщений: 503
16.08.2021, 18:28
Цитата Сообщение от helter Посмотреть сообщение
Пусть, например, 20 классов - это 30!^20 комбинаций.
Это теоретическая сложность. На практике все будет проще.
Учитывая, что с 1 по 3 класс все предметы ведет классный руководитель.
В 4-5 классе не физики и химии.
Так же нужно учитывать приоритет следования предметов от сложных до не очень.
Сначала математика, в конце физкультура.
Все это можно реализовать в правилах на списках.

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

Сложность задачи даже на курсовую работу не тянет, ИМХО.
0
Заблокирован
16.08.2021, 23:45
Цитата Сообщение от chessman2 Посмотреть сообщение
Сложность задачи даже на курсовую работу не тянет, ИМХО.

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

Лично я вижу сразу проблемы от которых бросает в дрожь)
Первая - это множественность критериев проверки, при условии, что если какой-то критерий не удовлетворяет необходимым условиям, то всё расписание придётся переделывать.
Втрое - это сложность самого мероприятия. Допустим, вы проверили 7 уроков и у вас всё сходиться, но на восьмом возникает ошибка, что ломает всё расписание. Вам нужно переделать расписание, а для этого вам нужно опять начать проверку с нуля, при этом нужно как-то хранить данные о тех событиях, которые привели к ошибке и учитывать их в последующем процессе изменении расписания.
Если для вас это так просто, то опишите, пожалуйста, хотя бы приблизительный алгоритм решения. Мне будет интересно почитать.
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.08.2021, 00:37
Цитата Сообщение от sodda Посмотреть сообщение
Первая - это множественность критериев проверки, при условии, что если какой-то критерий не удовлетворяет необходимым условиям, то всё расписание придётся переделывать.
Что в этом сложного? Соедините их and-ом, будет один критерий.

Цитата Сообщение от sodda Посмотреть сообщение
а для этого вам нужно опять начать проверку с нуля
Необязательно с нуля. Это же поиск в графе. Но мне кажется, граф всё равно необъятный. Нужны хитрые алгоритмы.
0
 Аватар для chessman2
164 / 144 / 10
Регистрация: 21.10.2012
Сообщений: 503
17.08.2021, 10:33
Цитата Сообщение от sodda Посмотреть сообщение
хотя бы приблизительный алгоритм решения.
Обсуждалось.
Не уверен что, то нужно, где-то близко. Надо подумать.
Задача о рюкзаке

Это интересно
https://habr.com/ru/post/222577/
0
Заблокирован
17.08.2021, 10:51
Цитата Сообщение от helter Посмотреть сообщение
Что в этом сложного? Соедините их and-ом, будет один критерий
Только в этом нет никакого смысла. Каждая проверка должна к чему-то приводить, к каким-то перестановкам в расписании.
Цитата Сообщение от helter Посмотреть сообщение
Необязательно с нуля. Это же поиск в графе. Но мне кажется, граф всё равно необъятный. Нужны хитрые алгоритмы.
Поэтому результат каждой неудачной проверки где-то нужно хранить и как-то учитывать.

Ну вот смотрите. Мария Ивановна ведёт литературу во Вторник в 302 аудитории третьей парой, а Николай Петрович ведёт в это же время там физику. Нужно переместить куда-то один урок, при этом всём расписание может сдвигаться и то, что было правильно и верно ранее, теперь может сломаться.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.08.2021, 14:36
Цитата Сообщение от sodda Посмотреть сообщение
Ну вот смотрите. Мария Ивановна ведёт литературу во Вторник в 302 аудитории третьей парой, а Николай Петрович ведёт в это же время там физику. Нужно переместить куда-то один урок, при этом всём расписание может сдвигаться и то, что было правильно и верно ранее, теперь может сломаться.
В моём представлении расписание заполняется последовательно.

Пусть для 1 "А" расписание составлено, и во вторник в 302 аудитории третьей парой у него стоит литература. В процессе - составление расписания для 1 "Б". Очередная незаполненная клетка - как раз вторник. Очередной неиспользованный урок 1 "Б" - физика, аудитория 302. Заполняем клетку. Проверка расписания: универсальный валидатор говорит "не пойдёт", потому что ему валидатор аудиторий сказал "не пойдёт". Откатываем физику, следующий неиспользованный урок - химия, аудитория 303. Проходит валидацию, заполняем клетку, двигаемся дальше.

Если же физика была последним неиспользованным уроком, мы в тупике. Тогда надо откатить предыдущий урок 1 "Б" и попробовать заменить его на очередной неиспользованный, т. е. на физику. И т. п. Я не знаю, зачем расписываю поиск в глубину, алгоритм стандартный. Вершинами графа являются корректные частичные расписания, стрелка из вершины А в вершину Б означает, что Б получено из А заполнением очередной клетки. Очевидно, не каждое корректное частичное расписание можно продолжить до корректного полного расписания.

По сравнению с рандомом поиск в глубину позволяет сразу отбрасывать кучи вариантов, в которых ошибку можно задетектить достаточно рано. Но остаётся всё равно очень много. Пусть не каждый раз приходится начинать сначала, но иногда надо будет откатывать и до начала, и вообще - много-много откатывать. Учитывая, что клеток в расписании сотни, и мерещатся факториалы. Поэтому единственная надежда - на чудо, что корректное расписание попадётся быстро. То есть если между некорретными расписаниями в принципе раскидано много корректных. Потому что я подозреваю, что оценка времени на обход всего графа (или там половины, или десятой части), как это обычно бывает, на порядки превосходит возраст Вселенной. Из эмоционального блога некоего Пиликова я понял, что автоматическое составление расписаний усеяно фейлами. Значит, чуда не происходит.

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

Вторая надежда - что в рамках учебной задачи расписание может быть игрушечным. Но это надо с "заказчиком" всё обговаривать.
1
Заблокирован
17.08.2021, 16:10
Цитата Сообщение от helter Посмотреть сообщение
Очевидно, не каждое корректное частичное расписание можно продолжить до корректного полного расписания.
Поэтому у меня была мысль о создании нескольких таблиц с расписанием и потом наложение их друг на друга и сравнение. На основе этого сравнения формирование итого расписания.

Цитата Сообщение от helter Посмотреть сообщение
Пусть для 1 "А" расписание составлено, и во вторник в 302 аудитории третьей парой у него стоит литература. В процессе - составление расписания для 1 "Б". Очередная незаполненная клетка - как раз вторник. Очередной неиспользованный урок 1 "Б" - физика, аудитория 302. Заполняем клетку. Проверка расписания: универсальный валидатор говорит "не пойдёт", потому что ему валидатор аудиторий сказал "не пойдёт".
Цитата Сообщение от helter Посмотреть сообщение
Откатываем физику, следующий неиспользованный урок - химия, аудитория 303
Откатываем физику, следующий неиспользованный урок - химия, аудитория 303. Проходит валидацию, заполняем клетку, двигаемся дальше.
Предположим у вас возникла ошибка с последним уроком в таблице расписаний и для него нет места, а произошло это из-за какого-то другого урока, стоящего в середине таблицы расписаний.

Цитата Сообщение от helter Посмотреть сообщение
Откатываем физику, следующий неиспользованный урок - химия, аудитория 303. Проходит валидацию, заполняем клетку, двигаемся дальше.
На самом деле это всё топорно очень и не соответствует критериям реального расписания. Допустим у вас есть три урока химии в неделю, но ваше автоматизированное расписание составляется так, что три эти урока получаются подряд, друг за другом, на неделе. Совпало так, что туда подходят по вашему валидатору именно эти уроки, ошибки не было. Но это с точки зрения реального расписания это неверно, так как для усвоения пройденного материала и подготовки к следующему уроку требуется время. То есть должны учитываться реальные критерии. В этом и сложность.
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.08.2021, 16:22
Цитата Сообщение от sodda Посмотреть сообщение
Предположим у вас возникла ошибка с последним уроком в таблице расписаний и для него нет места, а произошло это из-за какого-то другого урока, стоящего в середине таблицы расписаний.
Теоретически, расписание будет откатываться, пока не откатится до середины и не выстроится заново. Теоретически, поиск в глубину позволяет обойти весь граф. Значит, при наличии безграничного времени, расписание составится, и даже гораздо быстрее, чем рандомом.

Цитата Сообщение от sodda Посмотреть сообщение
Допустим у вас есть три урока химии в неделю, но ваше автоматизированное расписание составляется так, что три эти урока получаются подряд, друг за другом, на неделе. Совпало так, что туда подходят по вашему валидатору именно эти уроки, ошибки не было. Но это с точки зрения реального расписания это неверно, так как для усвоения пройденного материала и подготовки к следующему уроку требуется время. То есть должны учитываться реальные критерии.
Реальные критерии должны быть формализованы. Они формализуются валидаторами. Если нельзя иметь три одинаковых урока подряд, есть валидатор, который говорит: "три и более уроков подряд" - не проходит. Общая валидация имеет вид

расписание валидно, если:
- в одновременно несколько уроков не проходят в одном кабинете
- одновременно учитель не ведёт несколько уроков
- в один день (или не в один день) три одинаковых урока не могут идти подряд
и ещё что угодно.

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

Для тупых алгоритмов типа поиска в глубину, которые ничего не знают о валидаторах, число валидаторов несущественно. Хардкодить их не надо. Грубо говоря, собрать любые нужные валидаторы в один список и проверять (loop for validator in *validators* always (valid-partial-timetable-p partial-timetable validator). Я это называю не "топорно", а "гибко".
0
Заблокирован
17.08.2021, 16:43
Цитата Сообщение от helter Посмотреть сообщение
Теоретически, поиск в глубину позволяет обойти весь граф. Значит, при наличии безграничного времени, расписание составится, и даже гораздо быстрее, чем рандомом.
Теоритически при исправлении одной ошибки может вылезти другая в другом месте. Вы воткнули урок из середины в другое место, но теперь урок из начала списка не проходит по каким-то критериям.
Цитата Сообщение от helter Посмотреть сообщение
Пока я не вижу ничего, кроме логических функций. Они могут иметь любую природу. Можно, например, персональные предпочтения директора туда добавить.
Делайте. Я буду только рад, если у вас получится)
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.08.2021, 17:00
Цитата Сообщение от sodda Посмотреть сообщение
Теоритически при исправлении одной ошибки может вылезти другая в другом месте. Вы воткнули урок из середины в другое место, но теперь урок из начала списка не проходит по каким-то критериям.
Один урок не может не проходить. Не проходить, то есть быть невалидным, может быть только частичное расписание. Валидатор принимает частичное расписание целиком.

Конечно, может быть, что придётся откатиться назад, а потом ещё назад, и ещё, и до самого корня - пустого расписания, и неоднократно. И что? Вы пытаетесь меня убедить, что поиск в глубину отменили?

Цитата Сообщение от sodda Посмотреть сообщение
Делайте. Я буду только рад, если у вас получится)
Мне, к счастью, ничего делать не требуется. Я максимум могу рассказать, как организовать поиск по графу, не утонув в кададрах. А работать, по моим ощущениям, будет в двух случаях: игрушечное расписание или чудо. Упирается в размер графа частичных расписаний.
0
Заблокирован
17.08.2021, 17:04
Цитата Сообщение от helter Посмотреть сообщение
Конечно, может быть, что придётся откатиться назад, а потом ещё назад, и ещё, и до самого корня - пустого расписания, и неоднократно. И что? Вы пытаетесь меня убедить, что поиск в глубину отменили?
Ничего не пытаюсь. Просто говорю, что задача непростая, вот и всё.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.08.2021, 17:28
Не могу не согласиться.

То есть как обычно: простой и неэффективный алгоритм написать легко, но он (скорее всего) не впишется в приемлемые ограничения по времени. А сложный - поди придумай. С другой стороны, это и не наша задача. Это пускай в университетах голову ломают.
0
 Аватар для chessman2
164 / 144 / 10
Регистрация: 21.10.2012
Сообщений: 503
17.08.2021, 20:49
Цитата Сообщение от helter Посмотреть сообщение
то и не наша задача. Это пускай в университетах голову ломают.
Цитата Сообщение от helter Посмотреть сообщение
это и не наша задача.
Как раз задача наша.
Согласен - хороший алгоритм - победит.
Делал числа фибоначи - питон обоганал Си в несколько раз.
Си - рекурсися ---- питон - умножение матриц. Алгоритм.
0
 Аватар для vlisp
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,442
22.08.2021, 21:48
Цитата Сообщение от chessman2 Посмотреть сообщение
Это теоретическая сложность. На практике все будет проще.
вот как бы не так

Добавлено через 3 минуты
Цитата Сообщение от Regrin1 Посмотреть сообщение
Первым в нем идет номер класса, за ним буква
а ты их складывать собрался? вычитать умножать извлекать логарифмы? какой стыд
0
Автор канал по Лиспу
 Аватар для Regrin1
25 / 23 / 2
Регистрация: 10.08.2021
Сообщений: 357
22.08.2021, 23:43  [ТС]
Цитата Сообщение от vlisp Посмотреть сообщение
а ты их складывать собрался? вычитать умножать извлекать логарифмы? какой стыд
Мне нужно контролировать номер класса для учета нагрузки!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.08.2021, 23:43

Возникли трудности с задачей
Имеется задача : Родители Пети Торопыжкина затеяли ремонт. Однажды его послали в строительный магазин, чтобы купить c кг цементной смеси....

Возникли трудности с функцией!
Нужно написать программу с помощью рекурсивной функции! У не могу написать рекурсивную функцию к задаче кто может помогите: ...

Возникли трудности с задачками
Доброго времени суток! Помогите пожалуйста решить следующие задачки.

JDK возникли трудности
Добрый день! Создаю сервер онлайн игры напиcанный на Java. Вот собственно сам гайд:...

Возникли трудности с подключением к БД - 2
Здравствуйте. Необходимо подключиться к БД через MATLAB 2017 программно. Делаю так: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru