Kierrokset sukupuuohjelmistossa

Olen joidenkin sukupuuohjelmistojen kehittäjä (kirjoitettu C++:lla ja Qt:llä). Minulla ei ollut ongelmia, kunnes yksi asiakkaistani lähetti minulle virheraportin. Ongelmana on se, että asiakkaalla on kaksi lasta oman tyttärensä kanssa, minkä seurauksena hän ei voi käyttää ohjelmistoani virheiden takia.

Nämä virheet ovat seurausta erilaisista väitteistäni ja invarianteistani käsitellystä perhekaaviosta (esimerkiksi syklin kävelemisen jälkeen ohjelma toteaa, että X ei voi olla sekä Y:n isä että isoisä).

Kuinka voin ratkaista nämä virheet poistamatta kaikkia tietovahvistuksia?


person Partick Höse    schedule 28.05.2011    source lähde
comment
comment
Jos jäljität sukupuusi tarpeeksi taaksepäin, törmäät tähän ongelmaan paljon useammin kuin haluaisit. Puuesityksen luopuminen voi olla tuskallista, mutta se olisi lopulta oikeampaa.   -  person Thomas    schedule 01.06.2011
comment
Sinun ei pitäisi lisätä väitteitä epätodennäköisistä asioista, vain mahdottomista asioista. Syklit ovat ilmeisiä asioita, jotka eivät ole mahdollisia sukupuukaaviossa... kukaan ei voi olla oma esi-isänsä millään menetelmällä. Nämä muut väitteet ovat vain vääriä ja ne pitäisi poistaa.   -  person pgod    schedule 01.06.2011
comment
@pgod sen sijaan, että epäonnistuisit näissä väitteissä, mielestäni on hyödyllistä ilmoittaa käyttäjälle epätodennäköisistä asioista ja kertoa heille, että hän saattaa on tehnyt virheen, mutta tarjota joka tapauksessa helppo ja ei-hyväksyttävä tapa jatkaa.   -  person thomasrutter    schedule 01.06.2011
comment
Tämä ei ole ollenkaan typerä kysymys lemmikkieläinten kasvatuksen maailmassa. Tytär isälle, äiti pojalle, sisko veljelle, lapsenlapset isovanhemmille on siellä vakiotekniikka, ja myös lemmikkieläinten kasvattajat tarvitsevat sukupuuohjelmiston. Puhdasrotuinen minun ¤%#&.   -  person kaleissin    schedule 01.06.2011
comment
Tämä kysymys on hyvä esimerkki oletuksista, joita ohjelmistosuunnittelijat tekevät koodia tuottaessaan. Väitteillä ei ole sijaa tuotantokoodissa tilanteisiin, jotka voivat tapahtua.   -  person Johnsyweb    schedule 01.06.2011
comment
Yritätkö vakavasti sulkea tämän subjektiivisena ja kiistanalaisena? Kysymys on minulle täysin selvä, se pyytää ratkaisua puun / kaavion sykliin.   -  person Xeo    schedule 01.06.2011
comment
Saatko saman kiertovirheen, jos serkut menivät naimisiin, esimerkiksi naimisiin menneiden serkkujen lapsi olisi myös vanhemman lapsi, mutta myös vanhemman serkku. Tämä on yleinen skenaario.   -  person Rebecca Chernoff    schedule 01.06.2011
comment
Avioliitto serkkujen kanssa oli erittäin yleistä viktoriaanisessa Englannissa, erityisesti ylempien luokkien keskuudessa (se oli erinomainen tapa pitää rahaa perheessä). Esimerkiksi Charles Darwin meni naimisiin esiserkkunsa Emma Wedgwoodin kanssa. Kaikkien sukupuuohjelmistojen on tuettava tällaisia ​​tilanteita.   -  person rtperson    schedule 01.06.2011
comment
Tiedoksi, linkitetty tähän Redditistä   -  person bgw    schedule 01.06.2011
comment
Asia on siinä, että se ei ole enää teknisesti puu, matemaattisessa mielessä. Heti kun otat käyttöön (insesti-)syklit, siitä tulee täysimittainen kaavio. Joten pyydä asiakasta ostamaan perhekaavio-ohjelma, joka on räätälöity insestuottisia hikkejä varten. :-)   -  person Noldorin    schedule 12.01.2012
comment
Yksi niistä harvoista tapauksista, joissa kolariraportti tulee lähettää poliisille, ei kehittäjälle.   -  person onosendai    schedule 01.12.2012
comment
@pgod: Jos henkilö menee naimisiin miehen äidin kanssa, joka menee naimisiin äitinsä kanssa, hän on oma isoisänsä. On mahdotonta olla oma esi-isäsi geneettisesti, mutta sosiaalisesti se ei ole. Ja useimmat sukupuuohjelmistot seuraavat molempia.   -  person Mooing Duck    schedule 28.02.2013
comment
2013-02-07 tein ehdotuksen. Ehkä siitä on vielä apua jollekin. Tarvittaessa voidaan tehdä kompromissi GEDCOMin vaikeiden rajoitusten kanssa kirjoittamalla henkilö, joka sisältää ryhmän ihmisiä, joilla on tukemattomia suhteita. Asian havainnollistamiseksi kutsuin esimerkkiäni Daddy-Daughter Inc.:ksi. Myönnän avoimesti, että tämä on epämiellyttävää ihmisiä kohtaan, eikä se pysty taltioimaan joitain tosiasioita koneellisesti luettavassa muodossa. Teknisesti, eikö se korjaa paikallista ongelmaa perheen GEDCOM-edustuksessa? Noh. Se miinus-3 ilman kommenttia, joten poistin sen vastauksista.   -  person minopret    schedule 22.12.2013
comment
Siksi väitteet on hyvä haastaa voimakkaasti vaatimuksia kerättäessä. X ei tapahdu. Ok, mutta tarkoittaako se, että X ei tapahdu normaalisti, että X ei tapahdu koskaan tai että X ei voi tapahtua?   -  person Dave Cousineau    schedule 13.10.2014
comment
Missään sukupuussa (aikamatkustusfiktioiden ulkopuolella) ei ole jaksoja, mutta ongelmana tässä on se, että ohjelmasi ei tue suunnattuja asyklisiä kuvaajia, joissa yksi solmu voi toimia useampana kuin yhden tyyppisenä esivanhempana toiselle. Tällaiset kaaviot voivat olla ei-toivottuja joko moraalisesti, sosiaalisesti tai oikeudellisesti, mutta ne eivät ole biologisesti mahdottomia.   -  person chepner    schedule 18.11.2014


