.. _map_coloring:
Map Coloring
------------
The map coloring problem is a common problem.
We will show how to solve it using only cDMN.
The full DMCommunity challenge, with other submitted solutions can be found `here. `_
.. admonition:: Map Coloring Challenge
This challenge deals with map coloring.
You need to use no more than 4 colors (blue, red, green, or yellow) to color six European countries: Belgium, Denmark, France, Germany, Luxembourg, and the Netherlands in such a way that no neighboring countries use the same color.
We start by creating our glossary.
For this specific problem, the glossary does not need to be complex.
We create a type to represent countries and a type to represent the colors.
.. raw:: html
| Type |
| Country |
String |
Belgium, France, Germany, Luxembourg, Netherlands |
| Color |
String |
Green, Red, Yellow, Orange |
To assign every country exactly one color, we can use a function.
To express that two countries border, we use a relation.
.. raw:: html
| Function |
| color of Country |
Color |
.. raw:: html
| Relation |
| Country borders Country |
Now that our glossary is done, we can move on to the next step: modeling the problem logic.
This logic is very simple: if two countries border, they cannot share the same color.
We can represent this straightforwardly using a constraint table.
The table is read as: "For every two countries c1, c2, if they border they cannot share the same color."
.. raw:: html
| Bordering countries cannot share colors |
|
| E* |
Country called c1 |
Country called c2 |
c1 borders c2 |
color of c1 |
| 1 |
- |
- |
Yes |
Not(color of c2) |
And that is all the logic we need to solve this problem!
We simply need to represent which countries border which using a data table, and we're done.
.. raw:: html
| Bordering Countries |
|
| D |
Country called c1 |
Country called c2 |
c1 borders c2 |
| 1 |
Belgium |
France, Luxembourg, Netherlands, Germany |
Yes |
| 2 |
Netherlands |
Germany |
Yes |
| 3 |
Germany |
France, Luxembourg, Denmark |
Yes |
| 4 |
France |
Luxembourg |
Yes |
We can now run our model using the cDMN solver.
This results in the following output:
.. code:: bash
Model 1
==========
color_of_Country := {Belgium->Yellow, France->Red, Luxembourg->Green, Netherlands->Green, Germany->Orange, Denmark->Green}.
Country_borders_Country := {(Belgium,France), (Belgium,Luxembourg), (Belgium,Netherlands), (Belgium,Germany), (France,Luxembourg), (Netherlands,Germany), (Germany,France), (Germany,Luxembourg), (Germany,Denmark)}.
Elapsed Time:
0.902
We are now able to color a map without having to worry about bordering countries sharing a color!