Как сдать экзамен по дискретной математике

Дискретная математика для первокурсников: опыт преподавателя

Время на прочтение
12 мин

Количество просмотров 122K

Сегодня у меня необычный текст, совершенно не связанный с машинным обучением (для новых читателей: этот текст – часть блога компании Surfingbird, в котором я в течение последнего года рассказывал о разных аппаратах машинного обучения в приложении к рекомендательным системам). В этом посте математической части практически не будет, а будет описание очень простой программки, которую я написал для своих студентов. Вряд ли кто-то узнает для себя из этого поста много содержательно нового, но мне кажется, что некоторую ценность представляет сама идея – многие люди просто не задумываются о том, что «и так можно». Итак…

Постановка задачи

В этом семестре у меня началась несколько непривычная деятельность: я преподаю дискретную математику для первокурсников в петербургском филиале Высшей Школы Экономики; преподаю я давно, но, кажется, раньше никогда у меня не было студентов младше четвёртого-пятого курса. По ссылке можно найти краткое содержание курса, да и то неполное (курс ещё идёт), но речь не совсем об этом.

Думаю, большинство обитателей хабра хотя бы приблизительно помнят, что такое «дискретная математика для первокурсников»: пропозициональная логика, конъюнктивные и дизъюнктивные нормальные формы, базисы булевских функций, бинарные отношения, частичные порядки… В общем, ничего концептуально сложного, но это всё вещи, которыми надо овладеть очень прочно, на них держится любое математическое образование, и необходимость осознанно задумываться о них быстро станет непозволительной роскошью. Поэтому нужно много практических примеров и заданий, чтобы «набить руку».

В качестве одной из форм отчётности я выбрал «большое домашнее задание»: несколько как раз таких практических примеров, которые надо решать. У такой формы много плюсов: студенты работают в удобном им темпе, я тоже проверять могу сколько нужно, всё в письменном виде происходит, что всегда удобно. Но есть и минусы; главный минус прост – трудно сделать и проверить пятьдесят вариантов на пятьдесят студентов (на потоке их примерно столько и есть). А если дать один вариант на большую группу, понятно, что на выходе получишь красиво переписанные правильные ответы, особенно учитывая, что в такой базовой дискретной математике «ход решения» нередко просто отсутствует (как построить СДНФ – ну как, посмотреть на таблицу истинности да записать…).

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

Шаблоны в .tex и boost::format

Базовая технология понятна – нужно сделать LaTeX-заготовку, в которую вставлять конкретные задания для каждого студента. Совершенно всё равно, на каком языке это делать, мне исторически привычнее писать небольшие программки на C++, поэтому я и тут буду его использовать. Самый простой способ сделать это в C++, который я знаю, – это boost::format: достаточно сделать заготовки с плейсхолдерами вроде %1%, %2%, и потом можно вставлять туда что угодно (у boost::format есть и другие возможности, но нам они сейчас не понадобятся).

Итак, делаем шаблоны. Сначала общий шаблон «абстрактного LaTeX-документа»:

Немножко TeX’а

documentclass[a4paper]{article}

usepackage[utf8]{inputenc}
usepackage{amsthm,amsmath,amsfonts, amssymb}
usepackage[english,russian]{babel}

usepackage{concrete}
usepackage{enumerate}
usepackage{euler}
usepackage{fullpage}

pagestyle{empty}
selectlanguage{russian}

begin{document}

selectlanguage{russian}

%1%

end{document}

Потом конкретный шаблон собственно задания – его мы будем подставлять вместо %1%. Я здесь, как и обещал, привожу минимальный пример. Мы будем генерировать только одну задачку: по заданной булевской формуле перевести её в несколько других форм.

Немножко TeX’а

Дискретная математика hfill %1%

весна $2013$ hfill группа %2%

section*{Домашнее задание}

begin{enumerate}
item Для формулы пропозициональной логики
$$ varphi = %3%: $$
begin{enumerate}[(i)]
	item постройте таблицу истинности;
	item переведите $varphi$ в совершенную конъюнктивную и совершенную дизъюнктивную нормальные формы;
	item выразите $varphi$ в виде полинома Жегалкина;
	item $[ast]$ выразите $varphi$ при помощи штриха Шеффера $xmid y = lnot(xland y)$.
end{enumerate}

pagebreak

И теперь нам просто нужно сгенерировать, чем заполнить %3% (вместо %1% и %2% будут подставляться имя студента и номер группы). Для этого нужно научиться генерировать формулы. Сразу предупреждаю, что я плохой программист, и код ниже наверняка напоминает спагетти – в принципе, он работает, если кто-нибудь посоветует изящный рефакторинг, скажу спасибо.

Сначала надо завести структуру, которая будет хранить разные связки и типы узлов в формуле; для нашего минимального примера это лишнее, но мне надо было сделать ещё задачку про формулы алгебры множеств (объединения, пересечения да симметрические разности), и код про деревья формул хотелось переиспользовать. Поэтому вот глобальный объект, хранящий основную информацию:

Код на C++

class Globals {
public:
    size_t TypesNo;
    size_t VarType;
    vector<string> TypesLatex;
    vector<size_t> TypesArity;
    boost::random::uniform_int_distribution<> RandomNodeType;
    boost::random::uniform_int_distribution<> RandomNodeNoVar;
    boost::random::uniform_int_distribution<> RandomNodeBinary;

    size_t VarsNo;
    vector<string> VarNames;
    boost::random::uniform_int_distribution<> RandomVarType;
    size_t current_varnum;