Vastaukset (18)


Vaikuttaa siltä, ​​että sinulla (ja/tai yritykselläsi) on perustavanlaatuinen väärinkäsitys siitä, minkä sukupuun oletetaan olevan.

Selvennetään, että työskentelen myös yrityksessä, jonka portfoliossa on (yhtenä tuotteena) sukupuu ja olemme kamppaillut vastaavien ongelmien kanssa.

Ongelma meidän tapauksessamme ja oletan myös sinun tapauksessasi johtuvan GEDCOM-muodosta, joka on erittäin mielissään siitä, millainen perheen tulisi olla. Tämä muoto sisältää kuitenkin vakavia väärinkäsityksiä siitä, miltä sukupuu todella näyttää.

GEDCOMilla on monia ongelmia, kuten yhteensopimattomuus samaa sukupuolta olevien suhteiden kanssa, insesti jne. Mitä tosielämässä tapahtuu useammin kuin uskotkaan (varsinkin kun palataan ajassa taaksepäin 1700-1800).

Olemme mallintaneet sukupuumme sen mukaan, mitä todellisessa maailmassa tapahtuu: Tapahtumat (esimerkiksi syntymät, häät, kihlaukset, liitot, kuolemat, adoptiot jne.). Emme aseta näille mitään rajoituksia, paitsi loogisesti mahdottomia (esim. ei voi olla oma vanhempi, ihmissuhteissa tarvitaan kaksi henkilöä jne...)

Validointien puute antaa meille "todellisemman maailman", yksinkertaisemman ja joustavamman ratkaisun.

Mitä tulee tähän erityistapaukseen, ehdotan väitteiden poistamista, koska ne eivät päde yleisesti.

Ongelmien näyttämiseksi (jotka syntyvät) suosittelen piirtämään saman solmun niin monta kertaa kuin tarvitaan, vihjaten päällekkäisyyteen sytyttämällä kaikki kopiot, kun valitaan yksi niistä.

person Bert Goethals    schedule 01.06.2011
comment
Tämä näyttää oikealta lähestymistavalta, ja sitä on tarpeeksi helppo laajentaa monimutkaisempien ongelmien havaitsemiseksi. Voit laskea joukon A tapahtui ennen B -suhteita tapahtumien välillä. Esimerkiksi, että henkilö on syntynyt ennen muita tapahtumia, joihin hän liittyy. Tämä on suunnattu graafi. Voit sitten tarkistaa, ettei kaaviossa ole syklejä. Katso tämä kysymys StackOverflowsta. Tämän pitäisi olla kunnossa. kunnes aikamatkailu keksittiin. - person Paul Harrison; 01.06.2011
comment
@paul-harrison Jos se olisi vain niin yksinkertaista. Vanhemmissa tietueissa (jopa uusissa) on päivämäärän epäjohdonmukaisuuksia. Kaste ennen syntymää, useat syntymäkirjat jne... Joten jossain määrin virallisissa asiakirjoissa on aikamatkailua. Sallimme nämä epäjohdonmukaiset tiedot. Annamme käyttäjille mahdollisuuden ilmoittaa, mitä sovelluksen tulee ottaa syntymätietueeseen kaksoiskappaleiden tapauksessa. Ja ilmoitamme rikkinäiset aikajanat, jos niitä löytyy. - person Bert Goethals; 01.06.2011
comment
@ben-voigt GEDCOM on Myöhempien Aikojen Pyhien Jeesuksen Kristuksen Kirkon luoma muoto. Eritelmässä todetaan selvästi, että avioliitto (MARR) on miesten ja naisten välinen. Saman sukupuolen avioliitossa tai insestissä tulee käyttää ASSO-tunnistetta (ASSOCIATES), jota käytetään myös ilmaisemaan ystävyyttä tai naapuruutta. On selvää, että samaa sukupuolta olevien avioliitto on toisen luokan suhde tässä spesifikaatiossa. Neutraalempi spesifikaatio ei vaatisi miespuolisia naissuhteita. - person Bert Goethals; 03.06.2011
comment
@Bert Goethals: Sekoitat GEDCOMin tiettyihin ohjelmiin, jotka eivät tue samaa sukupuolta olevien avioliittoa (PAF, Legacy). GEDCOM ei sulje pois rakenteita, kuten 0 @F1@ FAM/1 HUSB @I1@/1 HUSB @I2@, ja tukee siten samaa sukupuolta olevien avioliittoja, jos ohjelmistosi niin päättää. - person Pierre; 17.10.2014
comment
@Pierre Voit todellakin huijata järjestelmää. Tämä on suoraan 5.5.1-asiakirjoista: MARR {Avioliitto}: = Laillinen, yleinen tai tavanomainen tapahtuma, jossa luodaan miehen ja naisen perheyksikkö aviomiehinä ja vaimoina. (homepages.rootsweb.ancestry.com/~pmcbride/gedcom/55gcappa.htm) Kuten näet, täällä ei ole samaa sukupuolta olevien avioliittoa. - person Bert Goethals; 29.10.2014
comment
@Bert Goethals: Tässä on testi, jonka voit helposti suorittaa itse: [1] Luo samaa sukupuolta olevien avioliitto Family Tree Maker -tiedostossa; [2] vienti GEDCOMiin; [3] Tuo GEDCOM-tiedosto RootsMagiciin. Samaa sukupuolta olevien avioliitto säilyy (vg. molemmat kumppanit ovat edelleen miehiä). Miten se tapahtui? Älä sekoita mitä speksit. suosittelee verrattuna siihen, mikä on todella mahdollista. - person Pierre; 30.10.2014
comment
@TylerH Tarkoitin ainakin. Myös mikä tahansa relaatio voidaan ilmaista parien kerrannaisena. Esim: kolmikko voidaan ilmaista 2 suhteena per yksilö. - person Bert Goethals; 11.06.2015
comment
@Pierre Viestini koskee Spec; ei siitä, mitä muut sovellukset yrittävät saavuttaa rikkomalla spesifikaatioita. Tekniset tiedot eivät suosittele. Se, että toteuttajat rikkovat teknisiä tietoja, osoittaa, että spesifikaatio on todellakin virheellinen. - person Bert Goethals; 11.06.2015

