Chu kỳ trong phần mềm cây gia đình


1594

Tôi là nhà phát triển một số phần mềm cây gia đình (viết bằng C ++ và Qt). Tôi không có vấn đề gì cho đến khi một trong những khách hàng của tôi gửi cho tôi một báo cáo lỗi. Vấn đề là khách hàng có hai con với con gái riêng của họ và do đó, anh ta không thể sử dụng phần mềm của tôi vì lỗi.

Những lỗi đó là kết quả của những khẳng định và bất biến khác nhau của tôi về biểu đồ gia đình đang được xử lý (ví dụ: sau khi đi một chu kỳ, chương trình nói rằng X không thể là cả cha và ông của Y).

Làm cách nào tôi có thể giải quyết các lỗi đó mà không xóa tất cả các xác nhận dữ liệu?



30
Nếu bạn theo dõi cây gia đình của bạn đủ xa, bạn sẽ gặp vấn đề này thường xuyên hơn nhiều so với bạn muốn. Việc từ bỏ đại diện của cây có thể gây đau đớn nhưng cuối cùng sẽ đúng hơn.
Thomas

55
Bạn không nên thêm các xác nhận cho những điều không thể, chỉ những điều không thể. Chu kỳ là những điều hiển nhiên không thể có trong biểu đồ cây gia đình ... không ai có thể là tổ tiên của chính mình thông qua bất kỳ phương pháp nào. Những khẳng định khác chỉ là không có thật và cần được loại bỏ.
pgod

44
Đây hoàn toàn không phải là một câu hỏi ngớ ngẩn trong thế giới chăn nuôi thú cưng. Con gái cho cha, mẹ cho con trai, em gái với anh trai, cháu cho ông bà là kỹ thuật tiêu chuẩn ở đó, và người nuôi thú cưng cũng cần phần mềm cây gia đình. "Nhân giống thuần chủng" của tôi ¤% # &.
kaleissin

31
Kết hôn với anh em họ đầu tiên rất phổ biến ở Anh thời Victoria, đặc biệt là trong giới thượng lưu (đó là một cách tuyệt vời để giữ tiền trong gia đình). Charles Darwin, ví dụ, kết hôn với người anh em họ đầu tiên của mình, Emma Wedgwood. Bất kỳ phần mềm cây gia đình cần phải hỗ trợ các tình huống như thế này.
rtperson

Câu trả lời:


727

Có vẻ như bạn (và / hoặc công ty của bạn) có một sự hiểu lầm cơ bản về những gì mà một cây gia đình được cho là.

Hãy để tôi làm rõ, tôi cũng làm việc cho một công ty có (một trong những sản phẩm của nó) một cây gia đình trong danh mục đầu tư của nó, và chúng tôi đã phải vật lộn với các vấn đề tương tự.

Vấn đề, trong trường hợp của chúng tôi, và tôi giả sử trường hợp của bạn cũng vậy, xuất phát từ định dạng GEDCOM cực kỳ quan tâm về những gì một gia đình nên có. Tuy nhiên định dạng này chứa một số quan niệm sai lầm nghiêm trọng về những gì một cây gia đình thực sự trông như thế nào.

GEDCOM có nhiều vấn đề, chẳng hạn như không tương thích với các mối quan hệ đồng tính, loạn luân, v.v ... Điều đó trong cuộc sống thực xảy ra thường xuyên hơn bạn tưởng tượng (đặc biệt là khi quay ngược thời gian đến 1700-1800).

Chúng tôi đã mô hình hóa cây gia đình của chúng tôi với những gì xảy ra trong thế giới thực: Sự kiện (ví dụ: sinh, cưới, đính hôn, đoàn thể, chết, nhận con nuôi, v.v.). Chúng tôi không đặt bất kỳ hạn chế nào cho những điều này, ngoại trừ những điều không thể về mặt logic (ví dụ: một người không thể là cha mẹ của chính mình, quan hệ cần hai cá nhân, v.v ...)

Việc thiếu xác nhận cho chúng ta một "thế giới thực" hơn, giải pháp đơn giản và linh hoạt hơn.

Đối với trường hợp cụ thể này, tôi sẽ đề nghị loại bỏ các xác nhận vì chúng không giữ được phổ biến.

Để hiển thị các vấn đề (sẽ phát sinh), tôi khuyên bạn nên vẽ cùng một nút nhiều lần nếu cần, gợi ý về sự trùng lặp bằng cách thắp sáng tất cả các bản sao khi chọn một trong số chúng.