    Globals(size_t types_num, vector<string> types_latex, vector<size_t> types_arity, size_t var_num, vector<string> var_names) :
        TypesNo(types_num), VarType(types_num - 1), TypesLatex(types_latex), TypesArity(types_arity),
        RandomNodeType(0, types_num - 1), RandomNodeNoVar(0, types_num - 2), RandomNodeBinary(0, types_num - 3),
        VarsNo(var_num), VarNames(var_names), RandomVarType(0, var_num - 1), current_varnum(var_num - 1) {}

    size_t get_next_var() {
        current_varnum++;
        if (current_varnum == VarsNo) current_varnum = 0;
        return current_varnum;
    }
};

Globals GBoolean(7,
				{ "\land", "\lor", "\rightarrow", "\oplus", "\equiv", "\lnot", "\var" },
				{ 2, 2, 2, 2, 2, 1, 0 },
				4,
				{ "x", "y", "z", "t" });

Здесь мы создали «язык булевских формул», у которого пять бинарных связок (конъюнкция, дизъюнкция, импликация, XOR и эквивалентность) и одна унарная (отрицание). Седьмой тип узла – это переменная, у неё арность 0. В домашнем задании я ограничился формулами из четырёх переменных: меньше маловато, а больше становится слишком громоздко. Сюда же удобно записать генераторы случайного типа узла, случайной переменной, случайной бинарной связки (я пользовался распределениями из boost::random – опять же, очень удобно; хоть там и не так уж много чего реализовано, но нам сейчас много и не надо).

Такую структуру легко будет переиспользовать для формул алгебры множеств (это просто для сравнения, дальше GSet использоваться не будет):

Код на C++

Globals GSet(5,
			{ "\cap", "\cup", "\triangle", "\overline", "\var" },
			{ 2, 2, 2, 1, 0 },
			3,
			{ "A", "B", "C" });

Теперь создаём класс формулы. Булевская формула – это дерево, листьями которого служат переменные, а внутренними вершинами – логические связки. Мы хотим уметь генерировать формулы заданной глубины, поэтому в конструктор будем передавать, не пора ли сделать этот узел листом или, наоборот, обязательно бинарной связкой. Если нужно создать случайный узел, будем передавать тип g->TypesNo. Если узел оказался листом, ему нужно сгенерировать переменную (чтобы с большой вероятностью переменные попали все, мы просто берём их по кругу – формулы, конечно, не совсем случайные получаются, но это не страшно).

Код на C++

class BNode {
public:
    Globals *glob;
    size_t type;
    size_t varnum;
    BNode * left;
    BNode * right;

    BNode(Globals *g, size_t t, bool must_be_leaf = false, bool must_not_be_leaf = false, bool must_be_binary = false) : glob(g), type(t), left(NULL), right(NULL) {
        if (t == g->TypesNo) { // this means we want a random node
            type = must_be_leaf ? g->VarType
                : (must_be_binary ? g->RandomNodeBinary(gen)
                    : (must_not_be_leaf ? g->RandomNodeNoVar(gen)
                        : g->RandomNodeType(gen) ));
        }
        varnum = (type == g->VarType) ? g->get_next_var() : 0;
    }

    ~BNode() {
        if (left != NULL) delete left;
        if (right != NULL) delete right;
    }
};

Теперь начинаем заполнять класс BNode. Главное для нас – чтобы формула успешно печаталась в LaTeX:

Код на C++

    string TypeString() const {
        if (type == glob->VarType) return glob->VarNames[varnum];
        return glob->TypesLatex[type];
    }

    string ToString() const {
        if (glob->TypesArity[type] == 0) return TypeString();
        if (glob->TypesArity[type] == 1) return TypeString() + "{" + left->ToString() + "}";
        return "(" + left->ToString() + " " + TypeString() + " " + right->ToString() + ")";
    }

Кроме того, нужно будет уметь подсчитывать значение формулы на заданном наборе переменных:

Код на C++

    bool get_truth_value(const vector<bool> & vals) {
        switch(type) {
            case 0: return left->get_truth_value(vals) && right->get_truth_value(vals); break;
            case 1: return left->get_truth_value(vals) || right->get_truth_value(vals); break;
            case 2: return (!left->get_truth_value(vals)) || right->get_truth_value(vals); break;
            case 3: return left->get_truth_value(vals) != right->get_truth_value(vals); break;
            case 4: return left->get_truth_value(vals) == right->get_truth_value(vals); break;
            case 5: return !left->get_truth_value(vals); break;
            case 6: return vals[varnum]; break;
            default: return false; break;
        }
    }

Оставим пока класс BNode (мы к нему ещё вернёмся); теперь мы можем написать генератор случайной формулы. Будем генерировать формулу с заданной минимальной и максимальной глубиной (для поддержки минимальной глубины мы добавляли раньше в конструктор поле must_not_be_leaf):

Код на C++

BNode *generate_tree(Globals & g, size_t min_depth, size_t max_depth, bool must_be_binary = false) {
    if (max_depth == 0) return NULL;
    BNode *node = new BNode(&g, g.TypesNo, max_depth == 1, min_depth > 0, must_be_binary);
    if (g.TypesArity[node->type] == 1) {
        node->left = generate_tree(g, min_depth, max_depth, true);
    }
    if (g.TypesArity[node->type] == 2) {
        node->left = generate_tree(g, min_depth - 1, max_depth - 1);
        node->right = generate_tree(g, min_depth - 1, max_depth - 1);
    }
    return node;
}

Тут всё самоочевидно; единственное решение, которое я здесь принял – сделал унарные функции (т.е. отрицания) «бесплатными», не считающимися для глубины, иначе формулы получались бы слишком простыми. Кроме того, в булевской формуле логично запретить ставить два отрицания подряд, это бессмысленно; для этого нам и нужен был флаг must_be_binary в конструкторе.

