Hi! This is the homepage of appoinneal, a piece of free software that can help you create optimized schedules for appointments.

If you are instead looking to generate draws for tournaments, have a look at the related software drawnneal.

Otherwise please read the following notes and contact me in case of questions.


GETTING APPOINNEAL
------------------
The most recent version of appoinneal, 0.7, is available from the 
Sourceforge project page of its parent project drawnneal,
at http://sf.net/projects/drawnneal


WHAT APPOINNEAL DOES
--------------------
Imagine you were to create a schedule for a number of appointments with 
various appointers (maybe companies) and appointees (maybe students on a
career fair).
The day will contain several rounds/slots of appointments and you'll have
a limited number of rooms. Both the companies and the students might have
individual limitations as to when they can be present. Every company can
only speak to one or another limited number of students simultaneously.
They don't like empty slots very much, either. Students can only have one
appointment at a time. While they prefer to have a break or an empty slot
between different appointments, they don't like to wait several slots.

Appoinneal will create and optimize such schedules using a simulated 
annealing algorithm. Schedules are rated by their accordance to the 
criteria named above and slight changes are applied to them, in the 
beginning possibly even making them worse, then slowly but surely 
improving them to something close to a global optimum. Your schedule will
be made in no time (well, almost) and better than any human could ever
make it.


BUILDING APPOINNEAL
-------------------
You just have to compile appoinneal.cpp using a c++ compiler. For typical
GNU/Linux systems you'll probably be using gcc/g++ and a simple

	make

will suffice. If you happen to have a different compiler installed please
see the appropriate documentation for how compile 'appoinneal.cpp' into an
executable 'appoinneal'.


RUNNING APPOINNEAL
-----------------
A simple

	./appoinnneal appointee-file appointer-file

will start appoinneal in interactive mode. You will be asked a couple of
things about your plannings. You need to enter

 * the number of subsequent appointments (slot) you'll have
 * the number of rooms you have
 * which of your slots lie after a break in your schedule 
   (so nobody's in a rush if they have appointments before AND after)


APPOINNEAL CONFIGURATION FILES
------------------------------
You will have to give information about your appointees (patients, students, 
...) and appointers (counselors, company officials, teachers, ...) in two
text files. Look at the *-example.tab files in this directory while you
familiarize yourself with the format.

Appointee configuration file
----------------------------
The appointee configuration file just contains
 * one string (no spaces) in the first line; just keep the comment in the 
   example file, since it'll remind you of the format
 * one line for each appointee, which contains
   ID NameWithoutSpaces EarliestPossible LatestPossible NumberOfRoomsRequired
   where ID should run from 0,1,... in the correct order, the name must not 
   contain spaces, EarliestPossible is an integer giving the first slot
   (1,2,...) the appointee can accept (0 if no problem with the first slot)
   and LatestPossible is the same story for the last slot he/she can accept;
   NumberOfRoomsRequired is the number of rooms an appointment with this
   appointee requires. For most people, this should be 1 ;) -- however,
   it is sometimes useful to set it to zero if there are real or virtual
   appointments that do not require an extra room.

Appointer configuration file
----------------------------
The appointer configuration files contains all information about the 
appointers themselves and the appointments they have. It has
 * one string (no spaces) in the first line; just keep the comment in the 
   example file, since it'll remind you of the format
 * one line for each appointer, which contains
   ID NameWithoutSpaces NumberOfApp ID1 ID2 ... Earliest Latest Cap Dur
   where ID should run from 0,1,... in the correct order, the name must not 
   contain spaces, NumberOfApp is the number of appointees this appointer
   has and is followed by a space separated list of their IDs, Earliest is an
   integer giving the first slot (1,2,...) the appointer can accept (0 if no
   problem with the first slot) and Latest is the same story for the last
   slot they can accept, Cap is the number of parallel appointments this
   appointer can accomodate (usually 1) and Dur is the duration (in numbers 
   of slots) an appointment with this appointer takes (usually 1).

Example files
-------------
Much can be done by using these options smartly. Look at the example config
files included to find how presentations given by the appointers (see 
appointees P* with fixed schedule) or meetings of appointers in a common slot
(see appointees S* in slot 5) can be modelled.


RUNNING APPOINNNEAL SMARTLY
---------------------------
As you might have noticed running appoinneal in interactive mode does not
exactly meet today's standard of user interfaces. So that's the reason I
recommend the following, even more low level method of entering your data,
which can also be used to run many instances of appoinneal as a script.

Just run
echo "12 19 3 5 0 1" | ./appoinneal appointers-example.tab appointees-example.tab
to create an appointment schedule for the (fake) appointers and appointees
listed in the example files with 6 slots with 10 rooms and breaks before 
slots 3 and 5. The random seed is 1 and can be changed to produce different
optimized schedules (you should always try a few different ones).


HACKING APPOINNEAL
------------------
You may change some of the internal parameters of appoinneal by editing the
source file and recompiling (with a simple 'make'). This is less difficult
than it may sound and it might help you create even better draws.

i) annealing parameters
You can change the parameters thot (initial temperature), tfactor (factor
by which temperature is multiplied with each step, should be lower than 1.0)
or freeze_timeout (number of unsuccessful steps before draw is considered 
optimized) to change the annealing process.

ii) rating parameters
How the different criteria mentioned are judged in comparison depends 
essentially on the penalties for deviation from the ideal configuration a
draw gets. You can change either of the 'malus' factors and see what happens.

iii) rating procedure
Deeper changes to the rating procedure can be made by editing the function 
'double rateDraw'. Take care :)


COPYING AND DISTRIBUTING APPOINNEAL, LEGAL STUFF
------------------------------------------------
This program is free software; you can redistribute it and/or modify it 
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
more details.


CONTACTING THE AUTHOR
---------------------
Appoinneal has been written an is maintained by Daniel Gruen . 
Don't hesitate to contact me to send comments, bug reports, wishlists or even money ;)
If you need help with your schedule, let me know.