32
Đây có vẻ là phương pháp phù hợp và đủ dễ để mở rộng để phát hiện các vấn đề phức tạp hơn. Bạn có thể tìm ra một tập hợp các mối quan hệ "A xảy ra trước B" giữa các sự kiện. Ví dụ, một người được sinh ra trước bất kỳ sự kiện nào khác liên quan đến họ. Đây là một biểu đồ có hướng. Sau đó, bạn có thể kiểm tra xem biểu đồ không chứa chu kỳ. Xem câu hỏi này trên StackOverflow. Điều này sẽ ổn cho đến khi du hành thời gian được phát minh.
Paul Harrison

41
@ paul-harrison Nếu nó chỉ đơn giản vậy thôi. Trong hồ sơ cũ (thậm chí mới) có sự không nhất quán ngày. Rửa tội trước khi sinh, nhiều hồ sơ sinh v.v ... Vì vậy, ở một mức độ nào đó, trong hồ sơ chính thức, có du hành thời gian. Chúng tôi cho phép dữ liệu không nhất quán này. Chúng tôi cho phép người dùng chỉ ra những gì ứng dụng nên xem xét "hồ sơ khai sinh" trong trường hợp trùng lặp. Và chúng tôi sẽ chỉ ra các mốc thời gian bị hỏng nếu được tìm thấy.
Bert Goethals

38
@ ben-voigt GEDCOM là một định dạng được tạo ra bởi Giáo hội Các Thánh hữu Ngày sau của Chúa Giê Su Ky Tô. Thông số kỹ thuật nêu rõ rằng hôn nhân (MARR) là giữa nam và nữ. Đối với hôn nhân đồng giới hoặc loạn luân, nên sử dụng thẻ ASSO (ASSOCIATE), cũng được sử dụng để biểu thị tình bạn hoặc là hàng xóm. Rõ ràng hôn nhân đồng giới là mối quan hệ hạng hai trong thông số kỹ thuật này. Một thông số trung tính hơn sẽ không đòi hỏi quan hệ nam nữ.
Bert Goethals

1
@Bert Goethals: Bạn đang nhầm lẫn GEDCOM với một số chương trình không hỗ trợ hôn nhân đồng giới (PAF, Legacy). GEDCOM không loại trừ các cấu trúc như "0 @ F1 @ FAM / 1 HUSB @ I1 @ / 1 HUSB @ I2 @", và do đó hỗ trợ các cuộc hôn nhân đồng giới nếu phần mềm của bạn chọn.
Pierre

1
@Pierre Bạn có thể gian lận hệ thống thực sự. Đây là trực tiếp từ các tài liệu 5.5.1: "MARR {MARRIAGE}: = Một sự kiện hợp pháp, thông thường hoặc theo thông lệ về việc tạo ra một đơn vị gia đình của một người đàn ông và một người phụ nữ như vợ chồng." ( homepages.rootsweb.ancestry.com/~pmcbride/gedcom/55gcappa.htmlm ) Như bạn có thể thấy, không có hôn nhân đồng giới nào ở đây.
Bert Goethals

563

Thư giãn khẳng định của bạn.

Không phải bằng cách thay đổi các quy tắc, điều này hầu như rất hữu ích cho 99,9% khách hàng của bạn trong việc bắt lỗi khi nhập dữ liệu của họ.

Thay vào đó, thay đổi nó từ một lỗi "không thể thêm mối quan hệ" thành một cảnh báo với "thêm anyway".


143
Khi gặp một tình huống rất khó xảy ra , đó là, một người mà người dùng thường chỉ làm điều đó do nhầm lẫn, đó là một ý tưởng tốt để hiển thị cho người dùng một cảnh báo. Đó là phản hồi tốt. Nhưng sau đó hãy để người dùng đi trước nếu họ thực sự chắc chắn họ muốn. Vì vậy, tôi nghĩ rằng đây là một câu trả lời tốt, ngay cả khi nó không đi vào các loại hạt và bu lông như thế nào.
thomasrutter

15
Câu trả lời tốt! Tôi chỉ tự hỏi, làm thế nào loại phần mềm này sẽ xử lý tình huống "Tôi là ông của riêng tôi" ( youtube.com/watch?v=eYlJH81dSiw )?
Zaur Nasibov

4
Đây không thực sự là một câu trả lời, bởi vì tôi nghĩ vấn đề xuất phát từ việc đi ngang qua cây? Tuy nhiên, đó là một gợi ý tốt.
bdwakefield

3
@bdwakefield: Câu hỏi là "Làm cách nào để khắc phục các lỗi này mà không xóa tất cả các xác nhận dữ liệu?" Tôi tin rằng tôi đã trả lời rằng.
Ben Voigt