И можно писать обработчик файла со списком студентов:

Код на C++

void process_one_student_file_boolean(string dir, string fname,
        boost::format & general_tmpl, boost::format & problem_tmpl, boost::format & solution_tmpl) {
    BNode *node_bool;

    ostringstream s;
    vector<string> students = readAllLinesFromFile(dir + "/" + fname + ".txt");
    cout << "tГруппа " << fname << endl;
    for (size_t i=0; i<students.size(); ++i) {
        if (students[i].size() == 0) continue; // empty line
        cout << "tt[ " << students[i] << " ]" << endl;
        node_bool = generate_tree(GBoolean, 2, 4);
        string group_string = "$" + fname + "$";
        s << problem_tmpl % students[i] % group_string
                          % node_bool->ToString();
        delete node_bool;
    }
    ofstream ofs(dir + "/" + fname + ".tex");
    ofs << general_tmpl % s.str() << endl;
    ofs.close();
}

а затем и main, который читает файлы с форматами и процессит файлы со списками студентов:

Код на C++

string students_dir = "2013";
vector<string> students_files = { "BoTR" };

int main(int argc, char *argv[]) {
    boost::format boolean_tpml( read_file_as_string("boolean_problem_minimal.tex") );
    boost::format general_tmpl( read_file_as_string("general_template.tex") );

    for (size_t i = 0; i < students_files.size(); ++i) {
        process_one_student_file_boolean(students_dir, students_files[i], general_tmpl, boolean_tpml);
    }

    return 0;
}

Но постойте, слышу я голос внимательного читателя. Будет же ерунда получаться – небось, добрая половина так сгенерированных случайных формул окажутся тривиальными! Что верно, то верно – про половину не знаю, но даже одна случайно сгенерированная формула вида varphi = x изрядно подмочит репутацию нашего метода. Давайте мы научимся это проверять. Для этого мы просто подсчитаем, сколько в формуле встречается связок и разных переменных, и потребуем, чтобы переменные встречались все, а связки – хотя бы две разные. Добавляем в BNode обход формулы:

Код на C++

    void depth_first(function<void (const BNode * n)> do_with_node) {
        do_with_node(this);
        if (left != NULL) left->depth_first(do_with_node);
        if (right != NULL) right->depth_first(do_with_node);
    }

и вписываем проверку формулы на разумность:

Код на C++

bool sanity_check(BNode * node) {
    vector<bool> vars_present(node->glob->VarsNo, false);
    vector<bool> connectors_present(node->glob->TypesNo, false);
    node->depth_first([&] (const BNode * n) {
        if (n->type == n->glob->VarType) {
            vars_present[ n->varnum ] = true;
        } else {
            connectors_present[ n->type ] = true;
        }
    });
    return all_of( vars_present.begin(), vars_present.end(), [](bool b) {return b;} ) &&
           (accumulate(connectors_present.begin(), connectors_present.end(), 0) > 2);
}

Можно ещё захотеть проверить, не является ли формула, скажем, всегда истинной, но я этого сознательно решил не делать – если сложная на вид формула вдруг окажется тождественно истинной, тем интереснее будет это задание для студента. А очевидные подформулы типа «x или не x» в нашем генераторе не будут получаться, потому что переменные перебираются по очереди, а не случайно.

Запуская получившуюся программку на файле со списком студентов, получаем .tex файл со вполне адекватно оформленными заданиями (вот пример pdf, скомпилированного из такого файла).

Решения

Скептически настроенный читатель на этом месте разумно возразит: ну конечно, ты можешь сгенерировать over 9000 разных заданий, но ведь ты замучаешься их потом проверять! И действительно, проверять у каждого студента таблицу истинности – занятие для очень сильных духом людей, к которым я себя не отношу. Поэтому нашу программку надо будет модифицировать так, чтобы она могла облегчить и процесс проверки. Совсем автоматизировать его не получится (студенты всё равно будут сдавать работы, написанные в свободном формате от руки), поэтому достаточно будет просто сделать заранее самую противную часть этой работы.

Заводим другой LaTeX-шаблон для документа с ответами:

LaTeX-шаблон документа с ответами

{footnotesize
subsection*{%1%, группа %2%}

Таблица истинности для формулы $%3%$:
$$ %4% $$

}
pagebreak 

Я, опять же, ограничусь минимальным примером – давайте просто выведем таблицу истинности. Для этого нужно пройтись по всем возможным значениям переменных, посчитать истинностное значение формулы и красиво оформить результат в TeX’е. Добавляем два метода в класс BNode:

Код на C++

    bool increment_counter(vector<bool> & v) {
        for (int i=v.size()-1; i>=0; --i) {
            if (!v[i]) {
                v[i] = true;
                for (size_t j=i+1; j<v.size(); ++j) v[j] = false;
                return true;
            }
        }
        return false;
    }

    string latex_truthtable() {
        ostringstream os;
        vector<bool> counter(glob->VarsNo, false);
        os << "\begin{array}{";
        for(size_t i=0; i<counter.size(); ++i) os << 'c';
        os << "|c}n";
        for(size_t i=0; i<counter.size(); ++i) os << glob->VarNames[i] << " & ";
        os << " \\\hlinen";
        do {
            for(size_t i=0; i<counter.size(); ++i) os << counter[i] << " & ";
            os << get_truth_value(counter) << "\\n";
        } while (increment_counter(counter));
        os << "\end{array}n";
        return os.str();
    }

