Name: Костя Лопухин
Task: gantt
Level: 2
Language: Clojure
Work: 15 часов
Duration: много небольших наскоков в течении недели + чтение Норвига пол дня

Содержимое:

- src/                   Все исходники лежат в папке src.
-- utils/                Небольшие утилиты
--- common.clj           Утилиты общего назначения (я использую 2 из них)
--- csv.clj              Небольшая библиотека для работы с csv файлами, взятая вот тут
                         http://github.com/davidsantiago/clojure-csv
-- csp/                  Собственно файлы, относящиеся к заданию
--- min_conflicts.clj    Алгоритм min-conflicts для решения CSP
--- grantt.clj           Парсинг условий задачи и формулировка ее в терминах CSP, и вывод
--- grantt_test.clj      Тесты для grantt.clj, писались в процессе
--- source.csv           Несколько измененный файл с изначальными условиями
--- corrected.csv        Несколько измененный файл с промежуточными условиями
- clojure.jar            Реализация языка (версия 1.1.0, http://clojure.org/)
- clojure-contrib.jar    Стандартные библиотеки языка
- source-out.csv         Пример результата работы на src/csp/source.csv
- corrected-out.csv      Пример результата работы на src/csp/corrected.csv

Как запустить (самый простой способ):
    java -cp src/:clojure.jar:clojure-contrib.jar clojure.main src/csp/grantt.clj src/csp/corrected.csv corrected-out.csv
    если не передать второй аргумент, то результат просто выведется на экран.
    REPL можно запустить так java -cp src/:clojure.jar:clojure-contrib.jar clojure.main

На все решение ушло, как мне кажется, не больше 15 часов, но это было много коротких
интервалов, поэтому точнее сказать не могу. Решение основывал на алгоритме min-conflicts
решения CSP (constraint satisfaction problem), который описан в книжке
Russell S., Norvig P. Artificial intelligence - a modern approach
(2ed,PH,2003)(T)(1112s) - 5 глава, ее я читал раньше.
Алгортм взял самый простой, но он не детерменированный, можно передавать
ему при запуске дополнительные паратметры (число итераций и перезапусков). На каждом
шаге выводится номер шага и конфликтующие переменные.
Файлы source.csv и corrected.csv отличаются от изначальных - во-первых, я добавил
некоторые дополнительные условия, во-вторых, поправил некоторые ошибки (так, у вас в
одном из них для id одной задачи использовалась то русская, то английская С, а в другом
задача должна была выполняться в субботу или воскресенье, но по условию я решил,
что такого быть не должно).
На этих файлах программа работает и выдавает какие-то решения, но все время немного разные,
конечно. Два примера файлов я положил в корень - source-out.csv и corrected-out.csv.
Я пока не занимался оптимизацией или причесыванием кода, прислал первое, что заработало.
Также, я никак не проверяю введенные данные на корректность.
Опыт использования языка небольшой, это, пожалуй, самая интересная и большая программа,
которую я писал на Clojure, мне понравилось! Спасибо за интересное задание!
