Soru Aile ağacı yazılımında döngü


Bazı aile ağacı yazılımlarının geliştiricisi (C ++ ve Qt'de yazılmış). Müşterilerimden biri bana bir hata raporu gönderene kadar sorunum yoktu. Sorun şu ki, müşterinin kendi kızı olan iki çocuğu var ve sonuç olarak, yazılımımı hatalardan dolayı kullanamıyor.

Bu hatalar, işlenmekte olan aile grafiği ile ilgili çeşitli iddialarımın ve değişimlerin bir sonucudur (örneğin, bir döngüyü yürüttükten sonra, program X'in hem baba hem de Y'nin büyük babası olamayacağını belirtir).

Tüm veri iddialarını kaldırmadan bu hataları nasıl çözebilirim?


1594
2018-05-28 18:39


Menşei


Yazılımın satışını zorlu aile durumlarına girmekten kaçınanlara sınırlamanız gerektiği gibi geliyor! Birinin kendi kızı olan çocukları nasıl olur? Umarım gelini hakkında konuşuyorsunuzdur! - Will A
Açıkçası yazılımınızı Ray Stevens'ın şarkısıyla aklınızda bulundurmalısınız. - Peter K.
Bu kendinize sormanız gereken durumlardan biri olabilir: Bu adamla gerçekten iş yapmak istiyor muyum?  Başka bir çözüm de ona karşı suç duyurusunda bulunmaktır. Her şeyden önce, dünyanın çoğunda ensest yasaktır. Son olarak, yazılımınız zaten bozuldu, çünkü (yasal olarak) bir aile ağacında döngülere sahip olabilirsiniz: kuzenlerin çoğu (tümü?) Batı ülkelerinde evlenmelerine izin verilir. - sbi
Olası şeylere, sadece imkansız şeylere dair iddialar eklememelisiniz. Döngü, bir aile ağacı grafiğinde mümkün olmayan belli şeylerdir ... hiç kimse, kendi metoduyla kendi ataları olamaz. Bu diğer iddialar sadece sahte ve kaldırılmalıdır. - pgod
Belki bir dahaki sefere daha soyut bir örnek deneyeceksin. Buradaki insanlar ensest parçasını göz ardı edemez ve sadece ağacın verilerinin temsili ile ilgili geçerli bir soru olsa bile kapatamazlar. - stesch


Cevaplar:


Görünüşe göre (ve / veya şirketiniz) bir aile ağacının olması gerektiği konusunda temel bir yanlış anlama var.

Açıklığa kavuşturalım, aynı zamanda (ürünlerinden biri olarak) portföyünde bir aile ağacına sahip bir şirket için çalışıyorum ve benzer sorunlarla boğuşuyoruz.

Sorun, bizim durumumuzda, ve senin davasını da kabul ediyorum, GEDCOM Bir ailenin ne olması gerektiği konusunda son derece açık bir format. Bununla birlikte, bu biçim, bir aile ağacının gerçekte neye benzediğine dair bazı ciddi yanlış düşünceler içermektedir.

GEDCOM'un aynı cinsiyetten olan ilişkilerle, ensestle, vb. Uyumsuzluk gibi pek çok sorunu vardır. Gerçek hayatta, hayal edeceğinizden daha sık gerçekleşen (özellikle 1700-1800'e kadar geriye giderken).

Aile ağacımızı gerçek dünyada neler olduğuna modelledik: Olaylar (örneğin doğumlar, düğünler, nişanlar, sendikalar, ölümler, evlat edinme, vs.). Mantıken imkansız olanlar dışında bunlara herhangi bir kısıtlama getirmeyiz (örneğin, kişinin kendi ebeveyni olamaz, ilişkilerin ikiye ihtiyacı vardır, vb.)

Doğrulamaların olmaması bize daha "gerçek bir dünya", daha basit ve daha esnek bir çözüm sunar.

Bu özel duruma gelince, iddiaları evrensel olarak tutmadıkları için kaldırmayı öneririm.

Sorunları görüntülemek için (ortaya çıkacak), ihtiyaç duyulduğu kadar aynı düğümü çizmeyi öneririm, kopyalardan birini seçerek tüm kopyaları yakarak çoğaltmaya işaret edebilirim.


727
2018-06-01 08:25