Rentoudu väitteesi.

Ei muuttamalla sääntöjä, joista on todennäköisesti erittäin paljon apua 99,9 %:lle asiakkaistasi tietojen syöttämisessä tapahtuneiden virheiden havaitsemisessa.

Sen sijaan muuta se virheestä "ei voi lisätä suhdetta" varoitukseksi "lisää silti".

person Ben Voigt    schedule 28.05.2011
comment
Kun kohtaat erittäin epätodennäköisen tilanteen, eli sellaisen, jossa käyttäjä yleensä teki sen vain vahingossa, on hyvä idea näyttää käyttäjälle varoitus. Se on hyvää palautetta. Mutta anna käyttäjän mennä eteenpäin, jos hän on todella varma, että haluaa. Joten mielestäni tämä on hyvä vastaus, vaikka se ei mene muttereihin ja pultteihin miten. - person thomasrutter; 01.06.2011
comment
Hyvä vastaus! Ihmettelen vain, kuinka tällaiset ohjelmistot selviävät olen oman isoisäni (youtube.com/watch ?v=eYlJH81dSiw) tilanne? - person Zaur Nasibov; 01.06.2011
comment
Tämä ei ole oikeastaan ​​vastaus, koska luulen, että ongelma johtuu puun ylittämisestä? Se on kuitenkin hyvä ehdotus. - person bdwakefield; 01.06.2011
comment
@bdwakefield: Kysymys oli, kuinka korjaan nämä virheet poistamatta kaikkia tietoväitteitä? Uskon, että vastasin siihen. - person Ben Voigt; 01.06.2011
comment
@Ben Se riippuu siitä, mitä väitteet tarkoittavat. Jos ne estävät äärettömiä silmukoita tai kohtalokkaita virheitä tapahtumasta, ehdotat tehokkaasti väitteiden poistamista. Jos ne ovat olemassa vain varoittamaan käyttäjää mahdollisesta virheestä, vastauksesi on hyvä. - person rm999; 01.06.2011
comment
@rm999: Kysymys on melko selvä, että väitteet pannaan voimaan tietorakenteen läpikäynnin jälkeen. - person Ben Voigt; 01.06.2011
comment
@Ben Luulen, että luemme kysymyksen eri tavalla. Minä tulkitsen syklin tarkoittavan sykliä kaaviossa (mikä tarkoittaisi läpikulun aikana). Tämä on järkevää kysymyksen yhteydessä: OP olettaa puurakenteen, ja lapsi, jolla on sama isä ja isoisä, on silmukka eikä siis puu. Monet puun läpikulkualgoritmit epäonnistuvat silmukoilla varustetussa kaaviossa, joten jos kysymykseni on oikein, bdwakefieldillä on täysin oikeutettu pointti. - person rm999; 01.06.2011

Tässä on sukupuiden ongelma: ne eivät ole puita. Ne ovat suunnattuja asyklisiä kuvaajia tai DAG:ita. Jos ymmärrän ihmisen lisääntymisbiologian periaatteet oikein, kiertoja ei tule olemaan.

Tietääkseni kristitytkin hyväksyvät avioliitot (ja siten lapset) serkkujen välillä, mikä tekee sukupuusta perheen DAG:n.

Tarinan moraali on: valitse oikeat tietorakenteet.

