Решать задачу за меня никого не прошу, прошу помочь ;) и вообще пора переходить на обсуждени есложных программ Программа не из легких, мне кажется.
Итак, есть список преподавателей (1 препод. ведет 1 предмет), классов. Условия: есть максимальное кол-во часов в которое учитель может работать с таким-то классом в неделю, ограничения по дням недели (может работать только во вторник, или ,например, все дни кроме среды), кол-во часов которое он может работать в одном классе в день (пусть например, 2).
ну там конечно еще условий дофига, но я хотел бы чтобы мне сначала посоветовали, как делать это. Жду идей
Хм, програмно я это не делал ) но хочу попробовать... что получиться - дам
Это я делал тока на Аксесе )
1организовать ввод данных с файла
2использовать массив записей
3для дней недели использовать множество,
4начиная с 1-го дня недели проверяешь всех преподов(если два препода могут работать в этот день выбираешь того который может только вэтот день) по каждому предмету
Млин определённо чё-то забыл....
Допустим, ввод данных можно опустить, пусть будет константа.
А как задавать сами условия?
А сколько и какие у тебя условия ?
Думается, для каждого случая по-разному...
В основном при помощи циклов и процедур
У тебя ,наверно, процедура будет похожа на сортировку массива -
пока не будут выполняться все условия она не должна быть закончена..
Условия такие:
- по 1-2 урока в день в одном классе (в смысле в данном классе, а не всего 2 урока в день у учителя)
- по 2 урока в день в одном классе
- по 1-2 урока в день в одном классе с разрывом в 1 день (то есть чтобы предмет шел в данном не подряд два дня)
Я и хотел делать с помощью массива (array[days,subjects,1..6], число уроков 6) . Только как задавать сами условия, проверку и как сортировать? Мне бы алгоритм узнать.
Fire_Rage
18.03.2004 10:52
Знаешь, есть такая штука, называется "генетический алгоритм", мне советовали написать с помощью него, правда не знаю, можно ли с его помощью на паскале писать. Вообще мне сказали так напиши все условия для себя и придумай, как их отсеивать, вот и думаю.Помоги мне, пришли на e-mail условия, которые пока надумал, будем вместе писать.
Знаешь, если бы я знал как хотя бы условия записывать... я вообще не секу в переводе мыслей на компьютерный язык. А как их отсеивать это вообще...
А местные мастера не хотят помогать
писать много, блин, время жалеют
Fire_Rage
25.03.2004 11:15
Да мне не нужно, чтобы ты переводил условия сразу на язык, просто напиши их(на русском языке),а думать потом будем.
trminator
25.03.2004 11:18
Возможно, пройдет метод на динамическом программировании. Будет рекурсивная процедура примерно такого плана:
Код
procedure make_shed;
if возможно добавить предмет (есть время в учебном плане) then
for i := 1 to n do
if i-й учитель свободен в первый же незанятый день,
begin
добавить этого учителя (точнее, его предмет)
make_shed;
убрать этого учителя, чтобы попытаться сунуть другого
end;
else получено расписание -- выйти из всех этих процедур
end;
Фактически тут идет полный перебор всех вариантов =(
А массив с расписанием, может, сделать плоским? (то есть примерно как расписание, которое в школе висит -- двумерная матрица, а не трехмерная =) )
Fire_Rage Если ты не заметил, то посмотри пару постингов выше, я писал (как раз над тем постом, где ты говоришь что не писал).
trminator размерность идет так: по дням недели, по классам, по урокам (сверху я что-то не так написал), то есть 3х мерный получается; не я понимаю, что он на "2х мерной" бумаге как 2х мерный выглядит
А ты можешь написать примерчик, с несколькими условиями? чтобы не по-русски после IF'ов
trminator
31.03.2004 0:19
Хмм... на стенке в школе расписание вроде не трехмерное висит +) Вот мне и показалось, что двумерное удобнее (прообразом таблицы может служить как раз школьное расписание).
А что касается условий... Сколько часов в неделю может работать учитель -- свойство самого учителя (если будет запись с инфой об учителе, то это -- одно из полей такой записи). А по остальным условиям надо еще репу почесать +)
Да, действительно, трёхмерная получается... Так и создать трёхмерный массив [1..DayOfWeek, 1..Class,1..MaxLessons] of word. Потом заполнить его номерами учителей - это и будет расписание. В процедуру make_shed передавать его по значению - тогда не придётся "убирать этого учителя, чтобы сунуть другого".
Если расписание составлено - выводить его прямо из процедуры. Передавать в процедуру x, y, z, изначально равные 1 - это координаты текущей заполняемой ячейки. Перед рекурсивном вызовом make_shed делать inc(z) если z<MaxLessons else begin z:=1 ; inc(y); и т.д. Если x=DayOfWeek то расписание составлено.
Вообще, предложенный алгоритм make_shed мне понравился: прост и ясен, как всё гениальное. Сразу ясна становится структура проги, а оптимизировать детали можно по ходу написания.
trminator
31.03.2004 23:38
По-моему, все-таки нужно постараться передать не по значению... неслабый массив-то передавать... а детали обдумать надо, а времени как обычно нет...
Fire_Rage
1.04.2004 10:40
Цитата(Guest @ 30.03.04 13:12)
Fire_Rage
Если ты не заметил, то посмотри пару постингов выше, я писал (как раз над тем постом, где ты говоришь что не писал).
Во-первых, ты написал не все условия(к примеру в тот-то день неможет данный учитель и т.д. и т.п.)
Во-вторых будет 3-хмерный массив-класс, дни недели, и сами уроки на этот денб.
в-третих, я собираюсь делать по генетическому алгоритму.
Цитата
По-моему, все-таки нужно постараться передать не по значению... неслабый массив-то передавать...
Да, действительно, я как-то не подумал... Ну, тогда x,y,z передавать по значению. (x,y,z) - как бы граница между заполненной и незаполненной частью массива, причём нам неважно, что незаполненная может быть забита всяким мусором.{может быть, она уже считалась заполненной в процессе рекурсивных вызовов, но мы этого "не помним"}
Chester, напиши все конкретные условия по учителям. Надо будет составить массив записей Teacher, заполнить поля, и уже тогда конкретно прописать кодом условие
if i-й учитель свободен в первый же незанятый день
trminator
4.04.2004 20:55
Можно заводить трезмерный массив не [1..DayOfWeek, 1..Class,1..MaxLessons], а [0..DayOfWeek, 0..Class,0..MaxLessons]. В нулевых элементах можно хранить, сколько дней/классов/уроков уже распланировано. Тогда откат -- просто уменьшение на единицу одного из этих чисел +)
А вообще задача еще интересует автора?
интересует
руки только что-то не доходят. условия уже пишу, половину накромсал (их не то чтобы очень много), остальное скоро допишу
сюда можно html таблицу вставить? у меня в виде таблички просто
Можно присоединить к ответу htm- файл, если меньше 50 K.
народ, всем привет
первый раз здесь. будующая профессия обязывает...может, здесь хоть программировать научусь.
а вообще то я надеюсь, что мне кто-нибудь поможет решить задачу, или хотя-бы идею какую подкинет, т.к я только начинаю в это все въезжать, и еще мало что сама понимаю. ближе к делу:
нужно построить модель неупорядоченной таблицы на паскале или фортране
может тебе лучше новую тему открыть?
ведь тут другую задачу обсуждают!
Цитата
будующая профессия обязывает...может, здесь хоть программировать научусь.
Это уже отлично. Ибо частенько сюда заглядывают челы, не разбирающиеся и не хотящие разобраться в программировании, чтоб им на халяву зачёт сделали.
imp, заведи новую тему. И расскажи конкретнее, что значит неупорядоченная таблица. Это двумерный массив случайных чисел или что-то другое?
Я вернулся. Как и обещал, с условием:
http://betasite.narod.ru/rasp.htmЖду помощи, указаний, советов. И можно просьбу, чуть побыстрее
я понимаю, сам провафлял и все такое... зато такую задачу интересную отрыл.
P.S. Это мне не на зачет. чтоб не подумали чего лишнего
BlackShadow
14.05.2004 0:33
Учитыая объём... БрутФорс - самое то!
trminator
15.05.2004 22:33
Полный перебор всех вариантов. Что-то похожее на то, что я предложил
Или даже то же самое...
Понятно. А ты можешь написать пример просчитывания какого-го либо условия?
А где все? Народу много вроде обсуждало
BlackShadow
21.05.2004 18:51
А обсуждать больше нечего
Не брутфорс же, в конце концов :D
Ну так напиши примерчкик условия какого-нибудь средней сложности. Я не могу сразу после массивов,строк понять как это реализуется.
BlackShadow
24.05.2004 15:29
Перебирает все 5-изначные числа и выводит на экран те, у которых сумма цифр равна 40.
Код
Const
K=40;
Var
s:String;
Function Next:Boolean;
Var
i:Integer;
Begin
For i:=5 DownTo 1 Do
If s[i]<'9' Then
Begin
Inc(s[i]);
Break
End
Else
If i = 1 Then
Begin
Next:=False;
Break
End
Else
s[i]:='0'
End;
Function Test:Boolean;
Var
i,n:Integer;
Begin
n:=0;
For i:=1 To 5 Do
Inc(n,Byte(s[i])-Byte('0'));
Test:=n=K
End;
Begin
s:='00000';
While Next Do
If Test Then
WriteLn(s)
End.
Или приблизительно так...
ТОВарищи, понимаю, что обсуждалась эта тема давно, но....
Если кого-то ещё интересует решение этой задачи, особенно с помощью генетического алгоритма, хотелось бы скооперироваться и обсудить некоторые вопросы...
Так здесь и будем обсуждать.
Мне кажется эта задача очень интересной.
Цитата(Oleg_Z @ 9.09.04 6:32)
Так здесь и будем обсуждать.
Мне кажется эта задача очень интересной.
Мне бы просто хотелось бы более интенсивно пообсуждать данный вопрос, скажем, по аське, благо диал-ап дюже дорогой, чтоб форум читать... А вас эта задача интересует, или вы просто модератор?
PS: Задачка действительно интересная, меня она интересует больше как возможная курсовая работа, нежели производственно. Хотелось бы пообщаться с человеком реально составляющим эти расписания, чтоб узнать нужды и требования.
PS2: Сам я просто программер.
Я конечно модератор, но задача меня эта интересует из-за того, что при ее решении можно использовать генетический алгоритм. Собственно я им интересуюсь. Oleg_Z
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.