Bu doğru yaklaşım gibi görünüyor ve daha karmaşık sorunları tespit etmek için genişletmek için yeterince kolaydır. Olaylar arasında "B'den önce gerçekleşen" bir ilişkiyi çalıştırabilirsiniz. Örneğin, bir kişi onları ilgilendiren başka olaylardan önce doğmuştur. Bu yönlendirilmiş bir grafiktir. Daha sonra grafiğin döngü içermediğini kontrol edebilirsiniz. StackOverflow ile ilgili bu soruya bakın.  Bu zaman yolculuğu icat edilene kadar tamam olmalıdır. - Paul Harrison
@ paul-harrison Eğer sadece bu kadar basitse. Eski kayıtlarda (yenileri bile) tarih tutarsızlıkları vardır. Doğumdan önce vaftiz, çoklu doğum kayıtları vb. Yani bir dereceye kadar resmi kayıtlarda zaman yolculuğu vardır. Bu tutarsız verilere izin veriyoruz. Kullanıcıların, uygulamanın, yinelenen durumlarda "doğum" kaydını ne gibi düşünmesi gerektiğini belirtmelerine izin veriyoruz. Ve eğer bulunursa bozuk zaman çizelgelerini gösteririz. - Bert Goethals
@ ben-voigt GEDCOM, Son Zaman Azizler İsa Mesih Kilisesi tarafından oluşturulan bir formattır. Spesifikasyon, evlilik (MARR) 'in kadınlarla erkekler arasında olacağını açıkça belirtmektedir. Aynı cinsiyetten evlilik veya ensest için ASSO etiketi kullanılmalıdır (ASSOCIATES), arkadaşlığı veya komşu olduğunu belirtmek için de kullanılır. Bu eşcinsel evliliğin, bu spekülasyonda ikinci sınıf bir ilişki olduğu açıktır. Daha tarafsız bir özellik, erkek kadın ilişkilerini gerektirmeyecektir. - Bert Goethals
@Bert Goethals: GEDCOM'u, aynı cinsiyetten evliliği desteklemeyen bazı programlarla karıştırıyorsunuz (PAF, Legacy). GEDCOM, "0 @ F1 @ FAM / 1 HUSB @ I1 @ / 1 HUSB @ I2 @" gibi yapıları engellemez ve böylece yazılımınız seçerse eşcinsel evlilikleri destekler. - Pierre
@Pierre Sistemi gerçekten hile yapabilirsiniz. Bu doğrudan doğruya 5.5.1 dokümandan: "MARR {MARRIAGE}: = Bir erkek, bir kadın ve bir kadın ve bir eş olarak bir aile birimi oluşturmanın hukuki, ortak kanunu veya alışılmışın olayı." (homepages.rootsweb.ancestry.com/~pmcbride/gedcom/55gcappa.htm) Gördüğünüz gibi, burada eşcinsel evlilik yok. - Bert Goethals


İddialarınızı rahatlatın.

Müşterilerinizin% 99,9'unun verilerini girmede hata yakalamada büyük olasılıkla çok yararlı olabilecek kuralları değiştirerek değil.

Bunun yerine, "yine de ekle" ile bir uyarıya "ilişki ekleyemiyorum" hatadan değiştirin.


564
2018-05-28 19:20



Bir karşılaşma ile karşılaştığınızda pek olası değil Durum, yani, bir kullanıcının genellikle Sadece yanlışlıkla yapmak, kullanıcıya bir uyarı göstermek için iyi bir fikirdir. Bu iyi bir geri bildirim. Ama sonra kullanıcı eğer devam ederse Gerçekten mi emin olmak istiyorlar. Öyleyse bence bu nasıl bir cevabın ve cıvatanın içine girse de, bu iyi bir cevap. - thomasrutter
İyi cevap! Merak ediyorum, bu tür bir yazılım nasıl "Kendi büyükbabam benim"youtube.com/watch?v=eYlJH81dSiw) durum? - Zaur Nasibov
Bu gerçekten bir cevap değil, çünkü sorunun gerçekte ağacın içinden geçmesinden mi geldiğini düşünüyorum? Ancak, bu iyi bir öneridir. - bdwakefield
@bdwakefield: Soru "Tüm veri iddialarını kaldırmadan bu hataları nasıl çözebilirim?" Ben buna cevap verdiğime inanıyorum. - Ben Voigt
@Ben iddiaların ne için olduğuna bağlı. Sonsuz döngüleri veya ölümcül hataların olmasını engellerlerse, etkili bir şekilde iddiaları kaldırmanızı öneririz. Eğer potansiyel bir hatadan bir kullanıcıyı uyarmak için oradalarsa, cevabınız iyi bir cevaptır. - rm999