2
@Ben Nó phụ thuộc vào những gì khẳng định là cho. Nếu chúng ngăn chặn các vòng lặp vô hạn hoặc lỗi nghiêm trọng xảy ra, thì bạn đang đề xuất loại bỏ các xác nhận một cách hiệu quả. Nếu họ chỉ ở đó để cảnh báo người dùng về một lỗi tiềm ẩn, thì câu trả lời của bạn là một câu hỏi hay.
rm999

224

Đây là vấn đề với cây gia đình: chúng không phải là cây. Chúng là đồ thị theo chu kỳ hướng hoặc DAG. Nếu tôi hiểu chính xác các nguyên tắc sinh học của sinh sản con người, sẽ không có bất kỳ chu kỳ nào.

Theo như tôi biết, ngay cả các Kitô hữu cũng chấp nhận hôn nhân (và cả con cái) giữa anh em họ, sẽ biến cây gia đình thành một DAG gia đình.

Đạo đức của câu chuyện là: chọn cấu trúc dữ liệu phù hợp.


7
Nó sẽ cần một hạn chế hơn nữa của mỗi nút có 1 hoặc 2 nút tối đa chỉ vào nó để sinh sản trong ống nghiệm và tình dục. Mặc dù đúng hơn với cuộc sống thực, bạn có thể cho phép nhiều đường đứt nét cho hậu duệ không chắc chắn ở bên cha (luôn luôn rõ mẹ là ai, nhưng chỉ xét nghiệm DNA mới có thể đảm bảo cha là ai, và điều đó hiếm khi được thực hiện ngay cả ngày nay), hoặc thậm chí cho cả hai là việc áp dụng được tính đến.
manixrock

7
@manixrock - vì câu hỏi này là về những trường hợp hiếm gặp, tôi muốn khẳng định rằng không phải lúc nào cũng rõ người mẹ là ai. nhận con nuôi, em bé bị bỏ rơi, người mẹ thay thế, vv đều có thể làm phức tạp vấn đề.
Peter Recore

9
Nó không nhất thiết phải là acyclic, phải không? Đàn ông-cưới-bà.
Ed Ropple

13
Người đàn ông kết hôn với bà của mình sẽ không biến mình thành ông nội của chính mình và thêm một chu kỳ. Nếu họ có con, đó sẽ là một cạnh đồ thị thông thường không đi xe đạp.
exDM69

11
Đó thực sự là HAI ADG. Có biểu đồ nguồn gốc và biểu đồ quan hệ pháp lý. Thông thường giống nhau, nhưng khác nhau nhiều hơn người ta có thể mong đợi.
JSacksteder

115

Tôi đoán rằng bạn có một số giá trị xác định duy nhất một người mà bạn có thể dựa vào séc của mình.

Đây là một khó khăn. Giả sử bạn muốn giữ cấu trúc một cái cây, tôi đề nghị điều này:

Giả sử điều này: Acó con với con gái riêng của mình.

Athêm mình vào chương trình như AB. Khi đã ở trong vai trò của cha, hãy gọi nó là bạn trai.

Thêm một is_same_for_out()chức năng cho biết phần tạo đầu ra của chương trình của bạn rằng tất cả các liên kết đến Bnội bộ sẽ được Atrình bày về dữ liệu.

Điều này sẽ làm cho một số công việc bổ sung cho người dùng, nhưng tôi đoán CNTT sẽ tương đối dễ thực hiện và duy trì.

Xây dựng từ đó, bạn có thể làm việc trên đồng bộ mã ABđể tránh sự không nhất quán.

Giải pháp này chắc chắn không hoàn hảo, nhưng là một cách tiếp cận đầu tiên.


9
Có lẽ các nút "proxy" như vậy thực sự là giải pháp phù hợp. Tuy nhiên tôi không biết làm thế nào chúng có thể được đưa vào giao diện người dùng mà không xúc phạm người dùng. Tôi có thể nói với bạn rằng viết phần mềm giao dịch với người thật (đặc biệt là khách hàng của bạn) không hề đơn giản.
Partick Höse

6
Nó không bao giờ kết thúc - con trai mới của B sẽ là chú của anh ấy. Tôi sẽ xem xét hoàn trả đầy đủ cho chương trình!
Bo Persson

3
@ Will A: Và sau đó nhận ra anh ấy cũng là mẹ của mình, và tuyển dụng bản thân trẻ hơn vào cơ quan thời gian?
Null Set

2
Sao chép (và đồng bộ hóa) dữ liệu trong một hệ thống là một thực tiễn tồi. Nó chỉ ra rằng giải pháp là tối ưu phụ và cần được xem xét lại. Nếu cần tạo thêm các nút (trùng lặp), hãy chỉ ra nó như một proxy và ủy quyền dữ liệu đọc và ghi vào nút gốc.
Bert Goethals

84