а затем добавляем это в process_one_student_file_boolean:

Код на C++

void process_one_student_file_boolean(string dir, string fname,
        boost::format & general_tmpl, boost::format & problem_tmpl, boost::format & solution_tmpl) {
    BNode *node_bool;

    ostringstream s, ssolution;
    vector<string> students = readAllLinesFromFile(dir + "/" + fname + ".txt");
    cout << "tГруппа " << fname << endl;
    for (size_t i=0; i<students.size(); ++i) {
        if (students[i].size() == 0) continue; // empty line
        cout << "tt[ " << students[i] << " ]" << endl;
        do {
            node_bool = generate_tree(GBoolean, 2, 4);
        } while (!sanity_check(node_bool));
        string group_string = "$" + fname + "$";
        s << problem_tmpl % students[i] % group_string
                          % node_bool->ToString();
        ssolution << solution_tmpl % students[i] % group_string
                          % node_bool->ToString() % node_bool->latex_truthtable();
        delete node_bool;
    }
    ofstream ofs;
    open_for_writing(dir + "/" + fname + ".tex", ofs);
    ofs << general_tmpl % s.str() << endl;
    ofs.close();
    
    open_for_writing(dir + "/" + fname + ".sol.tex", ofs);
    ofs << general_tmpl % ssolution.str() << endl;
    ofs.close();
}

string students_dir = "2013";
vector<string> students_files = { "BoTR" };

int main(int argc, char *argv[]) {
    boost::format boolean_tpml( read_file_as_string("boolean_problem_minimal.tex") );
    boost::format solution_tpml( read_file_as_string("boolean_solution_minimal.tex") );
    boost::format general_tmpl( read_file_as_string("general_template.tex") );

    for (size_t i = 0; i < students_files.size(); ++i) {
        process_one_student_file_boolean(students_dir, students_files[i], general_tmpl, boolean_tpml, solution_tpml);
    }

    return 0;
}

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

Заключение

И вот результат – полдня работы, а на выходе сколько угодно заданий с готовыми ответами, всё красиво оформлено и готово к выдаче студентам. Если интересно, каким получилось реальное задание, вот пример окончательного результата. Файл с ответами выкладывать не буду, чтобы лишний раз не подсказывать студентам – они сейчас как раз решают это домашнее задание. Думаю, если моё преподавание в ГУ-ВШЭ будет продолжаться, эта программка мне ещё не раз послужит; ближайший шанс её применить – билеты для письменного экзамена в тех же группах.

P.S. Когда я готовил статью на хабр, я нашёл небольшой баг в своём генераторе формул; но исправлять не стал. Упражнение для внимательного читателя: какие формулы, в которых в принципе ничего плохого нету, мой генератор никогда не сможет породить? (помимо замечания о переборе переменных по порядку, которое я уже делал выше)

#1

Отправлено 13 Январь 2006 — 15:07

Tony

    Абитуриент

  • Пользователи
  • Pip

  • 10 сообщений

Народ, подскажите плиз что творится на экзамене по ДМ?
2 курс. :blink:


#2

Отправлено 13 Январь 2006 — 15:51

Антошка

  • Район:Россия, Москва, Ясенево

Твое спасение — Митин (если он будет) Я Сироте сдавал, если все знаешь более-менее, то 4 получишь. А засранец Губанов часа полтора всех на троечку драл, сцуко. Там сначала на 3 белет решаешь, если все правильно, то посишь задание на 4, мне надо было Т триггер сваять+таблицы истинности к нему. Если 5 захочешь — еще задание проси. Если задание не сделаешь, то и 3 не получишь, я если б это знал, на 3 бы остановился, хотя так 4 получил =)


#3

Отправлено 13 Январь 2006 — 16:14

Tony

    Абитуриент

  • Пользователи
  • Pip

  • 10 сообщений

препод у нас Гусева. а что именно там в билетах ваще? какие темы?


#4

Отправлено 13 Январь 2006 — 16:18

Антошка

  • Район:Россия, Москва, Ясенево

Да я уже не помню толком. Декомпозиция автоматов точно будет


#5

Отправлено 13 Январь 2006 — 16:26

Tony

    Абитуриент

  • Пользователи
  • Pip

  • 10 сообщений

хм =) какая нафик декомпозиция автоматов !? =) у нас дискретка тока первый семестр идёт. :mrgreen:


#6

Отправлено 13 Январь 2006 — 16:28

Антошка

  • Район:Россия, Москва, Ясенево

Ну тогда совсем не помню, в первом семестре я еле-еле, че-то как-то, раком-боком 3 получил и был счастлив :mrgreen:


#7

Отправлено 14 Январь 2006 — 00:22

zapadlo

    Абитуриент

  • Пользователи
  • Pip

  • 3 сообщений

Если надо то вот шпоры http://webfile.ru/744136 :thumb:


#8

Отправлено 14 Январь 2006 — 01:15

le_shka

  • Пол:Мужчина
  • Район:город-герой Москва

Круто! Реальные шпоры! :thumb: :mrgreen:


#9

Отправлено 14 Январь 2006 — 01:34

antilopka

  • Район:Мосрентген

ага тока они по первому семестру:(


#10

Отправлено 14 Январь 2006 — 01:38

SYNED

  • Пол:Мужчина
  • Район:Квартирка на Пятницкой

на экзаме все к Сироте друзья и братья!


#11

Отправлено 14 Январь 2006 — 02:15

antilopka

  • Район:Мосрентген

Губаныч у нас семинары вел, нашу группу он валить не будет, наоборот:) особенно любимчиков:)


#12

