View this PageEdit this PageAttachments to this PageHistory of this PageHomeRecent ChangesSearch the SwikiHelp Guide
Hotspots: Admin Pages | Turn-in Site |
Current Links: Cases Final Project Summer 2007

Los Pimps - Milestone 6

Spring 2004 MILESTONE 6

Overview:
Milestone 6 was the final milestone for the class. The goal was to create a way to merge and unmerge people, families, and entire geneologies. Much of this was just an extension of Milestone 5, however, the difficult part of this milestone was making sure not to disrupt family pointers when merging individuals from two geneologies.

Matching:
The matching algorithm we used was the same from Milestone 5. We implemented a fuzzy match technique that enabled us to determine if two people were close enough to be considered a match. This was done when our Merger class envoked an instance of SoundexGenerator which would then return a number between 0 and 100. From this we could determine if we had found a match or not. We considered a score of 90 or higher to be considered a match. We made strict rules for this because we did not want to cause problems with merging if people were not close enough to be matches. This would have created problems when trying to keep family ties if we had not held a very strict matching algorithm. The algorithm we used was a soundex matching algorithm. This algorithm is decent however it does have some inaccuracies. We made some adjustments to the algorithm to try and optimize it to provide us with the functionality we needed. A description of the algorithm can be found here Los Pimps - Matching Tutorial

Screenshot of possible matches
Uploaded Image: matches.JPG

Merging:
In our gui, Merging was started by selecting two geneologies and then clicking on the merge button. This would then prompt a window that would ask what type of merge was desired. Either a Auto Merge, which would merge the entire geneology, no questions asked, and Merge with approval, which would step through each possible match and prompt the user to merge the individual or not to. We tried to implement the advanced merging algorithm that was provided to us, however, we could not get it to work and so created our own merging algorithm which worked for the auto merge. Because of this, the merge with approval did not work. Here is the algorithm we implemented for the Auto Merge.

The Auto Merge Algorithm:
First we looped through all the individuals in both the geneologies that were to be merged to find matches. For two people to be considered a match, they would have to match at a 90% rate. Also, their family structure had to be identical. Nil values would be considered a match since the information was not provided. Once a match was found, the two people were merged, and the new person was placed into a new Geneology. Also, a flag was set, stating that these two people had been merged and an ID that indicated which two people formed the new person. After the matches were found and merged, we took all the remaining persons and merged them with nil, this was done because it allowed us to do the same thing for all the individuals and cut down on ifTrue statements. These new people were then placed into the new geneology. Once all the people were merged (either with another person or with nil) we went through all the families in the geneologies. We looped through the geneologies again, but this time looking at all the families. We looked for matches for each family. A family was considered a match if both spouses matched at a 90% rate. The children did not necessarily have to match since an unknown number of children could be present. Thus we looked for best possible matches. An example would be if three families' spouses all matched, but two kids from one family matched another but the third family had no kids, then the two families with two matching children would be considered a better match than the family without children. After the family was considered a match, it was merged. The way it was merged. To merge a family, we used the indicators we had placed when we merged the individuals to find the new individuals in the new geneology that corresponded to the individuals in the families to be merged. Thus our individuals in the new geneology would be the individuals in the merged families. Again, like we did for the individuals, tags were set to indicate that this family had been merged and with what previous families. Finally, the unmatched families were merged with nil and placed into the new geneology.

Screen of some of our merge options
Uploaded Image: merges.JPG


Unmerge:
Based on our interpretation of the instructions, we thought that by not removing the old geneologies that we had infact maintained an unmerge capability. We were told this is not exactly what was expected. Thus, we should have implemented some way to destroy the merged geneology, and use some sort of history to restore the old geneologies that were used to create the merged geneology.

Conclusion:
This Milestone was easily one of the more difficult and required a lot of thought as well as time to work on it. Start early is the best advice I can give. Also, by starting early, you could probably be able to implement the advanced algorithm, one which would have probably saved us a lot of problems down the line. Overall, it was a good project but there were plenty of areas we could have improved on if we had had more time and if we had started earlier.


Link to this Page