Bạn nên tập trung vào những gì thực sự tạo ra giá trị cho phần mềm của bạn . Là thời gian dành cho việc làm cho nó hoạt động cho MỘT người tiêu dùng có xứng đáng với giá của giấy phép? Có khả năng là không.

Tôi khuyên bạn nên xin lỗi khách hàng này, nói với anh ta rằng tình huống của anh ta nằm ngoài phạm vi của phần mềm của bạn và hoàn lại tiền cho anh ta.


3
Rất đúng. Nhưng cũng cân nhắc các vấn đề tiềm ẩn khác với những rắc rối tương tự mà những người khác đã đưa ra.
Hợp đồng của giáo sư Falken đã vi phạm vào

2
Tất nhiên. Lý do là: nếu đó là trường hợp cạnh hiếm gặp trên một ứng dụng không quan trọng, bạn không cần phải sửa chữa hoặc thực hiện bất cứ điều gì. Nếu nó thực sự làm tổn thương người dùng của bạn, có giá trị khi làm việc với nó.
christopheml

10
Có lẽ mọi người đều có một số trường hợp loạn luân ở đâu đó trong tổ tiên của mình. Vì vậy, bạn sẽ đạt được vết sưng đó nếu một người đào sâu lịch sử gia đình (quá).
datenwolf

1
Làm cây phả hệ của một số tình huống kỳ lạ (hoàng tộc cận huyết, Fritzl, v.v.) là sử dụng phần mềm hợp lệ.
Bulwersator

1
Một phần mềm cây gia đình sẽ không cho phép anh em họ thứ hai kết hôn là vô dụng. Gần như tất cả các gia đình đều có ít nhất một trường hợp này. Đó là lý do tại sao tôi nghĩ rằng ví dụ ban đầu được tạo ra để có hiệu lực.
Fuzzy76

79

Bạn nên thành lập gia đình Atreides (hiện đại, Dune hoặc cổ đại, Oedipus Rex ) làm trường hợp thử nghiệm. Bạn không tìm thấy lỗi bằng cách sử dụng dữ liệu vệ sinh như một trường hợp thử nghiệm.


2
Đáng buồn thay, trước tiên, quá nhiều người nghĩ về dữ liệu 'ok' thay vì các trường hợp phá vỡ hệ thống của họ.
sjas

59