person exDM69    schedule 01.06.2011
comment
Se vaatisi lisärajoituksen jokaiselle solmulle, jossa on enintään 1 tai 2 solmua, jotka osoittavat siihen in vitro ja seksuaalista lisääntymistä varten. Vaikka ollakseen todenmukaisempaa, voit sallia useiden katkoviivojen epävarman jälkeläisen isän puolella (aina on selvää, kuka äiti on, mutta vain DNA-testaus voi varmistaa, kuka isä on, ja sitä tehdään harvoin vielä nykyäänkin). tai jopa molemmissa otetaan huomioon adoptio. - person manixrock; 01.06.2011
comment
@manixrock - koska tämä kysymys koskee harvinaisia ​​tapauksia, haluaisin vakuuttaa, että ei aina ole selvää, kuka äiti on. adoptiot, hylätyt vauvat, sijaisäidit jne. voivat kaikki monimutkaistaa asioita. - person Peter Recore; 01.06.2011
comment
Se ei välttämättä ole asyklistä, eihän? Mies-naimisiin-isoäiti. - person Ed Ropple; 03.06.2011
comment
Mies, joka menee naimisiin isoäitinsä kanssa, ei tee itsestään omaa isoisäänsä ja lisää sykliä. Jos heillä on lapsia, se on ei-pyöräilevä säännöllinen kaavion reuna. - person exDM69; 07.06.2011
comment
Se on itse asiassa KAKSI ADG:tä. Siellä on syntyperäkaavio ja oikeussuhdekaavio. Yleensä sama, mutta poikkeava enemmän kuin voisi odottaa. - person JSacksteder; 05.10.2011
comment
Yleisesti ottaen jaksoja tulee olemaan. Ei vain parisuhteen vanhemman syklejä. Suhteessa yleensä, kuten naimisissa, voi hyvinkin olla syklejä, varsinkin kun ottaa huomioon, että nämä suhteet muuttuvat ajan myötä. - person Agrajag; 13.03.2012
comment
Olettaen täydellistä tietoa ja biologiaa, biologisessa sukujuuressa ei ole jaksoja, mutta todellisessa maailmassa sukututkimus on täynnä ehkä-linkkejä. Manxrock yllä esimerkiksi väittää, että on aina selvää, kuka äiti on. Mikä ei pidä paikkaansa todellisessa maailmassa. Kyllä, tänä päivänä DNA-testaus voi vastata tähän kysymykseen, mutta kuinka aiot saada sukulaisensi 5 sukupolven takaa DNA-testattavaksi? - person Agrajag; 13.04.2012

Luulen, että sinulla on jokin arvo, joka yksilöi yksilöllisesti henkilön, johon voit perustaa shekkisi.

Tämä on hankala tapaus. Olettaen, että haluat pitää rakenteen puuna, ehdotan tätä:

Oletetaan tämä: A on lapsia oman tyttärensä kanssa.

A lisää itsensä ohjelmaan nimellä A ja B. Kun kerran isän roolissa, kutsutaan sitä poikaystäväksi.

Lisää is_same_for_out()-funktio, joka kertoo ohjelmasi tuotoksia tuottavalle osalle, että kaikkien linkkien, jotka menevät osoitteeseen B, tulee mennä osoitteeseen A tietojen esittämisen yhteydessä.

Tämä tekee käyttäjälle hieman ylimääräistä työtä, mutta luulen, että IT olisi suhteellisen helppo toteuttaa ja ylläpitää.

Sen pohjalta voit kehittää koodin synkronointia A ja B epäjohdonmukaisuuksien välttämiseksi.

Tämä ratkaisu ei varmasti ole täydellinen, mutta se on ensimmäinen lähestymistapa.

person Eduard Thamm    schedule 28.05.2011
comment
Todennäköisesti tällaiset välityspalvelinsolmut ovat todellakin sopiva ratkaisu. Minulla ei kuitenkaan ole aavistustakaan, kuinka ne voidaan laittaa käyttöliittymään loukkaamatta käyttäjää. Voin kertoa, että oikeiden ihmisten (etenkin asiakkaiden) kanssa tekemisissä olevien ohjelmistojen kirjoittaminen ei ole helppoa. - person Partick Höse; 28.05.2011
comment
Se ei lopu koskaan - B:n uusi poika on hänen oma setänsä. Voisin harkita täyden hyvityksen saamista ohjelmasta! - person Bo Persson; 28.05.2011
comment
@Will A: Ja sitten tajuaa olevansa myös oma äitinsä, ja värvää nuoremman itsensä aikatoimistoon? - person Null Set; 28.05.2011
comment
Tietojen kopioiminen (ja synkronointi) yhden järjestelmän sisällä on huono käytäntö. Se osoittaa, että ratkaisu ei ole optimaalinen ja sitä tulisi harkita uudelleen. Jos ylimääräisiä (kaksoiskappaleita) solmuja tarvitaan, ilmoita se välityspalvelimeksi ja siirrä tietojen luku- ja kirjoitustyöt alkuperäiselle solmulle. - person Bert Goethals; 01.06.2011

Keskity siihen, mikä todella tuottaa ohjelmistollesi arvoa. Onko sen toimimiseen YHDELLÄ kuluttajalle käytetty aika lisenssin hinnan arvoinen? Todennäköisesti ei.

Suosittelen sinua pyytämään anteeksi tältä asiakkaalta, kertomaan hänelle, että hänen tilanteensa ei sovellu ohjelmistollesi, ja myöntämään hänelle hyvitys.