İşte aile ağaçlarıyla ilgili problem: onlar ağaç değiller. Bunlar asiklik grafikleri veya DAG'leri yönlendirir. İnsan üreme biyolojisinin ilkelerini doğru olarak anlarsam, herhangi bir döngü olmayacaktır.

Bildiğim kadarıyla, Hıristiyanlar bile, aile ağacını bir aile DAG'sine dönüştürecek olan kuzenler arasındaki evlilikleri (ve dolayısıyla çocukları) kabul ederler.

Hikayenin ahlakı: Doğru veri yapılarını seçmek.


224
2018-06-01 09:58



Her düğümün in vitro ve seksüel reprodüksiyona işaret eden 1 veya 2 maksimum noduna sahip olan bir başka kısıtlamaya ihtiyacı olacaktır. Gerçek yaşam için daha doğru olmakla birlikte, baba tarafında belirsiz aşırılık için çok kesikli çizgilere izin verebilirsiniz (annenin kim olduğu her zaman açıktır, fakat sadece DNA testi, babanın kim olduğunu garanti edebilir ve bu da bugün nadiren yapılır), ya da her ikisi için de benimseme kabul edilir. - manixrock
@manixrock - bu soru nadir vakalarla ilgili olduğundan, annenin kim olduğu her zaman açık olmadığını iddia etmek isterim. evlat edinme, terk edilmiş bebekler, vekil anneler, vb. - Peter Recore
Bu mutlaka asiklik değil, değil mi? Man-evlenmekteydi annesi. - Ed Ropple
Onun büyükannesiyle evlenen adam, kendi büyükbabasını yapmaya ve bir döngü eklemeyecek. Çocukları varsa, bir bisiklet olmayan düzenli grafik kenarı olacaktır. - exDM69
Aslında İKİ ADG. Parentage grafiği ve yasal ilişki grafiği var. Genellikle aynı, ama ıraksaklardan daha fazlası beklenebilir. - JSacksteder


Çeklerinizi üsleyebileceğiniz bir kişiyi benzersiz olarak tanımlayan bir değeriniz olduğunu düşünüyorum.

Bu zor bir şey. Yapısını bir ağaç tutmak istediğinizi varsayalım, şunu öneriyorum:

Bunu varsayın: A kendi kızı olan çocukları var.

A kendini programa ekler A ve benzeri B. Bir zamanlar babanın rolünde, ona erkek arkadaş diyelim.

Ekle is_same_for_out() programınızın çıktı üreten kısmını söyleyen fonksiyonun tüm linklere gideceği B dahili olarak gitmeli A verilerin sunumu.

Bu, kullanıcı için biraz daha fazla iş çıkaracaktır, ancak BT'nin uygulanması ve bakımı nispeten kolay olacaktır.

Bundan yola çıkarak kod eşleme üzerinde çalışabilirsiniz. A ve B tutarsızlıkları önlemek için.

Bu çözüm kesinlikle mükemmel değildir, ancak ilk yaklaşımdır.


115
2018-05-28 18:50



Muhtemelen bu tür "proxy" düğümleri gerçekten uygun bir çözümdür. Bununla birlikte, kullanıcı arayüzünde kullanıcıyı rahatsız etmeden nasıl kullanabileceğine dair hiçbir fikrim yok. Size gerçek insanlarla (özellikle müşterileriniz) ilgilenen yazı yazmanın kolay olmadığını söyleyebilirim. - Partick Höse
Asla bitmez - B yeni oğlu kendi amcası olacak. Program için tam bir geri ödeme düşünürdüm! - Bo Persson
Jup, berbat bir durumdur. C ++ ile satır içi prolog mümkün mü? - Eduard Thamm
@Will A: O zaman kendi annesinin de olduğunu fark eder ve gençliğini zaman ajansına dahil eder mi? - Null Set
Tek bir sistemde verilerin çoğaltılması (ve senkronizasyonu) kötü bir uygulamadır. Çözümün optimal olduğunu ve tekrar gözden geçirilmesi gerektiğini belirtir. Ek (çoğaltılmış) düğümler oluşturmak gerekirse, bunu bir proxy olarak belirtin ve verileri okuyarak orijinal düğüme yazar. - Bert Goethals