Đây là một trong những lý do tại sao các ngôn ngữ như "Đi" không có xác nhận. Chúng được sử dụng để xử lý các trường hợp mà bạn có thể không nghĩ tới, tất cả quá thường xuyên. Bạn chỉ nên khẳng định những điều không thể, không đơn giản là những điều không thể . Làm sau này là những gì mang lại cho khẳng định một danh tiếng xấu. Mỗi khi bạn gõ assert(, đi bộ trong mười phút và thực sự nghĩ về nó.

Trong trường hợp đặc biệt đáng lo ngại của bạn, cả hai đều có thể hiểu được và kinh hoàng rằng một khẳng định như vậy sẽ không có thật trong những trường hợp hiếm gặp nhưng có thể xảy ra. Do đó, hãy xử lý nó trong ứng dụng của bạn, nếu chỉ nói "Phần mềm này không được thiết kế để xử lý tình huống mà bạn trình bày".

Khẳng định rằng ông cố vĩ đại, vĩ đại, vĩ đại của bạn là cha của bạn là không thể là một điều hợp lý để làm.

Nếu tôi đang làm việc cho một công ty thử nghiệm được thuê để kiểm tra phần mềm của bạn, tất nhiên tôi sẽ trình bày kịch bản đó. Tại sao? Mọi 'người dùng' thông minh nhưng chưa thành niên sẽ làm điều tương tự chính xác và thưởng thức trong 'báo cáo lỗi'.


5
Đồng ý với lập luận 'khi nào nên sử dụng các xác nhận'; đừng xem nó liên quan đến 'một số ngôn ngữ có khẳng định như thế nào, Go không.'
phooji

2
@Red Hue - đôi khi trình biên dịch làm cho điều không thể ... có thể. Một số phiên bản của gcc nghĩ -10 == 10 trong triển khai abs ().
Tim Post

2
@Red Hue: Toàn bộ quan điểm của các xác nhận là ghi lại các điều kiện và kiểm tra phải luôn luôn đúng (hoặc sai). Nó giúp bạn (và những người khác) không "sửa chữa" mọi thứ theo cách mà những trường hợp không thể đó phát sinh, vì sau đó họ rõ ràng (chứ không phải tinh tế) phá vỡ ứng dụng. Nếu có một lý do hợp lệ cho trường hợp "không thể" xuất hiện, thì bạn đã khẳng định quá nhiều.
cHao

1
@cHao @Tim Bài viết Tôi chỉ cố gắng để hiểu tại sao Go không có xác nhận là một điều tốt vì hầu hết các bạn đồng ý rằng khẳng định là quan trọng để có.
Arlen

5
Có các xác nhận (hoặc mã giống như xác nhận) là không liên quan. Mã trong các ngôn ngữ như Go có thể và sẽ đưa ra các giả định về cấu trúc dữ liệu; nó chỉ không thể ghi lại và thực thi những giả định đó với các xác nhận. Tóm lại: ứng dụng có lỗi.
Tommy McGuire

41

Tôi ghét bình luận về một tình huống sai lầm như vậy, nhưng cách dễ nhất để không tái lập tất cả các bất biến của bạn là tạo một đỉnh ảo trong biểu đồ của bạn hoạt động như một proxy trở lại với người cha loạn luân.


37

Vì vậy, tôi đã thực hiện một số công việc trên phần mềm cây gia đình. Tôi nghĩ vấn đề bạn đang cố gắng giải quyết là bạn cần có khả năng đi trên cây mà không phải đi vào những vòng lặp vô hạn - nói cách khác, cây cần phải có tính chu kỳ.

Tuy nhiên, có vẻ như bạn đang khẳng định rằng chỉ có một con đường giữa một người và một trong những tổ tiên của họ. Điều đó sẽ đảm bảo rằng không có chu kỳ, nhưng quá nghiêm ngặt. Về mặt sinh học, hậu duệ là một đồ thị chu kỳ có hướng (DAG). Trường hợp bạn có chắc chắn là một trường hợp thoái hóa, nhưng loại điều đó xảy ra mọi lúc trên các cây lớn hơn.

Ví dụ: nếu bạn nhìn vào tổ tiên 2 ^ n bạn có ở thế hệ n, nếu không có sự trùng lặp, thì bạn sẽ có nhiều tổ tiên vào năm 1000 sau Công nguyên hơn so với những người còn sống. Vì vậy, đã có sự chồng chéo.

Tuy nhiên, bạn cũng có xu hướng nhận được các chu kỳ không hợp lệ, chỉ là dữ liệu xấu. Nếu bạn đi ngang qua cây, thì phải xử lý các chu kỳ. Bạn có thể làm điều này trong từng thuật toán riêng lẻ hoặc khi tải. Tôi đã làm nó trên tải.

Tìm chu kỳ thực trong cây có thể được thực hiện theo một số cách. Cách sai là đánh dấu mọi tổ tiên từ một cá nhân nhất định và khi đi qua, nếu người bạn sẽ bước tới tiếp theo đã được đánh dấu, sau đó cắt liên kết. Điều này sẽ cắt đứt các mối quan hệ có khả năng chính xác. Cách chính xác để làm điều đó là bắt đầu từ mỗi cá nhân và đánh dấu mỗi tổ tiên bằng đường dẫn đến cá nhân đó. Nếu đường dẫn mới chứa đường dẫn hiện tại dưới dạng đường dẫn phụ, thì đó là một chu kỳ và sẽ bị phá vỡ. Bạn có thể lưu trữ các đường dẫn dưới dạng vectơ <bool> (MFMF, MFFFMF, v.v.) để so sánh và lưu trữ rất nhanh.

Có một vài cách khác để phát hiện các chu kỳ, chẳng hạn như gửi hai vòng lặp và xem liệu chúng có từng va chạm với thử nghiệm tập hợp con không, nhưng cuối cùng tôi đã sử dụng phương thức lưu trữ cục bộ.

Cũng lưu ý rằng bạn không thực sự cần phải cắt liên kết, bạn chỉ có thể thay đổi liên kết từ liên kết bình thường thành liên kết 'yếu', không tuân theo một số thuật toán của bạn. Bạn cũng sẽ muốn cẩn thận khi chọn liên kết nào được đánh dấu là yếu; đôi khi bạn có thể tìm ra nơi nên phá vỡ chu kỳ bằng cách xem thông tin ngày sinh, nhưng thường thì bạn không thể tìm ra bất cứ điều gì vì quá nhiều dữ liệu bị thiếu.


Cẩn thận về những giả định đó; Một cha mẹ nam và một nữ không phải là một người được ban cho khi mọi người thích nghi, hoặc những người đồng tính tự coi mình là cha mẹ, trong tương lai gần, họ thậm chí có thể thực sự cha mẹ về mặt sinh học, ít nhất là con gái. Đối với vấn đề đó, nếu chúng ta áp dụng dolly cho con người, ngay cả giả định "một người có hai cha mẹ khác biệt" đã được đưa ra.
Agrajag

1
@Agrajag, vâng, đó là lý do tại sao tôi chỉ định "nói về mặt sinh học" để phát hiện chu kỳ. Ngay cả về mặt sinh học, có rất nhiều vấn đề có thể xảy ra, như người mẹ thay thế và thụ tinh nhân tạo. Nếu bạn cũng cho phép nhận con nuôi và các phương pháp phi sinh học khác để xác định cha mẹ, thì có thể có một chu kỳ thực sự hợp lệ trong cây - ví dụ, có thể ai đó chấp nhận ông bà của họ khi họ già và không còn có thể tự chăm sóc bản thân . Giả định về cuộc sống gia đình của mọi người luôn phức tạp. Nhưng khi viết phần mềm, bạn cần đưa ra một số giả định ..
tfinniga

36

Một câu trả lời nghiêm túc giả cho một câu hỏi ngớ ngẩn:

Câu trả lời thực sự là, sử dụng một cấu trúc dữ liệu thích hợp. Gia phả của con người không thể được thể hiện đầy đủ bằng cách sử dụng một cây thuần túy không có chu kỳ. Bạn nên sử dụng một số loại biểu đồ. Ngoài ra, hãy nói chuyện với một nhà nhân chủng học trước khi tiếp tục với vấn đề này, bởi vì có nhiều nơi khác có thể xảy ra lỗi tương tự khi cố gắng mô hình hóa phả hệ, ngay cả trong trường hợp đơn giản nhất là "hôn nhân gia trưởng phương Tây".

Ngay cả khi chúng ta muốn bỏ qua các mối quan hệ cấm kỵ cục bộ như được thảo luận ở đây, có rất nhiều cách hoàn toàn hợp pháp và hoàn toàn bất ngờ để giới thiệu chu kỳ vào cây gia đình.

Ví dụ: http://en.wikipedia.org/wiki/Cousin_marẩu

Về cơ bản, hôn nhân anh em họ không chỉ phổ biến và được mong đợi, đó là lý do con người đã đi từ hàng ngàn nhóm gia đình nhỏ đến dân số trên toàn thế giới là 6 tỷ. Nó không thể làm việc theo bất kỳ cách nào khác.

Thực sự có rất ít vũ trụ khi nói về phả hệ, gia đình và dòng dõi. Hầu như bất kỳ giả định nghiêm ngặt nào về các quy tắc gợi ý ai là dì, hoặc ai có thể kết hôn với ai, hoặc làm thế nào trẻ em được hợp pháp hóa cho mục đích thừa kế, có thể bị đảo lộn bởi một ngoại lệ nào đó trên thế giới hoặc lịch sử.


9
Nhận xét của bạn làm tôi nghĩ về chế độ đa thê. Phần mềm phả hệ chỉ mô hình sinh sản hữu tính có thể yêu cầu một tên gắn liền với tinh trùng và trứng nhưng định nghĩa rộng hơn về cấu trúc gia đình thì không.
Steve Kalemkiewicz

Phần mềm phả hệ thường sẽ cho phép nhiều hơn một người phối ngẫu trong mô hình. Cách bạn hiển thị mô hình trong chế độ xem rất khác nhau, ngay cả trong một chương trình, tùy thuộc vào "chế độ" đã được cung cấp.
Todd Hopkinson

20

Gợi ý pháp lý tiềm tàng sang một bên, có vẻ như bạn cần phải coi một "nút" trên cây gia đình như một người tiền nhiệm thay vì cho rằng nút đó có thể là người duy nhất.

Có nút cây bao gồm một người cũng như những người kế vị - và sau đó bạn có thể có một nút khác sâu hơn vào cây bao gồm cùng một người với những người kế nhiệm khác nhau.


13

Một vài câu trả lời đã chỉ ra các cách để giữ các xác nhận / bất biến, nhưng điều này có vẻ như là một sự lạm dụng của các xác nhận / bất biến. Các xác nhận là để đảm bảo một cái gì đó là đúng là đúng và bất biến là để đảm bảo một cái gì đó không nên thay đổi sẽ không thay đổi.

Điều bạn đang khẳng định ở đây là mối quan hệ loạn luân không tồn tại. Rõ ràng họ làm tồn tại, vì vậy khẳng định bạn không hợp lệ. Bạn có thể làm việc xung quanh xác nhận này, nhưng lỗi thực sự nằm ở chính khẳng định đó. Khẳng định nên được loại bỏ.


8

Cây gia đình của bạn nên sử dụng quan hệ trực tiếp. Bằng cách này, bạn sẽ không có một chu kỳ.


5

Dữ liệu phả hệ là tuần hoàn và không phù hợp với biểu đồ chu kỳ, vì vậy nếu bạn có xác nhận chống lại chu kỳ, bạn nên loại bỏ chúng.

Cách để xử lý việc này trong chế độ xem mà không tạo chế độ xem tùy chỉnh là coi cha mẹ theo chu kỳ là cha mẹ "ma". Nói cách khác, khi một người vừa là cha vừa là ông nội của cùng một người, thì nút ông nội được hiển thị bình thường, nhưng nút cha được hiển thị dưới dạng nút "ma" có nhãn đơn giản như ("nhìn thấy ông nội" ) và chỉ vào ông nội.

Để thực hiện các phép tính, bạn có thể cần cải thiện logic của mình để xử lý các biểu đồ tuần hoàn để một nút không được truy cập nhiều lần nếu có một chu kỳ.


4

Điều quan trọng nhất là avoid creating a problem, vì vậy tôi tin rằng bạn nên sử dụng mối quan hệ trực tiếp để tránh có chu kỳ.

Như @markmywords đã nói, #include "fritzl.h".

Cuối cùng tôi phải nói recheck your data structure. Có thể có điều gì đó không ổn ở đó (có thể một danh sách liên kết hai chiều giải quyết vấn đề của bạn).


4

Khẳng định không tồn tại thực tế

Thông thường các xác nhận không tồn tại liên hệ với dữ liệu trong thế giới thực. Đó là một phần của quy trình công nghệ phần mềm để quyết định, với dữ liệu nào bạn muốn xử lý và dữ liệu nào nằm ngoài phạm vi.

Đồ thị gia đình tuần hoàn

Về "cây" gia đình (thực tế nó là đồ thị đầy đủ, bao gồm cả chu kỳ), có một giai thoại hay:

Tôi kết hôn với một góa phụ có một cô con gái lớn. Cha tôi, người thường đến thăm chúng tôi, đã yêu con gái riêng của tôi và cưới cô ấy. Kết quả là cha tôi trở thành con trai tôi và con gái tôi trở thành mẹ tôi. Một thời gian sau, tôi cho vợ một đứa con trai, là anh trai của bố tôi và chú tôi. Vợ của bố tôi (cũng là con gái tôi và mẹ tôi) có một đứa con trai. Kết quả là tôi có một anh trai và một cháu trai trong cùng một người. Vợ tôi bây giờ là bà tôi, vì cô ấy là mẹ của mẹ tôi. Vì vậy, tôi là chồng của vợ tôi, đồng thời là cháu nội của vợ tôi. Nói cách khác, tôi là ông của chính tôi.

Mọi thứ trở nên kỳ lạ hơn nữa, khi bạn tính đến những người thay thế hoặc "làm cha mờ nhạt".

Làm thế nào để đối phó với điều đó

Xác định chu kỳ là ngoài phạm vi

Bạn có thể quyết định rằng phần mềm của bạn không nên xử lý các trường hợp hiếm gặp như vậy. Nếu trường hợp như vậy xảy ra, người dùng nên sử dụng một sản phẩm khác. Điều này làm cho việc xử lý các trường hợp phổ biến mạnh mẽ hơn nhiều, bởi vì bạn có thể giữ nhiều xác nhận hơn và một mô hình dữ liệu đơn giản hơn.

Trong trường hợp này, hãy thêm một số tính năng nhập và xuất tốt vào phần mềm của bạn để người dùng có thể dễ dàng di chuyển sang một sản phẩm khác khi cần thiết.

Cho phép quan hệ thủ công

Bạn có thể cho phép người dùng thêm quan hệ thủ công. Các mối quan hệ này không phải là "công dân hạng nhất", tức là phần mềm đưa họ theo nguyên trạng, không kiểm tra chúng và không xử lý chúng trong mô hình dữ liệu chính.

Người dùng sau đó có thể xử lý các trường hợp hiếm bằng tay. Mô hình dữ liệu của bạn sẽ vẫn khá đơn giản và các xác nhận của bạn sẽ tồn tại.

Hãy cẩn thận với các quan hệ thủ công. Có một sự cám dỗ để làm cho chúng có thể cấu hình hoàn toàn và do đó tạo ra một mô hình dữ liệu có thể cấu hình đầy đủ. Điều này sẽ không hoạt động: Phần mềm của bạn sẽ không mở rộng quy mô, bạn sẽ gặp các lỗi lạ và cuối cùng giao diện người dùng sẽ trở nên không sử dụng được. Mô hình chống này được gọi là "mã hóa mềm""WTF hàng ngày" có đầy đủ các ví dụ cho điều đó.

Làm cho mô hình dữ liệu của bạn linh hoạt hơn, bỏ qua các xác nhận, kiểm tra bất biến

Phương sách cuối cùng sẽ làm cho mô hình dữ liệu của bạn linh hoạt hơn. Bạn sẽ phải bỏ qua gần như tất cả các xác nhận và dựa trên mô hình dữ liệu của mình trên một biểu đồ đầy đủ. Như ví dụ trên cho thấy, có thể dễ dàng trở thành ông của chính bạn, vì vậy bạn thậm chí có thể có chu kỳ.

Trong trường hợp này, bạn nên kiểm tra rộng rãi phần mềm của bạn. Bạn đã phải bỏ qua gần như tất cả các xác nhận, vì vậy có một cơ hội tốt cho các lỗi bổ sung.

Sử dụng một trình tạo dữ liệu thử nghiệm để kiểm tra các trường hợp thử nghiệm bất thường. Có thư viện kiểm tra nhanh chóng cho Haskell , Erlang hoặc C . Đối với Java / Scala có ScalaCheckNyaya . Một ý tưởng thử nghiệm sẽ là mô phỏng một quần thể ngẫu nhiên, để nó giao thoa ngẫu nhiên, sau đó cho phần mềm của bạn nhập trước rồi xuất kết quả. Kỳ vọng sẽ là, tất cả các kết nối trong đầu ra cũng nằm trong đầu vào và ngược lại.

Một trường hợp, trong đó một tài sản giữ nguyên được gọi là bất biến. Trong trường hợp này, bất biến là tập hợp "quan hệ lãng mạn" giữa các cá nhân trong dân số mô phỏng. Cố gắng tìm ra càng nhiều bất biến càng tốt và kiểm tra chúng với dữ liệu được tạo ngẫu nhiên. Bất biến có thể là chức năng, ví dụ:

  • một người chú ở lại một người chú, ngay cả khi bạn thêm "quan hệ lãng mạn"
  • mỗi đứa trẻ đều có cha mẹ
  • một dân số có hai thế hệ có ít nhất một ông bà

Hoặc họ có thể là kỹ thuật:

  • Phần mềm của bạn sẽ không gặp sự cố trên biểu đồ lên tới 10 tỷ thành viên (cho dù có bao nhiêu kết nối)
  • Phần mềm của bạn chia tỷ lệ với O (số nút) và O (số cạnh ^ 2)
  • Phần mềm của bạn có thể lưu và tải lại mỗi biểu đồ gia đình lên tới 10 tỷ thành viên

Bằng cách chạy các bài kiểm tra mô phỏng, bạn sẽ tìm thấy rất nhiều trường hợp góc lạ. Sửa chúng sẽ mất rất nhiều thời gian. Ngoài ra, bạn sẽ mất rất nhiều tối ưu hóa, phần mềm của bạn sẽ chạy chậm hơn nhiều. Bạn phải quyết định, nếu nó có giá trị và nếu điều này nằm trong phạm vi phần mềm của bạn.


3

Thay vì xóa tất cả các xác nhận, bạn vẫn nên kiểm tra những thứ như một người là cha mẹ của chính mình hoặc các tình huống không thể khác và đưa ra lỗi. Có thể đưa ra cảnh báo nếu không chắc chắn để người dùng vẫn có thể phát hiện các lỗi đầu vào phổ biến, nhưng nó sẽ hoạt động nếu mọi thứ đều chính xác.

Tôi sẽ lưu trữ dữ liệu trong một vectơ với một số nguyên vĩnh viễn cho mỗi người và lưu trữ cha mẹ và con cái trong các đối tượng cá nhân trong đó int nói là chỉ số của vectơ. Điều này sẽ khá nhanh để đi giữa các thế hệ (nhưng chậm đối với những thứ như tìm kiếm tên). Các đối tượng sẽ theo thứ tự khi chúng được tạo ra.


-3

Sao y cha (hoặc sử dụng symlink / Reference).

Ví dụ: nếu bạn đang sử dụng cơ sở dữ liệu phân cấp:

$ #each person node has two nodes representing its parents.
$ mkdir Family
$ mkdir Family/Son
$ mkdir Family/Son/Daughter
$ mkdir Family/Son/Father
$ mkdir Family/Son/Daughter/Father
$ ln -s Family/Son/Daughter/Father Family/Son/Father
$ mkdir Family/Son/Daughter/Wife
$ tree Family
Family
└── Son
    ├── Daughter
       ├── Father
       └── Wife
    └── Father -> Family/Son/Daughter/Father

4 directories, 1 file

3
Các ln -slệnh không hoạt động theo cách đó; độ phân giải của liên kết Family/Son/Fathersẽ tìm kiếm Family/Son/Daughter/Fathertừ bên dưới Family/Son, nơi liên kết nằm, không phải từ .nơi bạn ban hành ln -slệnh.
musiphil

48
Nhân bản vô tính bị cấm bởi các công ước geneva
MikeIsrael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.