person christopheml    schedule 01.06.2011
comment
Erittäin totta. Mutta punnita myös muita mahdollisia ongelmia samankaltaisten ongelmien kanssa, joita muut ovat tuoneet esiin. - person Prof. Falken; 01.06.2011
comment
Tietysti. Perusteluna on: jos kyseessä on harvinainen reunatapaus ei-kriittisessä sovelluksessa, sinun ei tarvitse korjata tai toteuttaa mitään. Jos se todella vahingoittaa käyttäjiäsi, sen parissa työskenteleminen on arvokasta. - person christopheml; 01.06.2011
comment
Todennäköisesti jokaisella on jokin insestitapaus jossain sukujuurissaan. Joten törmäät siihen, jos sukuhistoriaa kaivetaan (liian) syvälle. - person datenwolf; 13.07.2011
comment
Sukupuun tekeminen jostain oudosta tilanteesta (suosirotuinen rojalti, Fritzl jne.) on pätevää ohjelmiston käyttöä. - person Bulwersator; 07.06.2013
comment
Sukupuuohjelmisto, joka ei salli serkkujen mennä naimisiin, on hyödytön. Lähes kaikissa perheissä on ainakin yksi tapaus tästä. Siksi uskon, että alkuperäinen esimerkki on tehty tehosteeksi. - person Fuzzy76; 26.01.2015

Sinun olisi pitänyt perustaa Atreides-perhe (joko moderni, Dyyni tai muinainen, Oidipus Rex) testaustapauksena. Et löydä vikoja käyttämällä testattua dataa.

person user779752    schedule 01.06.2011
comment
Valitettavasti liian monet ihmiset ajattelevat ensin "ok"-dataa niiden järjestelmiä rikkovien reunatapausten sijaan. - person sjas; 24.12.2012