Отправлено 15 Январь 2006 — 13:18

а я Митину все сдал:) его очень легко было уговорить на 4. так что это халява, а также вся сессия халявная


#13

Отправлено 15 Январь 2006 — 15:21

MrFreeMan.DNA

  • Район:Из глубин квазиподпространства.

а я Митину все сдал:) его очень легко было уговорить на 4. так что это халява, а также вся сессия халявная

<{POST_SNAPBACK}>

Не говори,
что не сдал — то тебе сам деканат задвигает, как с ТОЭ сделали )))

А ты читер, сироте ты бы выше чем на три ни в жизни не сдал.


#14

Отправлено 15 Январь 2006 — 18:43

-.::MaZaFaKa::.-

  • Район:Moscow-City

а Губанову и на 3 сдать ОЧЧЧень сложно…. он реально как автомат работает…. или 3 или 2… больше никто не получил, вроде…


#15

Отправлено 21 Январь 2006 — 09:12

Губанов — автомат, у которого на выходе получается либо ждите, либо 2, либо 3. Причем 3 он выдает только после 20 «ждите»


#16

Отправлено 21 Январь 2006 — 14:37


#17

Отправлено 21 Январь 2006 — 15:18

Falling Star

  • Район:Inferno

Элементарный предмет+)
Митин, Сирота — самые классные преподы.


#18

Отправлено 21 Январь 2006 — 18:38

Сироте ты нифига не сдашь, проверено уже не раз


#19

Отправлено 21 Январь 2006 — 18:47

MrFreeMan.DNA

  • Район:Из глубин квазиподпространства.

Сироте ты нифига не сдашь, проверено уже не раз

<{POST_SNAPBACK}>

а вот нифига, он не валит, но и халяву не ставит.

Решил три задачи — получай тройку.
решил 2 — иди на йух.

и так далее.


#20

Отправлено 21 Январь 2006 — 19:16

Infidel

    Абитуриент

  • Пользователи
  • Pip

  • 22 сообщений
  • Район:Щёлково

Губанов — автомат, у которого на выходе получается либо ждите, либо 2, либо 3. Причем 3 он выдает только после 20 «ждите»

<{POST_SNAPBACK}>

Сдал Губанову на 4 практически без проблем, если не считать того что, когда он меня увидел, то сразу захотел влепить пару(за сем я с ним ни раз дескутировал по разным поводам( *_* ) )
Так что даже если он испытывает к тебе личную «нелюбовь» , сдать реально даже на 4.

Пулькин рулит однозначно, хотя экзамен я ему не сдавал, но за ааабсолютно несуществующую курсовую поставить 3 может только он))


Федеральное государственное образовательное бюджетное учреждение высшего образования

ФИНАНСОВЫЙ УНИВЕРСИТЕТ ПРИ ПРАВИТЕЛЬСТВЕ РОССИЙСКОЙ ФЕДЕРАЦИИ

Факультет «Прикладная математика и информационные технологии» Кафедра «Математика»

УТВЕРЖДАЮ

Директор Института заочного обучения

_________ Н.В. Зверева

__ ___________ 2015 г.

ДИСКРЕТНАЯ МАТЕМАТИКА

Учебно-методическое пособие для студентов первого курса бакалавриата, обучающихся по

заочной форме по направлению 38.03.05 «Бизнес-информатика»

Под редакцией профессора Н.Ш. Кремера

Рекомендовано кафедрой «Математика», протокол № 12 от 14 мая 2015 г.

Москва – 2015

Материал подготовили:

содержание дисциплины и методические указания предисловие,

темы 1–3 – проф. Кремер Н.Ш., тема 4 – доц. Эйсымонт И.М., тема 5 – доц. Потемкин А.В.;

варианты контрольной работы подготовлены авторами совместно.

Учебно-методическое пособие рекомендовано кафедрой «Математика».

Зав. кафедрой «Математика» профессор В.Б.Гисин

Дискретная математика. Учебно-методическое пособие для студентов второго курса бакалавриата, обучающихся по направлению 38.03.05 «Бизнесинформатика» / Под ред. проф. Н.Ш. Кремера. – М.: Финуниверситет, 2015.

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

ББК 22.3

2

ПРЕДИСЛОВИЕ

Дискретная математика – одна из важнейших составляющих современной математики. В отличие от других математических дисциплин учебного плана направления бакалавриата «Бизнес-информатика», таких как математический анализ, линейная алгебра и др., дискретная математика имеет дело с объектами нечисловой природы, что позволяет, в частности, использовать ее методы для моделирования социальных и экономических процессов. Понятия и методы дискретной математики необходимы для постановки различных прикладных задач, для усвоения и разработки современных информационных технологий, лежат в основе теории и практики программирования.

Целью изучения дисциплины «Дискретная математика» является освоение соответствующего математического аппарата, позволяющего анализировать, моделировать и решать прикладные (в том числе экономические) задачи.

Задачи изучения вытекают из требований к результатам освоения программы бакалавриата компетенций, установленных Федеральным государственным образовательным стандартом высшего профессионального образования (ФГОС-3+) по направлению 38.03.05 «Бизнес-информатика».

Входе изучения дисциплины ставятся задачи:

освоение методов дискретной математики для решения прикладных

задач;

выработка умения моделировать реальные объекты и процессы с использованием математического аппарата дискретной математики;

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

развитие навыков самостоятельной работы по изучению учебной и научной литературы.

Знания, полученные студентами в процессе изучения дисциплины «Дискретная математика», необходимы для изучения дисциплин математического и естественнонаучного цикла («Теория вероятностей и математическая статистика», «Методы оптимальных решений», «Языки и методы программирования»), а также ряда дисциплин профессионального цикла.

