Here is a question for you: “How complex a business process can be solved by Nintex Workflow Cloud?“, well I think I do have an interesting answer for that, it solves business processes that is as complicated as the famous Farmer-Wolf-Goat-Cabbage cross a river puzzle.
There are many programming languages out there, everyone will have its own strengths and focuses. You might find it easy to solve the old classic puzzle such as the “Farmer-Wolf-Goat-Cabbage cross a river” with much lesser code in Prolog or Lisp that is associated with Artificial Intelligence than a Java program. It will be interesting to find out solving the same puzzle without even writing a piece of code with Nintex Workflow Cloud.
For those who have not came across the “Farmer-Wolf-Goat-Cabbage cross a river” puzzle, you could simply do a search on the web to find enough article and solution for it. This is just a perfect puzzle trying to understand a real world business process is, it has:
Objective:
- To move all the objects (Wolf, Goat, and Cabbage) across a river
Rules:
- Wolf and Goat are not to be left alone
- Goat and Cabbage are not to be left alone
- Only farmer roars the boat
- Farmer can only bring one object at a time
Let us define the required terminology or object(s) we can apply to our workflow design,
Terminology | Description |
---|---|
fromBank | The river bank where all the objects of Farmer, Wolf, Goat, and Cabbage are |
toBank | The destination river bank where all the objects to be moved to |
F, W, G, C | The acronyms representing Farmer, Wolf, Goat, and Cabbage |
fromBank=[“F”,”W”,”G”,”C”] | The initial state represents all the objects are at the fromBank river bank |
riskState=[“WGC”,”GC”,”CG”,”WG”,”GW”] | Sets of states both fromBank and toBank is at risk |
toBank=[] | The initial state represents none of the objects are on the toBank river bank |
Embarkation, Disembarkation, ReturnTrip | Represent three movement stages of forward movement from fromBank to toBank, disembarking of object to the toBank, and return trip with object to be brought back to the fromBank. |
Algorithm:
- Initialize objects for:
- fromBank=[F,W,G,C],
- toBank=[],
- embark farmer to boat (i.e. fromBank=[W,G,C]),
- riskState,
- etc.
- Start a loop until toBank=[F,W,G,C],
- Embarkation Branch (i.e. always assuming to start with embarking an object to the boat)
- Check if we suppose to embark an object or return an object, if return object, change to ReturnTrip Branch. else continue
- try to embark the first Item from fromBank collection
- Verify if fromBank is “at risk” state by checking against the riskState collection
- If “at Risk” is true, revert the embarked item back to the fromBank collection’s back of the queue, exit branch
- if “at Risk” is false, remove the Item from the fromBank, switch to Disembarkation branch
- Disembarkation Branch (i.e. this stage is always followed from Embarkation branch)
- Try to disembark the object to toBank
- If toBank items count is equal to the total object, the goal has achieved
- if toBank items count is less than 2, toBank is at Safe state, farmer go back alone to Embarkation stage (i.e. set variable returnTrip=false)
- if toBank is “at Risk” state, farmer need to go back bringing one item to avoid “at Risk” state of toBank (i.e. set variable returnTrip=True)
- ReturnTrip Branch
- Disembarkation was always done at the Disembarkation Branch by disembarking item to the back of the toBank collection queue
- We will try to return the first item from the toBank, and verify if the remaining left alone safe?
- Loop through to get an item to be returned avoiding the conflicts at toBank
- Embarkation Branch (i.e. always assuming to start with embarking an object to the boat)
- Exit of loop (i.e. mission completed), sending the log of the movement result.
You may see the demo by submitting the Public Form at the following URL FWGC Cross the river puzzle form , which you will need to supply an email to receive the result, and the object sequence in the format of e.g. “F,W,G,C”, “W,F,C,G”, etc. to get different movement results. Here is the example of the form:
Note: Nintex Workflow Cloud do not currently support validation of the public form, you will need to fill in a valid email to receive the response, and right syntax for the FWGC Sequence field.
Here is a sample email content you will be getting from the submission of the above form:
Please find below the movement required to move all the objects from fromBank to toBank (i.e. each –> denotes the beginning of a line)—>Initialized: fromBank = [“F”, “W”, “G”, “C”], ristState = [“WGC”, “GC”, “WG”, “CG”, “GW”], toBank = [], initStateCount = 4, —>Embark W: fromBank = [“G”, “C”], toBank = [], atRisk = true, —>Revert W: fromBank= [“G”, “C”, “W”], toBank=[], —>Embark G: fromBank = [“C”, “W”], toBank = [], atRisk = false, —>Disembark G: fromBank = [“C”, “W”], toBank = [“G”], embark option in return trip= false, —>Embark C: fromBank = [“W”], toBank = [“G”], atRisk = false, —>Disembark C: fromBank = [“W”], toBank = [“G”, “C”], embark option in return trip= true, —>Return trip with G: fromBank = [“W”, “G”], toBank = [“C”], —>Embark W: fromBank = [“G”], toBank = [“C”], atRisk = false, —>Disembark W: fromBank = [“G”], toBank = [“C”, “W”], embark option in return trip= false, —>Embark G: fromBank = [], toBank = [“C”, “W”], atRisk = false, —>Disembark G: fromBank = [], toBank = [“C”, “W”, “G”], embark option in return trip= falseCompleted State:fromBank = []toBank = [“C”, “W”, “G”] |
This exercise helps me with list of Asks on features and enhancements that I am looking forward to, I have most of them logged to the uservoice, here are some of them:
1. There is currently no way to construct a rich text variable with formatting I want, so I could compose the “Send email” action’s body by inserting a formatted string/rich text variable at the final stage. (i.e. the email content in the above example will be more readable if I could insert a formatted text of the below example:
—>Initialized: fromBank = [“F”, “W”, “G”, “C”], ristState = [“WGC”, “GC”, “WG”, “CG”, “GW”], toBank = []
—>Embark W: fromBank = [“G”, “C”], toBank = [], atRisk = true,
—>Revert W: fromBank= [“G”, “C”, “W”], toBank=[],
—>Embark G: fromBank = [“C”, “W”], toBank = [], atRisk = false,
—>Disembark G: fromBank = [“C”, “W”], toBank = [“G”], embark option in return trip= false,
—>Embark C: fromBank = [“W”], toBank = [“G”], atRisk = false,
—>Disembark C: fromBank = [“W”], toBank = [“G”, “C”], embark option in return trip= true,
—>Return trip with G: fromBank = [“W”, “G”], toBank = [“C”],
—>Embark W: fromBank = [“G”], toBank = [“C”], atRisk = false,
—>Disembark W: fromBank = [“G”], toBank = [“C”, “W”], embark option in return trip= false,
—>Embark G: fromBank = [], toBank = [“C”, “W”], atRisk = false,
—>Disembark G: fromBank = [], toBank = [“C”, “W”, “G”], embark option in return trip= false
2. Import / Export of workflow design. I will be able to share my workflow design once the feature is available for me to export my workflow and attach it to this blog for sharing..
3. Print workflow design, and Save as.. to export workflow design as JPG, PNG, etc.
4. As I am using a lot of Collection operation for the exercise, there is a long list of collection operations I am looking for that is missing for the time being, the challenge results a workflow with additional actions to solve simple issue, here are some of the features that I think is missing:
- Copy a collection from one to the other
- Store Item for “Remove Item from Collection” action
- Compare if two collections are equivalent
- Dictionary variable
- Concatenate collection items into string
5. Other features such as Log history action, Workflow constant, Go-to node action, sub workflow and/or grouping of actions.
Until my workflow could be exported for sharing, the best I could do for the time being is the captured design of the workflow solving the Farmer-Wolf-Goat-Cabbage puzzle.