我 (用 c + + 和 Qt 编写) 一些家谱软件的开发人员。我没有任何问题,直到我的客户之一发送错误报告。问题是客户有他们自己的女儿,两个孩子,因此,他不能使用我的软件由于错误。

这些错误是我各种断言和有关家庭关系图 (例如后遍历循环、 X 不能将两者 father 的程序状态和 Y 的祖父) 正在处理的固定条件的结果。

如何解决这些错误而不会移除所有数据断言?

2011-05-28 18:39:28
问题评论:

像您这样的声音应该限制为避免进入到棘手的家庭情况的那些软件的销售 !如何 does 有一个孩子有他自己的女儿-我希望您正在谈论他的 daughter-in-law !

显然应该记住记射线 Stevens 歌曲与您的软件。

这可能是这种情况下,您需要自问︰做我真的想要进行业务往来的家伙吗?另一个解决方案是按犯罪针对他的费用。毕竟,在世界上,大部分已禁止 incest。最后,您的软件被破坏,因为 (法律上) 可以在家族树中有循环︰ 允许兄弟一样嫁在大多数 (所有?) 的西方国家。

您不应该添加断言为不太可能的事情,只是不可能的事情。周期是明显不可能...家谱关系图中的任何人可以将他自己祖先通过任何方法。这些其他断言都只是虚假,并应删除。

也许下一次您将尝试一个更抽象的例子。这里的人不能忽视的 incest 部分并关闭它,即使它是一个有效的类似数据树的表示有关的问题。

回答:

它似乎您 (或您的公司) 有基本的家族树是要被误解。

让我澄清,我也适用于其产品阵容中的家谱具有 (作为其产品之一) 的公司和我们有已困扰类似的问题。

问题,在我们的例子中,我假定您种情况下,来自极一时间有关应是什么一系列的GEDCOM格式。但是这种格式包含一些关于什么家族之树的真实面目的严重误解。

GEDCOM 有很多问题,如不兼容性相同的性别关系、 incest,等等...在现实生活中发生次数多于 (尤其当回到时间 1700年-1800年) 您能想象得到。

我们具有建模的情况在现实生活中我们家族树︰ 事件 (例如,生孩子、 婚礼、 合作、 联合、 死亡、 adoptions 等)。我们不要将任何限制放在其中,但逻辑上是不可能的 (例如,一个不能为自己的父,关系需要两个人,等等。..)

验证没有为我们提供了更实际、 更简单、 更灵活解决方案。

对于此特定的情况下,建议删除断言通用无法容纳。

用于显示出现的问题 (将) 建议绘图根据需要通过选择其中之一的所有副本上的光照在重复提示多次相同的节点。

这看起来像是正确的方法,并很容易扩展,来检测更复杂的问题。您可以处理出一套"happened B 之前"两个事件之间的关系。例如,一个人出生之前涉及的任何其他事件的。这是定向关系图。然后您可以检查该图形不包含任何循环。在 StackOverflow 上看到这个问题。直到时间旅行被发明了,这应该是确定。

@paul-harrison 如果它其中只是这么简单。在较早的记录 (甚至是新的) 有日期不一致。Baptism 之前出生,多个出生记录等...因此而言,在官方的记录,没有时间旅行。我们允许这些不一致的数据。我们允许用户指示该应用程序应考虑"地重复项时的出生记录。如果我们将指示中断时间线和发现。

@ben-voigt GEDCOM 是通过教堂的 Jesus Christ 的 Latter-day Saints 创建的格式。规范明确指出,结婚 (MARR) 的男士和女士之间。标记应为同一性别结婚或 incest 也使用 (关联),也用来表示友谊或网上邻居。很明显相同的性别结婚是此规范中的第二个类关系。一个更中性的规范不会要求男的女的关系。

@Bert Goethals︰ 您是混乱与某些程序不支持同一性别结婚 (PAF 的传统) 的 GEDCOM。GEDCOM 不排除构造如"0 @F1@ FAM/1 HUSB @I1@/1 HUSB @I2@",并因此支持同一性别 marriages,如果您的软件选择到。

@Pierre 可以招数确实系统。这是直接从 5.5.1 文档:"MARR {结婚}: = 创建的男士和女士的丈夫和妻子作为家庭单位的法律,common-law,或习惯事件。"(homepages.rootsweb.ancestry.com/~pmcbride/gedcom/55gcappa.htm)正如您所看到的没有相同的性别结婚。

放松您的断言。