Всоответствии с ФГОС-3+ по направлению «Бизнес-информатика». квалификация академический бакалавр, процесс изучения дисциплины «Дискретная математика» на формирование следующих компетенций:

общекультурных компетенций (ОК)

– способность к самоорганизации и самообразованию (ОК-7);

профессиональных компетенций (ПК)

– способность использовать основные методы естественнонаучных дисциплин в профессиональной деятельности для теоретического и экспериментального исследования (ПК-17);

3

способность использовать соответствующий математический аппарат

иинструментальные средства для обработки, анализа и систематизации информации по теме исследования (ПК-18);

умение готовить научно-технические отчеты, презентации, научные публикации по результатам выполненных исследований (ПК-19).

Врезультате изучения дисциплины студент должен:

а) знать основные понятия теории множеств, комбинаторики, математической логики, теории графов и теории алгоритмов, используемых в экономических исследованиях при разработке новых информационных технологий и при изучении других дисциплин математического и естественнонаучного, профессионального циклов;

б) уметь:

применять методы дискретной математики для решения прикладных

задач;

строить математические модели прикладных задач.

в) владеть навыками решения задач дискретной математики.

По дисциплине ««Дискретная математика» студенты бакалавриата направления «Бизнес-информатика» должны выполнить одну контрольную работу (задания к которым приводятся в данном пособии). Контрольная работа (в соответствии с учебным графиком) могут быть существенно дополнена за счет частичного использования компьютерной обучающей программы (КОПР). В процессе изучения дисциплины студенты проходят компьютерное тестирование и сдают экзамен.

При выставлении итоговой оценки студента по данной дисциплине учитываются балльная оценка текущей успеваемости (качество подготовки и работа на практических занятиях, выполнение контрольной работы, компьютерное тестирование, посещение занятий) и результаты сдачи экзамена.

.

Содержание дисциплины и

4

методические рекомендации по ее изучению

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

Контрольные вопросы по каждой теме представлены ниже в разделе «Вопросы для самопроверки».

Рекомендуемые по каждой теме задачи с решениями и для самостоятельной работы приводятся ниже в разделе «Задачи для самоподготовки».

Вопросы выполнения контрольных работ с частичным использованием КОПР рассматриваются в брошюре [Электронные ресурсы, 3]: «Математика. Методические указания по проведению и выполнению контрольных работ с использованием КОПР».

Тема 1. Множества, функции, отношения

Множества – основные понятия. Диаграммы Венна. Операции над множествами: объединение, пересечение, дополнение. Кортежи и прямое (декартово) произведение множеств. Соответствия и их свойства. Взаимно однозначные соответствия. Мощности бесконечных множеств. Принципы включений – выключений. Понятие функции. Обратные функции. Суперпозиции и формулы. Способы задания функций. Общее понятие отношения. Бинарные отношения и их свойства (рефлексивность, симметричность, транзитивность). Отношение эквивалентности и классы эквивалентности. Отношение порядка. Линейный порядок и частичный порядок. ([1, часть 2, кроме § 5, 6]; [2, разд. 1.11.3]; [3, § 5.1, 13.1 – 13.3]).

Понятие множества относится к числу первичных, под которым понимается некоторая совокупность элементов, объединенных по какимлибо признакам. С множествами, их графическим изображением на диаграммах Венна студенты встречались ранее в курсах математического анализа и теории вероятностей. Там же рассматривались понятия

подмножества В (части данного множества А: В А ), пустого множества

(не содержащего ни одного элемента), дополнения А множества А (состоящего из всех элементов некоторого универсального множества2 U, не входящих в множество А). Определялись основные операции над множествами А и В: объединение А В (множество, состоящее из всех элементов множества А и В), пересечение А В (множество, состоящее из всех общих элементов А и В), разность А В (множество, состоящее из всех элементов множества А, не входящих в множество В).

1Учитывая, что учебный материал дисциплины недостаточно отражен в доступных для студента-заочника пособиях, содержание отдельных тем дается более подробно, чем это принято в методических пособиях (указаниях).

2Под универсальным множеством здесь понимается множество, включающее все множества, участвующие в рассматриваемой задаче.

5

В данном курсе вводится понятие прямого, или декартова, произведения множеств А и В, т.е. множество А В , элементы которого представляют всевозможные упорядоченные пары элементов множеств А и В (например, декартово произведение координатных осей Ох и Оу есть плоскость Оху).

Множество называется конечным, если содержит конечное число элементов и – бесконечным в противном случае.

Если между множествами А и В имеет место взаимно однозначное

соответствие

(т.е.

каждому элементу а А соответствует

определенный

элемент b B

( a

b ) и наоборот

( b

a )), то говорят что множества А и В

имеют одинаковую мощность

или

эквивалентны: A ~ B .

Для конечных

множеств это означает, что в них одинаковое число элементов. В случае бесконечного множества мощность является обобщением понятия «число

элементов». В этом смысле счетные3

множества являются «самыми

маленькими» из бесконечных множеств.

Пример

1.

Даны

множества

чисел

A

1, 2, 4, 5 ,

В

4, 5, 6, 7 ,

С 2, 3, 5, 7

и

универсальное

множество

U

1, 2, 3, 4, 5, 6, 7, 8 .

Найти

множества чисел: D

B ;

. Являются

B

C

C

A

E

B

C

В

C A

ли множества Е и D равными? эквивалентными? включающими одно в

другое ( D

E или E

D )? пересекающимися,

но не включающими одно в

другое? непересекающимися ( D E

)?