Üzerinde durmalısın yazılımınız için gerçekten değer veren nedir. Bir tüketici için lisans bedeli değerinde çalışmak için harcanan zaman mı? Muhtemelen değil.

Bu müşteriden özür dilemenizi tavsiye ediyorum, onun durumunun yazılımınızın kapsamı dışında olduğunu ve kendisine geri ödeme yapacağını söyleyin.


84
2018-06-01 08:51



Çok doğru. Ancak diğer potansiyel problemleri de diğerlerinin getirdiği benzer sorunlarla tartın. - Prof. Falken
Tabii ki. Akıl yürütme: kritik olmayan bir uygulamada nadir görülen bir durumsa, herhangi bir şeyi düzeltmeniz veya uygulamanız gerekmez. Kullanıcılarınızı gerçekten incitiyorsa, üzerinde çalışmanın değeri var. - christopheml
Muhtemelen herkesin kendi atalarında bir yerlerde ensest vardır. Yani aile öyküsünü (yani) derinden kazarsa o yumruğa çarparsın. - datenwolf
Bazı garip durumların soy ağacı yapması (kısaltılmış telif hakkı, Fritzl vb.) Yazılımın geçerli kullanımıdır. - Bulwersator
İkinci kuzenlerin evlenmelerine izin vermeyecek bir aile ağacı yazılımı işe yaramaz. Neredeyse tüm ailelerin en az bir vakası var. Bu yüzden asıl örneğin etki için oluşturulduğunu düşünüyorum. - Fuzzy76


Sen kurmalısın Atreides aile (modern, kumulya da antik, Oedipus rex) bir test vakası olarak. Bir test vakası olarak sterilize edilmiş verileri kullanarak hataları bulamazsınız.


79
2018-06-01 16:10



Ne yazık ki, çok fazla insan ilk önce, sistemlerini bozan kenar durumları yerine 'tamam' verileri düşünmektedir. - sjas


Bu, "Go" gibi dillerin iddiaların olmaması nedenlerinden biridir. Muhtemelen hiç düşünmediğiniz vakaları ele almak için kullanılırlar. Sadece imkansızı, sadece muhtemel değil, iddia etmelisin. İkincisi, iddialara kötü bir itibar getiren şeydir. Her yazışınızda assert(, on dakika yürüyün ve Gerçekten mi bunu düşün.

Özellikle rahatsız edici durumunuzda, bu tür bir iddianın nadir ama olası koşullar altında sahte olacağı düşünülebilir ve korkutucudur. Bu nedenle, yalnızca "Bu yazılım, sunduğunuz senaryoyu ele alacak şekilde tasarlanmamış" ifadesini kullanarak uygulamanıza geçirin.

Büyük, büyük, büyük dede babanın imkansız olduğunu iddia etmek makul bir şeydir.

Yazılımınızı test etmek için işe alınmış bir test şirketi için çalışıyor olsaydım, elbette bu senaryoyu sunmuş olurdum. Niye ya? Her çocuk henüz akıllı 'kullanıcı' yapacak aynı şey ve sonuçta ortaya çıkan 'hata raporu' ile ilgilenin.


59
2018-06-01 06:10



Donmuş spermi unutma. - Prof. Falken
'İddiaların ne zaman kullanılacağı' argümanı ile katılıyorum; 'Bazı dillerin öne sürdüğü, gitmemesi' ile nasıl bir ilişki kurduğunu anlamıyorum. - phooji
@Red Hue - bazen derleyiciler imkansızı mümkün kılar. Gcc'nin bazı versiyonları abs () uygulamasında -10 == 10'u düşünmektedir. - Tim Post♦
@Red Hue: Bütün iddia noktaları, her zaman doğru (veya yanlış) olması gereken belgeleri belgelemek ve test etmektir. Bu (ve diğerleri), bu imkansız vakaların ortaya çıkacağı şekilde, şeyleri "sabitlemekten" sakınmaya yardımcı olur, o zaman onlar açıkça (yerine ince bir şekilde) uygulamayı bozarlar. Eğer "imkansız" bir vakanın görünmesi için geçerli bir sebep varsa, o zaman çok fazla iddia ettiniz. - cHao
İddialara sahip olmak (ya da iddiaya benzeyen kod) ilgisizdir. Go gibi dillerde kod, verilerin yapısı hakkında varsayımlar yapabilir ve yapar; Bu varsayımları iddialarla belgeleyemez ve uygulayamaz. Alt satır: uygulamanın bir hatası var. - Tommy McGuire