不能通过更改规则,哪些是最有可能为 99.9%的客户在捕获输入他们的数据中的错误非常有用。

相反,从错误"无法添加关系"警告"添加服务器"以更改它。

遇到时不太可能的情况下,即一个用户,通常会才做它错误地,是一个好主意,以向用户显示一条警告。这就是很好的反馈。但是,然后让用户提前它们真的确定想要转。因此,我认为这是一个很好的答案,即使它不会进入方式的螺母和螺栓。

很好 !我只是想知道,这种软件将如何处理"我是我自己的爷爷"(youtube.com/watch?v=eYlJH81dSiw) 的情况?

这并不是答案,因为我认为该问题来自于实际遍历树吗?但是,它是很好的建议。

@bdwakefield︰ 这个问题是"如何解决这些错误,而不会移除所有数据断言?"我相信我回答的。

这取决于这些断言的是 @Ben。如果他们防止无限循环或致命错误发生,然后有效地建议去断言。如果它们只是存在潜在错误的用户发出警告,您的答案将是一个很好。

下面是家庭树的问题︰ 它们不是树。它们是定向非循环图或 Dag。如果我正确理解的人擅自生物学的原则,不会任何循环。

据我所知,即使 Christians 两兄弟一样,会变为一系列 DAG 家族树之间接受 marriages (和孩子)。

故事的故事的寓意是︰ 选择适当的数据结构。

它需要每个节点都有 1 或 2 在 vitro 和性复制指向它的最大节点的进一步限制。虽然要更好为 true,则实际生活中,您可能在父亲端 (它是始终明确谁是母亲,但只有 DNA 测试可以确保谁是父亲,和很少甚至今天做的),允许多个用于确定 descendancy 的虚线或甚至两个采用考虑在内。

@manixrock-因为这个问题是关于极少数情况下,我想声明,并不总是清楚的母亲是谁。adoptions、 放弃的孩子,代理妈妈等可以使所有的问题。

不一定非循环,是这样吗?人的眼界的老奶奶。

奶奶在保护他的人不会使自己他自己祖父并添加一个周期。如果他们有孩子,将非重启常规图表边缘。

它是实际的两个 ADGs。还有 parentage 图和法律的关系图。通常相同,但分歧多于 1 所料。

我猜有一些值唯一标识可以基于您的检查人员。

这是一个棘手的问题。假设您想要保留一个树的结构,我建议这︰

假设它︰A

A将自己添加为AB的程序。一次父亲的角色,我们叫它男朋友。

添加通知生成程序内部转到B的所有链接应该对演示文稿的数据转到A部分的输出的is_same_for_out()函数。

这将使一些额外工作的用户,但我猜 IT 将会相对容易实现和维护。

与构建,您可以处理代码同步AB ,以避免不一致的情况。

此解决方案是肯定不是完美,但第一种方法。

可能这种"代理服务器"节点是确实合适的解决方案。但是我已经不知道如何可以那些放在用户界面中不违犯的用户。我可以告诉您编写软件来处理真实的人 (尤其是客户) 不容易。

它永远不会结束-B 的新儿子将他自己的伯父。我会考虑的程序获得全额退款 !

Jup 是一种全乱了的情况。在 c + + 可能是内联序言码?

@Will a:,然后再认识到他也是他自己的母亲,到时间机构吸引他年轻的自我?

重复 (和同步) 在一个系统内的数据是错误的做法。它指示是欠优化的解决方案,并应重新考虑。如果创建额外将需要 (重复) 的节点,表示它为代理和代理的数据读取和写入原始节点。

您应侧重于实际产生值为您的软件在使其适用于许可证的价格值得一个消费者花费的时间吗?可能不是。

我建议您先告诉他他的情况是软件的范围之外,他发出退款歉意向此客户。

非常真实。但是,也对其他人所提出的类似问题的其他潜在问题进行权衡。

答案是肯定的。理由是︰ 如果非关键的应用程序上的极少数个案,您都不需要修复或实施任何措施。它实际上采用您的用户,如果值中没有从事它。

可能每个人都有 incest 的某些情况下某个地方在他/她的血统。因此将命中该凸块如果一个 digs (太) 深的家族病史。

使分层结构树的一些奇怪的情况 (inbreed 版税,Fritzl 等) 是有效使用软件。

不允许结婚的第二个兄弟一样的家谱软件是无用的。几乎所有家庭都有至少一种情况下。这正是我认为原始示例组成的影响。

内容来源于Stack Overflow Cycles in family tree software
请输入您的翻译

Cycles in family tree software

确认取消