Р е ш е н и е. Для нахождения множества D вначале найдем:

пересечения множеств B

C

5, 7

,

A

B

4, 5 ,

дополнение множества С

1, 4, 6, 8 ,

разность множеств С A

. Теперь

(до множества U) C

B 1, 6, 8

D

5, 7

1, 6, 8

1,

5, 6, 7, 8 .

Для

нахождения

множества

Е

вначале

найдем:

1, 2, 3, 8 ,

В

1, 8 ,

, В

7 .

В

С

1, 2, 3, 8

1, 4, 6, 8

С А

3, 7

С А

4, 5, 6, 7

3, 7

Теперь

Е

1, 8

7

1, 7, 8 . Множества D и

Е

не равные

(так как

не

состоят из одинаковых элементов), не эквивалентные (так как имеют разные мощности (число элементов)), причем множество Е включается в множество

D ( E D ). ►

Бинарным (двухместным) отношением множеств А и В называется

любое подмножество R декартова множества

А В , т.е.

R

А В . Это

означает,

что

если элементы х и

у связаны

бинарным

отношением R

(записываемым

в виде xRy), то пара (х, у) является элементом R, т.е.

xRy

x, y

R .

Среди свойств

бинарных

отношений

выделяют

рефлексивность, симметричность, транзитивность ([1, часть 2, § 10]; [3, §13.3]). Бинарное отношение, для которого выполнены указанные три свойства, называется отношением эквивалентности, являющееся обобщением понятия равенства. Подмножества элементов, эквивалентные данному, называется его классом эквивалентности. Если бинарное

3 Множество называется счетным, если оно эквивалентно множеству натуральных чисел (его элементы можно перенумеровать).

6

отношение R на множестве Х рефлексивно, транзитивно и антисимметрично,

то оно называется отношением порядка (отношением частичного порядка).

Отношение частичного порядка называется линейным порядком, если для любых значений х и у имеет место либо xRy, либо уRх.

Соответствие f , сопоставляющее каждому элементу х множества Х один и только один элемент у множества Y, называется отображением

множества Х на множество Y.

Функцией называется

бинарное отношение

f , если

из

x, y

f и

x, z f , следует, что y z .

Если область определения и область значений

функции соответственно Х и Y, то говорят, что

функция

f

отображает

множество Х на множество Y, т.е. f : Х Y . Это означает,

что для любого

элемента x X существует единственный элемент y

Y такой, что x, y

f .

Подробнее о функциях говорилось в курсе «Математического анализа». Важное значение в теории множеств имеет формула включений-

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

А В

А

В

А

В

,

(1)

.

(2)

А В С

А

В

С

А В

А

С

В С

А В С

Пример 2. Из 250 абитуриентов экономического вуза, сдававших вступительные экзамены, отметку «3» получили: по математике 86 чел, по русскому языку – 71, обществознанию – 50, по математике или русскому языку – 130, по математике или обществознанию – 112, по русскому языку или обществознанию– 94, по всем трем предметам – 18 чел. Сколько абитуриентов сдали вступительные экзамены: а) без троек; б) с одной тройкой по математике; в) с одной тройкой.

Р е ш е н и е. а) Пусть А , В , С – число абитуриентов, получивших

отметку «3» соответственно по

математике,

русскому

языку

и

обществознанию. По условию

А

86 ,

В

71,

С

50 ,

А В

130 ,

А С

112 ,

ВС 94, А В С 18 . Вначале найдем число абитуриентов, получивших

оценку «3»

по математике и русскому языку, т.е.

А

В

. Из формулы (1)

А

В

А

В

А

В

86 71 130 27 . Аналогично

А

С

86 50 112 24 ,

В

С

71

50

94

27 .

Теперь найдем число, абитуриентов, получивших оценку «3» хотя бы

по

одному

из

трех

предметов, т.е.

А В С

. По формуле (2)

А

В С

86

71

50 27

24 27 18 147 .

Следовательно,

число

абитуриентов,

сдавших

вступительные

экзамены

без троек,

равно

250–147=103 (чел).

б) Вначале найдем число абитуриентов, имеющих только две тройки –

по математике и русскому языку:

А B

А

В С

27

18 9 , по математике

математика

русский

7

язык

53

9

35

и обществознанию: А С

Следовательно, только одну тройку по математике имеют 86–

–9–6–18=53 (чел).

в) Аналогично п. б) найдем число абитуриентов, имеющих только одну тройку по русскому языку:

71– (27–18) –(27–18) –18=35 (чел)

и по обществознанию:50–(24–

–18) – (27–18) –18=17 (чел). Всего абитуриентов, имеющих только одну тройку, равно 53+35+17=105

(чел). Решение задачи легко иллюРис. 1 стрируется на диаграмме Венна.

(рис.1)►

Тема 2. Комбинаторика

Предмет комбинаторики. Правило суммы и правило произведения. Размещения, перестановки, сочетания без повторений и с повторениями. Биномиальные коэффициенты и соотношения для них. Задачи перечисления. Подсчет числа функций с конечными областями определения. ([1, часть 3]; [2, разд. 3.1]); [3, § 1.5]).

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

Студенты должны четко знать правила комбинаторики:

правило суммы: если объект А1 может быть выбран n1 способами, А2

другими n2

способами, то выбор одного из объектов А1 или А2

может быть

осуществлен n1 + n2 способами;

правило произведения: если объект А1 может быть

выбран

n1

способами,

после каждого такого выбора объект А2 может быть выбран

n2

способами,

то выбор всех объектов А1 , А2 в указанном порядке может быть

осуществлен n1 n2 способами.