Tämä on yksi syistä, miksi kielillä, kuten "Go", ei ole väitteitä. Niitä käytetään käsittelemään tapauksia, joita et luultavasti ajatellut liian usein. Sinun tulee väittää vain mahdotonta, ei vain epätodennäköistä. Jälkimmäisen tekeminen antaa väitteille huonon maineen. Aina kun kirjoitat assert(, kävele pois kymmeneksi minuutiksi ja todella ajattele sitä.

Erityisen huolestuttavassa tapauksessanne on sekä ajateltavissa että kauhistuttavaa, että tällainen väite olisi harhaanjohtava harvoissa mutta mahdollisissa olosuhteissa. Siksi käsittele sitä sovelluksessasi, jos vain sanot "Tätä ohjelmistoa ei ole suunniteltu käsittelemään esittämääsi skenaariota".

On järkevää väittää, että isoisoisäsi on mahdoton isäsi.

Jos olisin työskennellyt testausyrityksessä, joka oli palkattu testaamaan ohjelmistoasi, olisin tietysti esittänyt tämän skenaarion. Miksi? Jokainen nuori mutta älykäs "käyttäjä" tekee täsmälleen saman asian ja nauttii tuloksena olevasta "virheraportista".

person Tim Post♦    schedule 01.06.2011
comment
Hyväksy 'milloin väitteitä' -argumentti; en ymmärrä, miten se liittyy "joillakin kielillä on väitteitä, Golla ei." - person phooji; 01.06.2011
comment
@Tim Post Jos tiedät sen olevan mahdotonta, miksi vaivautua väittämään sitä? - person Arlen; 01.06.2011
comment
@Red Hue - joskus kääntäjät tekevät mahdottomasta ... mahdolliseksi. Jotkut gcc:n versiot ajattelevat -10 == 10 abs()-toteutuksessa. - person Tim Post♦; 01.06.2011
comment
@Red Hue: Väitteiden tarkoitus on dokumentoida ja testata olosuhteet, joiden pitäisi aina olla tosia (tai vääriä). Se auttaa estämään sinua (ja muita) korjaamasta asioita siten, että mahdottomia tapauksia syntyy, koska silloin ne rikkoisivat sovelluksen selvästi (eikä hienovaraisesti). Jos mahdottomaksi tapaukselle on pätevä syy, olet väittänyt liikaa. - person cHao; 01.06.2011
comment
@cHao @Tim Post Yritän vain ymmärtää, miksi väitteiden puuttuminen on hyvä asia, koska useimmat teistä ovat yhtä mieltä siitä, että väittäminen on tärkeää. - person Arlen; 01.06.2011
comment
@Red Hue: Luulen, että näkökulma perustuu alkuperäisen kysymyksen kaltaisiin tapauksiin, joissa väitteitä käytetään hieman väärin. Liian (tai liian vähän) väittäminen on yleisempää kuin monet ihmiset ymmärtävät, koska ihmiset harvoin oppivat käyttämään väitteitä oikein. Se on myös dev-time-asia, jota ei useinkaan testata tuotannossa, joten jotkut päättelevät, että paras tapa käsitellä sitä on päästä eroon väitteistä. Olen eri mieltä, mutta suhtaudun hieman sympatiaan sen taustalla oleviin perusteluihin. - person cHao; 01.06.2011
comment
Se, että kielessä on väitteitä tai ei, vaikuttaa tuskin paljoakaan siihen, käyttävätkö kehittäjät koodissaan väitemallia vai eivät. Olen varma, että monet jopa tekevät sen tietämättä, että sitä kutsutaan väitteeksi... - person Prof. Falken; 01.06.2011
comment
Väitteillä (tai väitteen kaltaisella koodilla) ei ole merkitystä. Koodi kielillä, kuten Go, voi tehdä ja tekee oletuksia tiedon rakenteesta; se ei vain voi dokumentoida ja vahvistaa niitä oletuksia väitteillä. Bottom line: sovelluksessa on virhe. - person Tommy McGuire; 02.06.2011
comment
Tällä kysymyksellä ei ole mitään tekemistä kieliominaisuuksien kanssa. - person gvd; 04.03.2012

Inhoan kommentoida näin sotkuista tilannetta, mutta helpoin tapa olla muuttamatta kaikkia invarianttejasi on luoda kuvaajaasi haamuvertex, joka toimii välityspalvelimena takaisin insesti-isälle.

person Sean    schedule 28.05.2011

Olen siis tehnyt jonkin verran työtä sukupuuohjelmiston parissa. Luulen, että ongelma, jota yrität ratkaista, on se, että sinun täytyy pystyä kävelemään puuta joutumatta äärettömiin silmukoihin - toisin sanoen puun on oltava asyklinen.

Näyttää kuitenkin siltä, ​​että väität, että henkilön ja yhden hänen esi-isänsä välillä on vain yksi polku. Se takaa, että jaksoja ei ole, mutta se on liian tiukka. Biologisesti katsottuna jälkeläinen on suunnattu asyklinen kaavio (DAG). Tapaus, joka sinulla on, on varmasti rappeutunut tapaus, mutta tällaista tapahtuu koko ajan suuremmilla puilla.

Jos esimerkiksi katsot 2^n esi-isäsi, jotka sinulla on sukupolvella n, jos päällekkäisyyttä ei olisi, sinulla olisi enemmän esi-isiä vuonna 1000 jKr. kuin ihmisiä oli elossa. Joten päällekkäisyyksiä täytyy olla.

Saatat kuitenkin myös yleensä virheellisiä syklejä, vain huonoja tietoja. Jos kuljet puun poikki, syklit on käsiteltävä. Voit tehdä tämän jokaisessa yksittäisessä algoritmissa tai latauksen aikana. Tein sen kuormituksella.

Todellisten syklien löytäminen puusta voidaan tehdä muutamalla tavalla. Väärä tapa on merkitä jokainen esi-isä tietystä yksilöstä, ja jos kuljetettaessa henkilö, johon aiot astua, on jo merkitty, katkaise linkki. Tämä katkaisee mahdollisesti tarkat suhteet. Oikea tapa tehdä se on aloittaa jokaisesta yksilöstä ja merkitä kullekin esi-isälle polku kyseiseen yksilöön. Jos uusi polku sisältää nykyisen polun alipolkuna, se on sykli, ja sen pitäisi olla rikki. Voit tallentaa polut vektorimuodossa bool> (MFMF, MFFFMF jne.), mikä tekee vertailusta ja tallentamisesta erittäin nopeaa.

On olemassa muutamia muita tapoja havaita jaksoja, kuten lähettää kaksi iteraattoria ja nähdä, törmäävätkö ne koskaan osajoukkotestiin, mutta päädyin käyttämään paikallista tallennusmenetelmää.

Huomaa myös, että sinun ei tarvitse varsinaisesti katkaista linkkiä, voit vain muuttaa sen tavallisesta linkistä "heikkoksi" linkiksi, jota jotkin algoritmeistasi eivät seuraa. Sinun kannattaa myös olla varovainen valitessasi, mikä linkki merkitään heikoksi. joskus voi selvittää missä kierteen pitäisi katketa ​​katsomalla syntymäaikatietoja, mutta usein ei saa selvää, koska dataa puuttuu niin paljon.

person tfinniga    schedule 01.06.2011
comment
Ole varovainen näiden oletusten suhteen; yksi mies ja yksi naisvanhempi eivät ole itsestäänselvyys, kun ihmiset sopeutuvat tai itseään vanhempina pitävät lesibanit voivat lähitulevaisuudessa jopa todella olla biologisesti vanhempia, ainakin tyttöjä. Jos dollya sovelletaan ihmisiin, jopa oletus, että henkilöllä on kaksi erillistä vanhempaa, ei kelpaa. - person Agrajag; 13.03.2012
comment
@Agrajag, kyllä, siksi määritin biologisesti syklin havaitsemisen. Jopa biologisesti on olemassa monia mahdollisia ongelmia, kuten sijaisäidit ja keinosiemennys. Jos sallit myös adoptiot ja muut ei-biologiset menetelmät vanhempien määrittelyyn, on mahdollista, että puussa on oikea kiertokulku - esimerkiksi joku adoptoi isovanhempansa, kun hän vanhenee eikä pysty enää huolehtimaan itsestään. . Oletusten tekeminen ihmisten perhe-elämästä on aina monimutkaista. Mutta kun kirjoitat ohjelmistoja, sinun on tehtävä joitain oletuksia. - person tfinniga; 04.04.2012

Toinen näennäisesti vakava vastaus tyhmään kysymykseen:

Todellinen vastaus on käyttää asianmukaista tietorakennetta. Ihmisen sukututkimusta ei voida täysin ilmaista käyttämällä puhdasta puuta, jossa ei ole sykliä. Sinun pitäisi käyttää jonkinlaista kaaviota. Keskustele myös antropologin kanssa ennen kuin jatkat tätä asiaa, koska on monia muita paikkoja, joissa samanlaisia ​​virheitä voidaan tehdä yritettäessä mallintaa sukututkimusta, jopa yksinkertaisimmassa tapauksessa "länsipatriarkaalisessa yksiavioisessa avioliitossa".

Vaikka haluaisimme jättää huomioimatta paikallisesti tabusuhteet, kuten täällä on käsitelty, on olemassa monia täysin laillisia ja täysin odottamattomia tapoja tuoda syklit sukupuuhun.

Esimerkki: http://en.wikipedia.org/wiki/Cusin_marriage

Pohjimmiltaan serkkujen avioliitto ei ole vain yleinen ja odotettu, vaan se on syy, miksi ihmiset ovat muuttuneet tuhansista pienistä perheryhmistä maailmanlaajuiseksi 6 miljardin väestöksi. Se ei voi toimia millään muulla tavalla.

Sukututkimuksen, perheen ja sukulinjan suhteen on todella vähän universaaleja. Melkein kaikki tiukat oletukset normeista, jotka viittaavat siihen, kuka täti voi olla tai kuka voi mennä naimisiin kenen kanssa tai miten lapset laillistetaan perintötarkoituksessa, voi järkyttyä jostain poikkeuksesta jossain maailmassa tai historiassa.

person clvrmnky    schedule 01.06.2011
comment
Kommenttisi sai minut ajattelemaan moniavioisuutta. Sukututkimusohjelmisto, joka mallintaa vain seksuaalista lisääntymistä, saattaa vaatia siittiöön ja munasoluun liitettävän nimen, mutta laajemmat perherakenteen määritelmät eivät. - person Steve Kalemkiewicz; 03.06.2011
comment
Sukututkimusohjelmisto sallii malliin usein useamman kuin yhden puolison. Mallin näyttäminen näkymässä vaihtelee suuresti, jopa yhden ohjelman sisällä, riippuen tarjotusta tilasta. - person Todd Hopkinson; 31.03.2012

Mahdolliset oikeudelliset vaikutukset sivuun, näyttää varmasti siltä, ​​että sinun on kohdeltava sukupuun "solmua" edeltäjä-henkilönä sen sijaan, että olettaisit, että solmu voi olla yksi ja ainoa henkilö.

Pyydä puusolmua sisältämään henkilö sekä seuraajat - ja sitten voit saada toisen solmun syvemmälle puussa, joka sisältää saman henkilön eri seuraajilla.

person Will A    schedule 28.05.2011

Muutamat vastaukset ovat osoittaneet tapoja säilyttää väitteet/invariantit, mutta tämä vaikuttaa väitteiden/invarianttien väärinkäytöltä. Väitteillä on tarkoitus varmistaa, että jokin, jonka pitäisi olla totta, on totta, ja invarianttien on varmistettava, että jokin, jonka ei pitäisi muuttua, ei muutu.

Väität tässä, että insestisuhteita ei ole olemassa. Selvästikin niitä on olemassa, joten väitteesi on virheellinen. Voit kiertää tämän väitteen, mutta todellinen vika on itse väitteessä. Väite on poistettava.

person kerkeslager    schedule 01.06.2011

Sukupuussasi tulisi käyttää suunnattuja suhteita. Näin sinulla ei ole kiertoa.

person Patrick Cornelissen    schedule 01.06.2011

Sukutieto on syklistä eivätkä mahdu asykliseen kuvaajaan, joten jos sinulla on väitteitä syklejä vastaan, sinun tulee poistaa ne.

Tapa käsitellä tämä näkymässä luomatta mukautettua näkymää on käsitellä syklistä ylätasoa "haamupäänä". Toisin sanoen, kun henkilö on sekä isä että isoisä samalle henkilölle, isoisolmu näytetään normaalisti, mutta isäsolmu muunnetaan "haamu"-solmuksi, jolla on yksinkertainen tunniste, kuten ("katso isoisä") ) ja osoittaa isoisää.

