### Development of a Small Rostering Application

Solutions from rostering applications affect the daily life of the people rostered. Therefore, the application developers and planners iteratively improve the rostering applications and the quality of the solutions, often based on the feedback of those affected by the rosters created. The close link between the modeling language and GUI pages in AIMMS makes it easy to study the solutions and (re)formulate constraints.

In this post, the steps are described to develop a small rostering application in AIMMS. This application is based on an assignment given in “Integrated methods for Optimization” by John N. Hooker, section 2.2.5. The problem is to create a weekly roster for 4 nurses to help in a home for the elderly. A day has three shifts: day, evening, and night. Each shift is staffed by one nurse, so one nurse is free each day. We try to balance the free days per nurse, require at least 16 hours between shifts, and minimize the nurses per particular shift, and the number of changes in staffing per shift.

### Quickly determine on which pages an identifier is used

In December 2011 I wrote the blog article about Determining where each identifier is used in your project. This article showed how the function *ReferencedIdentifiers* could be used to obtain information about which identifiers referred to which other identifiers.

In the same article, I also explained you could use the functions *PageGetAll* and *PageGetUsedIdentifiers* (or alternatively the function *IdentifierGetUsedInformation* that was introduced in AIMMS 3.12 FR2) to get information about which particular pages have references to an identifier.

Although this approach is useful if you want to get information for all of the identifiers, it is a bit cumbersome to just quickly get the information about which pages are using one specific identifier.

### Easily align multiple objects on page

When creating a Graphical User Interface for your AIMMS project you typically want to nicely align the different objects that are present on a page.

For example, the different buttons you have on one page should all be the same size. Furthermore, if you have multiple buttons, you might also want to have them nicely spread horizontally (i.e. have the same amount of spacing between all of the buttons) as displayed in the picture on the left.

### Automatic Benders’ decomposition: AIMMS beta version available

Benders’ decomposition is an approach to solve complicated mathematical programming problems by splitting them into two, and thereby simplifying the solution process by (repeatedly) solving one master problem and one subproblem. If the problem contains integer variables then typically they become part of the master problem while the continuous variables become part of the subproblem. The classic approach of the Benders’ decomposition algorithm solves an alternating sequence of master problems and subproblems. Benders’ decomposition is mostly used for solving difficult MIP problems and stochastic programming problems.

We have developed a generic Benders’ decomposition module in AIMMS that is easy to use. A beta version of AIMMS 3.13 with Benders’ decomposition is now available for downloading. If you are interested to try it then we invite you to send an e-mail to our support.

### Happy New Year

[youtube=http://www.youtube.com/watch?v=udn8zGQuNWM]

We want to wish you an optimized 2013!

Above you see a screencast of a small AIMMS demo project that animates exploding fireworks with the network object in AIMMS.

### ROGO solver using constraint programming

The ROGO puzzle, rogopuzzle.co.nz, challenges players to find a good path on a board, pick up treasures, and avoid pitfalls. This puzzle, and its corresponding iPhone app, were originally developed in New Zealand. In this post, I’ll explain a method for solving ROGO puzzles using constraint programming in AIMMS.

### Getting multiple solutions from the solver

Some of the solvers in AIMMS, including the CP Optimizer solver for Constraint Programming problems, support not only returning a single (optimal) solution, but also a pool of feasible solutions.

Some time ago, Hakan Kjellerstrand has done a thorough review of Constraint Programming in AIMMS. One of the remarks he posted at the end was that it was not completely clear how to obtain multiple solutions from the CP Optimizer solver.

In this post I will show how to instruct the solver to create the additional solutions and also how to retrieve them in AIMMS after the solver is finished. I will do this by modifying the original N-Queens problem as implemented by Hakan in his review.

### Coloring the states of the USA

Map coloring is a very nice introductory problem to constraint programming; Given a graph *G=(V,E)* with vertices *V* and edges *E* in between, what is the minimum number of colors needed such that two adjacent vertices, *v1* and *v2, *have different colors? One obvious application of this problem is in the construction of maps with two adjacent regions that can easily be distinguished by their colors. Creating a map coloring application has two distinct aspects; the problem itself, and the presentation of the solution. Both are described in this post.

### Scheduling for project planning

The identifier types ACTIVITIES and RESOURCES, and the scheduling intrinsic functions as part of the AIMMS constraint programming component are very useful in modeling construction projects and optimizing the makespan of those projects.

Several existing constraint programming languages use the Bridge Building example in the Ph.D Thesis of the late M. Bartusch to illustrate this, see for instance Oz and SAS.

### What is the element after the last?

Consider a stock balance *S(t+1)=S(t)+P(t)-D(t)*. Via *t+1* we refer to the next element in a set. Using such an expression as an argument of a variable, as in *S(t+1)*, we refer to the stock of the next period. The meaning of an expression like *t+1 *needs to be well-defined, including when t equals the last element in the set H. This brings us to the question in the title of this post.

Consider the situation with an index *i*, such that [latex]i \in S=\{1..5\} \subset M=\{1..7\} \subset {\tt{}Integers} \subset \mathbb{N}[/latex]. To denote the next element in a set, the *+1* notation is used. Clearly, for *i=3, i+1=4*, but when *i=5*, what should *i+1* be?

Let me answer this question, by considering a few other examples as well, and then come back to how you may handle this in the stock balance.