Из множества n различных элементов могут быть образованы подмножества (комбинации) из m элементов 0 m n.

Если комбинации из n элементов по m отличаются, либо составом элементов, либо порядком их расположения (либо и тем и другим), то их называют размещениями. Число размещений из n элементов по m находятся по формуле:

Аm

n n 1 n 2 … n m 1 или Аm

n!

.

n

n

n

m !

m сомножителей

(где n! 12 3 …n ).

8

Если комбинации из n элементов по m отличаются только составом элементов, то их называют сочетаниями. Число сочетаний из n элементов по m находятся по формуле:

Cnm

n n

1 … n m 1

или Cnm

n!

.

m ! n

1

2 …m

m !

Свойства числа сочетаний:

С 0

C n

1 (ибо 0!

1), C m

C n m .

n

n

n

n

Если комбинации

из

n

элементов

отличаются

только порядком

элементов, то их называют перестановками. Число перестановок из n элементов находится по формуле:

Pn n!

Пример 3. В первом туре конкурса участвуют 16 человек. Сколько существует различных исходов этого тура, при которых совпадают участники, занявшие призовые 1-е, 2-е и 3-е места, а также два участника, занявшие 15-е и 16-е места и выбывающие из дальнейшего участия в конкурсе?

Р е ш е н и е. Способы распределения участников, занявших 1-е, 2-е и 3-е места (из 16), отличаются как составом участников, так и их порядком; их число – число размещений А163 . Из оставшихся 16 3 13 участников два

выбывают из конкурса (порядок этих участников значения не имеет); их число – число сочетаний С132 . По правилу произведения (см. с. 8) получаем,

что число различных исходов первого тура конкурса, удовлетворяющих условию задачи, есть

А3

С 2

16 15 14

13 12

262080

16

13

1 2

(или А3

С 2

16!

13!

16!

11! 12 13 14 15 16

262080).

16

13

13!

2!11!

2!11!

2!11!

Другой способ решения состоит в том, что общее число различных исходов первого тура с 16-ю участниками (без учета распределения тех или иных мест) равно числу перестановок P16 . Перестановки участников,

занявших места с 4-го по 14-е (т.е. 11 мест), а также 15-е и 16-е места (2 места) приводят к совпадающему в соответствии с условием исходу первого тура; их число (по правилу произведения) равно P11 Р2 . Значит, число различных исходов первого тура конкурса, удовлетворяющих условию, есть

Р16

16!

262080. ►

Р11

Р2

2!11!

Если в комбинациях из

n

элементов часть элементов (или все)

являются одинаковыми, то их называют комбинациями (размещениями, сочетаниями, перестановками) с повторениями.

Соответствующие формулы таких комбинаций с повторениями, приведены в пособии ([1, часть 3]; [3, § 1.5]). Там же рассматриваются задачи на подсчет различных комбинаций [1, 1-ое практическое занятие]; [3, примеры 1.11 – 1.15].

9

Тема 3. Математическая логика

Основные понятия логики: высказывания и рассуждения. Основные логические операции и их свойства. Алгебра высказываний. Понятие о булевской алгебре; алгебра высказываний как интерпретация булевской алгебры. Логические функции и способы их задания – таблицы и формулы. Дизъюнктивные и конъюнктивные формы. Теорема о функциональной полноте. Исчисление высказываний. Понятие об алфавите, формулах, аксиомах, правилах вывода и основных теоремах исчисления высказываний. Логика предикатов. Предметная область и предметные переменные. Кванторы общности и существования. Свободные и связанные переменные. Эквивалентные соотношения в логике предикатов. Общезначимые и противоречивые формулы. Запись утверждений естественного языка в логике предикатов. Понятие об исчислении предикатов ([1, часть 1, кроме §

11]; [2, разд. 1.4,1.5]; [3, § 13.1 – 13.3]).

При изучении темы следует усвоить основные понятия алгебры логики: высказывание (предположение, которое может быть истинно или ложно, при этом логическая переменная х равна соответственно 1 или 0),

логические операции (логические связки) с помощью которых строятся новые высказывания, образующие формулы алгебры логики (алгебры высказываний), таблицы истинности таких высказываний.

Надо четко знать основные логические операции: отрицание высказывания Х (высказывание Х , которое истинно, когда Х ложно, и ложно, когда Х – истинно), конъюнкция (дизъюнкция) двух высказываний Х и Y

(высказывание X

Y ( X

Y ), которое истинно (ложно) тогда и только тогда,

когда Х и Y истинны (ложны)), импликация (эквивалентность) двух

высказываний Х и Y (высказывание X

Y ( X

Y ), которое ложно (истинно)

тогда и только тогда, когда Х истинно, а Y ложно (Х и Y оба истинны или оба

ложны)).

В табл. 1 и 2 приводятся таблицы истинности этих высказываний.

Таблица 1

Х

Отрицание X

0

1

1

0

Таблица 2

Х

Y

Конъюнкция

Дизъюнкция

Импликация

Эквивалентность

X

Y

X

Y

X Y

X Y

0

0

0

0

1

1

0

1

0

1

1

0

1

0

0

1

0

0

1

1

1

1

1

1

Логические операции высказываний тесно связаны с операциями над множествами. Отрицание высказывания соответствует дополнению

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Понравилась статья? Поделить с друзьями:
  • Как сдать экзамен по дерматологии
  • Как сдать экзамен по литературе 9 класс если ничего не знаешь
  • Как сдать экзамен по гражданскому процессу
  • Как сдать экзамен по литературе 11 класс егэ
  • Как сдать экзамен по гистологии на отлично