Laskelmien tekemiseksi sinun on ehkä parannettava logiikkaasi syklisten kuvaajien käsittelemiseksi, jotta solmussa ei käydä useammin kuin kerran, jos sykli on olemassa.

person Tyler Durden    schedule 12.12.2012

Tärkeintä on avoid creating a problem, joten uskon, että sinun tulee käyttää suoraa suhdetta välttääksesi kiertokulkua.

Kuten @markmywords sanoi, #sisältää "fritzl.h".

Lopuksi minun on sanottava recheck your data structure. Ehkä siellä on jotain vialla (ehkä kaksisuuntainen linkitetty luettelo ratkaisee ongelmasi).

person Nasser Hadjloo    schedule 06.06.2011

Väitteet eivät kestä todellisuutta

Yleensä väitteet eivät selviä kontaktista todellisen maailman datan kanssa. Se on osa ohjelmistosuunnitteluprosessia päättää, mitä tietoja haluat käsitellä ja mitkä ovat soveltamisalan ulkopuolella.

Sykliset perhekaaviot

Suku "puista" (itse asiassa ne ovat täydellisiä kaavioita, mukaan lukien syklit), on mukava anekdootti:

Menin naimisiin lesken kanssa, jolla oli aikuinen tytär. Isäni, joka vieraili meillä usein, rakastui tyttärepuoleni ja meni naimisiin hänen kanssaan. Tämän seurauksena isästäni tuli poikani ja tyttärestäni äitini. Jonkin ajan kuluttua annoin vaimolleni pojan, joka oli isäni veli, ja setäni. Isäni vaimo (joka on myös tyttäreni ja äitini) sai pojan. Tuloksena sain veljen ja pojanpojan samassa henkilössä. Vaimoni on nyt isoäitini, koska hän on äitini äiti. Olen siis vaimoni aviomies ja samalla vaimoni pojanpoika. Toisin sanoen olen oman isoisäni.

Asiat muuttuvat vieläkin kummallisemmiksi, kun otat huomioon korvikkeet tai "sumean isyyden".

Kuinka käsitellä sitä

Määritä syklit soveltamisalan ulkopuolelle

Voit päättää, että ohjelmistosi ei käsittele tällaisia ​​harvinaisia ​​tapauksia. Jos tällainen tapaus ilmenee, käyttäjän tulee käyttää toista tuotetta. Tämä tekee yleisempien tapausten käsittelystä paljon vankempaa, koska voit säilyttää enemmän väitteitä ja yksinkertaisemman tietomallin.

Lisää tässä tapauksessa ohjelmistoosi hyviä tuonti- ja vientiominaisuuksia, jotta käyttäjä voi tarvittaessa helposti siirtyä toiseen tuotteeseen.

Salli manuaaliset suhteet

Voit antaa käyttäjän lisätä manuaalisia suhteita. Nämä suhteet eivät ole "ensiluokan kansalaisia", eli ohjelmisto ottaa ne sellaisenaan, ei tarkista eikä käsittele niitä päätietomallissa.

Käyttäjä voi sitten käsitellä harvinaisia ​​tapauksia käsin. Tietomallisi pysyy silti melko yksinkertaisena ja väitteesi säilyvät.

Ole varovainen manuaalisten suhteiden kanssa. On houkutus tehdä niistä täysin konfiguroitavissa ja luoda siten täysin konfiguroitavissa oleva tietomalli. Tämä ei toimi: Ohjelmistosi ei skaalaudu, saat outoja bugeja ja lopulta käyttöliittymä muuttuu käyttökelvottomaksi. Tätä estomallia kutsutaan "pehmeäksi koodaukseksi" ja "Päivittäinen WTF" on täynnä esimerkkejä tästä.

Tee tietomallistasi joustavampi, ohita väitteet, testaa invariantteja

Viimeinen keino olisi tehdä tietomallistasi joustavampi. Sinun pitäisi ohittaa melkein kaikki väitteet ja perustaa tietomallisi täydelliseen kaavioon. Kuten yllä oleva esimerkki osoittaa, on helposti mahdollista olla oma isoisäsi, joten sinulla voi olla jopa kiertoja.

Tässä tapauksessa sinun tulee testata ohjelmistoasi perusteellisesti. Sinun piti ohittaa melkein kaikki väitteet, joten on olemassa hyvä mahdollisuus lisävirheille.

Käytä testidatan generaattoria tarkistaaksesi epätavalliset testitapaukset. Haskell, Erlang tai C. Javalle/Scalalle on olemassa ScalaCheck ja Nyaya. Yksi testiidea olisi simuloida satunnaista populaatiota, antaa sen risteytyä satunnaisesti, antaa ohjelmiston sitten ensin tuoda ja viedä tulos. Odotuksena olisi, että kaikki lähdön liitännät ovat myös tulossa ja toisinpäin.

Tapausta, jossa ominaisuus pysyy samana, kutsutaan invariantiksi. Tässä tapauksessa invariantti on joukko "romanttisia suhteita" simuloidun populaation yksilöiden välillä. Yritä löytää mahdollisimman paljon invariantteja ja testaa niitä satunnaisesti luoduilla tiedoilla. Invariantit voivat olla toiminnallisia, esim.

  • setä pysyy setänä, vaikka siihen lisätään "romanttisia suhteita"
  • jokaisella lapsella on vanhempi
  • kahden sukupolven väestöllä on vähintään yksi isovanhempi

Tai ne voivat olla teknisiä:

  • Ohjelmistosi ei kaatu 10 miljardin jäsenen kaaviossa (riippumatta siitä, kuinka monta yhteenliittämistä)
  • Ohjelmistosi skaalautuu O:lla (solmujen määrä) ja O (reunojen lukumäärä^2)
  • Ohjelmistosi voi tallentaa ja ladata uudelleen jokaisen perhekaavion jopa 10 miljardiin jäseneen asti

Suorittamalla simuloituja testejä löydät paljon outoja kulmakoteloita. Niiden korjaaminen vie paljon aikaa. Lisäksi menetät paljon optimointeja, ohjelmistosi toimii paljon hitaammin. Sinun on päätettävä, onko se sen arvoista ja kuuluuko tämä ohjelmistosi piiriin.

person stefan.schwetschke    schedule 26.01.2015

Kaikkien väitteiden poistamisen sijaan kannattaa silti tarkistaa asiat, kuten henkilö on oma vanhempi tai muut mahdottomat tilanteet ja esittää virhe. Ehkä antaa varoituksen, jos se on epätodennäköistä, jotta käyttäjä voi silti havaita yleiset syöttövirheet, mutta se toimii, jos kaikki on oikein.

Tallettaisin tiedot vektoriin, jossa on pysyvä kokonaisluku jokaiselle henkilölle ja tallentaisin vanhemmat ja lapset henkilöihin, joissa mainittu int on vektorin indeksi. Tämä olisi melko nopea siirtyä sukupolvien välillä (mutta hidasta esimerkiksi nimihauissa). Objektit olisivat järjestyksessä sen mukaan, milloin ne on luotu.

person ctype.h    schedule 02.12.2011

Kopioi isä (tai käytä symbolinkkiä/viittausta).

Jos esimerkiksi käytät hierarkkista tietokantaa:

$ #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
person numeric    schedule 13.01.2012
comment
ln -s-komento ei toimi tällä tavalla; linkin resoluutio Family/Son/Father etsii Family/Son/Daughter/Father alta Family/Son, jossa linkki sijaitsee, ei ., jossa annoit ln -s-komennon. - person musiphil; 14.01.2012
comment
kloonaus on kielletty Geneven yleissopimuksissa - person MikeIsrael; 08.11.2012