Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Αλγόριθμος για έλεγχο συσχετίσεων

Îåêßíçóå áðü ôï ìÝëïò Ευθύμης Δημόπουλος. Τελευταία δημοσίευση από το μέλος Markos στις 14-06-2010, 15:13. Υπάρχουν 15 απαντήσεις.
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-04-2010, 11:23 58036

    Αλγόριθμος για έλεγχο συσχετίσεων

    Καλημέρα σε όλους,

    Μέσα από Console Application (Αρχικά) θέλω να κάνω το εξής:
    Έστω ότι έχω ένα πλήθος παρατηρήσεων:
    (Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ)
    όπου οι σχέσεις μεταξύ τους χαρακτηρίζονται με 1 αν σχετίζονται και 0 αν δεν σχετίζονται
    δηλ.
    Α-Β:1
    Α-Γ:1
    Α-Δ:1
    Α-Ε:1
    Α-Ζ:0
    Α-Η:0

    Β-Γ:1
    Β-Δ:0
    Β-Ε:0
    Β-Ζ:1
    Β-Η:1

    Γ-Δ:1
    Γ-Ε:1
    Γ-Ζ:0
    Γ-Η:1

    Δ-Ε:1
    Δ-Ζ:0
    Δ-Η:1

    Ζ-Η:1


    θέλω λοιπόν να κατατάξω τις παρατηρήσεις σε groups για τις οποίες θα ισχύει η μεταβατική ιδιότητα για όλες τις παρατηρήσεις μέσα στο ίδιο γκρουπ δηλαδη αν στο ίδιο γκρουπ είναι τα: (Α,Β,Γ,Δ) θα πρέπει να ισχύει:
    Α-Β
    Α-Γ
    Α-Δ
    Β-Γ
    Β-Δ
    Γ-Δ
    δηλαδή όλες να σχετίζονται μεταξύ τους.
    κι εδώ ακριβώς θέλω τη βοήθεια σας σχετικά με τον αλγόριθμο που θα το κάνει αυτό.
    Η αλήθεια είναι ότι έχω μπερδευτεί αρκετά...
    έχετε κάτι υπόψη σας που θα μπορούσε να βοηθήσει;

    Ευχαριστώ για το χρόνο σας


    Ευθύμης Δημόπουλος

  •  12-04-2010, 13:01 58043 σε απάντηση της 58036

    Απ: Αλγόριθμος για έλεγχο συσχετίσεων

    Αν κατάλαβα καλά το πρόβλημα, μια λύση θα ήταν να φτιάξεις έναν τετραγωνικό πίνακα συσχετίσεων (True/False) και αν η συνθήκη είναι true να επιλέγεις τα αντίστοιχα στοιχεία. Για παράδειγμα:

         Α   Β   Γ   Δ   Ε   Ζ   Η   Θ   Ι   Κ

    Α   -   T   T   F   T   F   F   T   T   F

    Β   T   -   T   F  .....

    Γ   

    Δ

    ...

    Βεβαίως το Α με το Α σχετίζονται, όπως το Β με το Β κ.ο.κ. Επιλέγεις, όμως, μόνο εκείνα τα στοιχεία που δεν είναι ταυτόσημα.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  12-04-2010, 14:25 58049 σε απάντηση της 58043

    Απ: Αλγόριθμος για έλεγχο συσχετίσεων

    Το πρόβλημα δυστυχώς δε το λύνει ο πίνακας...

    Το θέμα  μου είναι ο αλγόριθμος, που θα μου γκρουπάρει τις παρατηρήσεις έτσι ώστε όλες να σχετίζονται μεταξύ τους
  •  12-04-2010, 15:02 58051 σε απάντηση της 58049

    Απ: Αλγόριθμος για έλεγχο συσχετίσεων

    Αν κάθε σχέση είναι ένα διάνυσμα, δημιουργείς ένα γράφο με συνδεδεμένα σημεία. Αυτό που ζητάς είναι το σύνολο των σημείων που συνδέονται όλα μεταξύ τους ή κάτι παρόμοιο. Σε αυτή την περίπτωση θα πρέπει να ψάξεις αλγόριθμους για γράφους. Ρίξε μία στο QuickGraph.NET το οποίο περιέχει αρκετούς αλγόριθμούς για γράφους. Τώρα πως ακριβώς λέγεται ο αλγόριθμος που θέλεις ... θα σε γελάσω.

    Αλήθεια, από που προέκυψε αυτό το θέμα?

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  12-04-2010, 16:01 58053 σε απάντηση της 58036

    Απ: Αλγόριθμος για έλεγχο συσχετίσεων

    Ομολογώ ότι ούτε μου πέρασε από το μυαλό ότι πιθανόν να αναφέρεσαι σε graphs. Θα πρέπει ν' ανατρέξεις σε εγχειρίδια Operations Research για μια εισαγωγική αναφορά στο θέμα ή, αν θες να πας σε πιο βαθιά νερά, σε εγχειρίδια combinatorial optimization:

    1. Combinatorial optimization: algorithms and complexity (Christos H. Papadimitriou, Kenneth Steiglitz). Πολύ καλό και έχει ψευδοκώδικα.
    2. Combinatorial optimization: theory and algorithms (Bernhard H. Korte, Jens Vygen). Το βρήκα στο Google.

    Για αλγόριθμους μπορείς να κοιτάξεις κι εδώ. Τη βιβλιοθήκη που σου προτείνει ο Παναγιώτης την είδα τώρα. Νομίζω ότι θα καλύψει μια χαρά αν δε θες να φτιάξεις κάτι δικό σου. Όμως, θα ήταν πολύ χρήσιμο να γίνεις πιο συγκεκριμένος ως προς το είδος του προβλήματος που προσπαθείς να λύσεις.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  12-04-2010, 16:54 58056 σε απάντηση της 58053

    Απ: Αλγόριθμος για έλεγχο συσχετίσεων

    UPDATE:

    Ορισμένα searches σε ξαφνιάζουν καμιά φορά!! Ορίστε μια ιδέα για την αναβάθμιση της εκπαίδευσης. Όλες οι διαλέξεις στο google video!!


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  13-04-2010, 00:16 58061 σε απάντηση της 58056

    Απ: Αλγόριθμος για έλεγχο συσχετίσεων

    Πολύ καλό το link που έδωσες

    Φιλάρετος Σεβαστιάδης.

    Albert Camus: Life is the sum of your choices.

  •  13-04-2010, 09:35 58064 σε απάντηση της 58051

    Απ: Αλγόριθμος για έλεγχο συσχετίσεων

    Παναγιώτη το πρόβλημα αυτό προέρχεται από την ανάγκη υλοποίησης ενός (μεγαλύτερου) αλγορίθμου μιας μεθόδου clustering-reference set selection.

    Συνοπτικά αναφέρω ότι αφού υπολογιστούν αποστάσεις (με ένα συγκεκριμένο τρόπο) μεταξύ των παρατηρήσεων ουσιαστικά προκύπτει ένας πίνακας με τις παρατηρήσεις σε ζευγάρια και το αποτέλεσμά τους: Σχετίζονται - Δε σχετίζονται
    Οπότε το επόμενο βήμα είναι από αυτόν τον πίνακα να φτιαχτούν groups με παρατηρήσεις οι οποίες όλες να σχετίζονται μεταξύ τους μια-προς-μια.
    Αυτό είναι και το πρόβλημα που αντιμετωπίζω και για το οποίο δεν έχω βρει ακόμα λύση

    Update:
    Μελέτησα λίγο τα link και αυτό που δείχνει να χρειάζομαι είναι ένας αλγόριθμος να μου βρίσκει simple undirected completed graphs & subgraphs  Confused
    για... να συνεχίσω το ψάξιμο...

    (δεν με ενδιαφέρει να τον υλοποιήσω εκ νέου, μου αρκεί να κάνει τη δουλειά που θέλω)
  •  10-06-2010, 11:51 59066 σε απάντηση της 58064

    Clique algorithm, Bron-Kerbosch

    Μετά από αρκετές ημέρες και δεκάδες ωρών ψάξιμο βρήκα τελικά τί είναι αυτό που ψάχνω... Huh?

    Clique algorithm ή και αλγόριθμος Bron-Kerbosch

    Ουσιαστικά είναι ένας αλγόριθμος που βρίσκει τα complete graphs μέσα σε ένα graph

    Μήπως μπορεί κάποιος συνάδελφος να βοηθήσει;
    Ψάχνω για μια έτοιμη υλοποίηση του αλγορίθμου (ή και οτιδήποτε) σε vb ...
    από ότι έχω διαβάσει και έχω καταλάβει ο αλγόριθμος δέχεται σαν input ένα πίνακα γειτνίασης (adjacency matrix)
    και δίνει σαν output τις "κλίκες"

    ευχαριστώ πολύ...
  •  10-06-2010, 13:11 59067 σε απάντηση της 59066

    Απ: Clique algorithm, Bron-Kerbosch

    Το QuickGraph το κοίταξες? Ένα από τα παραδείγματα περιγράφει πως να βρεις τα σετ των κόμβων που συνδέονται μεταξύ τους. Κοίτα το παράδειγμα για Strongly Connected Components

    Όσον αφορά τη VB, καλύτερα να εξοικειωθείς με την C# παρά να ψάχνεις κώδικα σε VB. Η γλώσσα αυτή απλά δεν χρησιμοποιείται για την υλοποίηση αλγορίθμων. Ούτε open-source project  γενικότερα. Μόνο η Microsoft φροντίζει να βγάζει samples και στις δύο γλώσσες. 

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-06-2010, 15:18 59069 σε απάντηση της 59067

    Απ: Clique algorithm, Bron-Kerbosch

    Παναγιώτη σε ευχαριστώ, το quickGraph το κοίταξα ασφαλώς, όπως και το link που παραθέτεις πιο πάνω όμως δεν είναι αυτό που θέλω...

    Αυτό που έχω βρει μέχρι στιγμής είναι το The clique algorithm που όμως δίνει ένα αρχείο cpp (c++) από το οποίο δε μπορώ να βρω άκρη...


    όσον αφορά το vb/c#  δε με απασχολεί ιδιαίτερα... αυτό που θέλω είναι να κάνω ένα γρήγορο implementation γιατί το scope δεν είναι να ασχοληθώ με αυτό το κομμάτι
    πιο εξοικειωμένος ειμαι στη vb αν βρεθεί όμως λύση σε c# δε θα έχω πρόβλημα να την καταλάβω...

  •  10-06-2010, 15:36 59070 σε απάντηση της 59069

    Απ: Clique algorithm, Bron-Kerbosch

    Δυστυχώς, δεν μπορείς να μην ασχοληθείς με C++ αν σε ενδιαφέρουν οι αλγόριθμοι. Επαναλαμβάνω, η VB απλά δεν χρησιμοποιείται σε αυτό τον τομέα, ενώ η C/C++ χρησιμοποιείται κατά κόρον. Η C# μοιάζει αρκετά με C++ ώστε να μπορείς να καταλάβεις ένα αλγόριθμο και να τον γράψεις στην κατάλληλη μορφή.

    Όσον αφορά τώρα το πρόγραμμα που δίνεις, δεν είναι και τόσο δύσκολο αν το δεις ήρεμα. Ουσιαστικά το vector<T> είναι κάτι αντίστοιχο με το List<T> ενώ τα περίεργα << είναι operators που γράφουν σε κάποιο stream (αρχείο ή κονσόλα). Για παράδειγμα, το cout << "Μπλα Μπλά" <<endl είναι το αντίστοιχο του Console.WriteLine("Μπλά Μπλά") ενώ το outfile<<"Clique ("<<n-s<<"): "; θα μπορούσε να γραφτεί outFile.Write(String.Format("Clique ({0}) : ",n-s)


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-06-2010, 15:45 59071 σε απάντηση της 59066

    Απ: Clique algorithm, Bron-Kerbosch

    Ευθύμης Δημόπουλος:
    Μετά από αρκετές ημέρες και δεκάδες ωρών ψάξιμο βρήκα τελικά τί είναι αυτό που ψάχνω... Huh?

    Clique algorithm ή και αλγόριθμος Bron-Kerbosch

    Ουσιαστικά είναι ένας αλγόριθμος που βρίσκει τα complete graphs μέσα σε ένα graph

    ...

    Γκρρρρ... Έχασα ό,τι έγραψα, αλλά δεν πειράζει. Πάμε πάλι από την αρχή.

    Δε νομίζω ότι ο αλγόριθμος Bron-Kerbosch κάνει ακριβώς αυτό το πράγμα. Αντιγράφω από την Wikipedia:

    "In computer science, the Bron–Kerbosch algorithm is an algorithm for finding maximal cliques in an undirected graph. That is, it lists all subsets of vertices with the two properties that each pair of vertices in one of the listed subsets is connected by an edge, and no listed subset can have any additional vertices added to it while preserving its complete connectivity."

    Από τη μέχρι τώρα πορεία της συζήτησης έχω καταλάβει ότι ψάχνεις να βρεις έναν αλγόριθμο για subgraph enumeration, χωρίς, όμως, να είσαι σίγουρος για το ποιος είναι αυτός. Πάντως, ένα implementation του αλγόριθμου Bron-Kerbosch σε java μπορείς να βρεις εδώ. Μία χρήσιμη πηγή για την αποσαφήνιση εννοιών είναι το glossary of graph theory. Επίσης, νομίζω ότι θα βρεις αρκετά χρήσιμο το enumeration in graphs. Αν το μελετήσεις πιστεύω ότι θα μπορέσεις να επιλέξεις τη σωστή μέθοδο.

    Η δική μου η παρότρυνση είναι ν' απευθυνθείς σε κάποιον, πανεπιστημιακό ίσως, που ν' ασχολείται και να ερευνά το συγκεκριμένο επιστημονικό πεδίο. Περιέγραψέ του το πρόβλημα με το οποίο έχεις έρθει αντιμέτωπος κι εκείνος σίγουρα θα σου πει ποια είναι ή καταλληλότερη μαθηματική, κατ' αρχάς, προσέγγιση. Στη συνέχεια η εξεύρεση του(-ων) αλγορίθμου(-ων) και η συγγραφή του κώδικα θα είναι πιο εύκολη.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  10-06-2010, 19:08 59074 σε απάντηση της 59069

    Απ: Clique algorithm, Bron-Kerbosch

    Λοιπόν, επειδή η μετατροπή είχε μεγαλύτερο ενδιαφέρον από το να διορθώνω 3 ετών bugs άλλης εταιρείας, είπα να κάνω τη μετατροπή σε C#. Να πω ότι ο αρχικός κώδικας είναι αχταρμάς πρώτης κατηγορίας αλλά με ολίγες μετατροπές βγήκε το παρακάτω, το οποίο βγάζει τα αποτελέσματα του paper. Σίγουρα χρειάζεται ένα γερό refactoring για μαζευτεί.

    using System;
    using System.Collections.Generic;
    using System.IO;
    
    namespace Cliques
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                using (StreamReader infile = File.OpenText(args[0]))
                using (StreamWriter outfile = File.CreateText(args[1]))
                {
                    //Read Graph (note we work with the complement of the input graph) 
                    Console.WriteLine("Clique Algorithm.");
                    int n, i, j, k, K, p, q, r, s, min, edge, counter = 0;
                    n = infile.ReadInt();
                    var graph = new List<List<int>>();
                    for (i = 0; i < n; i++)
                    {
                        var row = new List<int>();
                        for (j = 0; j < n; j++)
                        {
                            edge = infile.ReadInt();
                            if (edge == 0) row.Add(1);
                            else row.Add(0);
                        }
                        graph.Add(row);
                    }
                    //Find Neighbors 
                    var neighbors = new List<List<int>>();
                    for (i = 0; i < graph.Count; i++)
                    {
                        var neighbor = new List<int>();
                        for (j = 0; j < graphIdea.Count; j++)
                            if (graphIdea[j] == 1) neighbor.Add(j);
                        neighbors.Add(neighbor);
                    }
                    Console.WriteLine("Graph has n = {0} vertices.", n);
                    //Read maximum size of Clique wanted 
                    Console.Write("Find a Clique of size at least k = ");
                    K = Console.In.ReadInt();
                    k = n - K;
                    //Find Cliques 
                    bool found = false;
                    Console.WriteLine("Finding Cliques...");
                    min = n + 1;
                    var covers = new List<List<int>>();
                    var allcover = new List<int>();
                    for (i = 0; i < graph.Count; i++)
                        allcover.Add(1);
                    for (i = 0; i < allcover.Count; i++)
                    {
                        if (found) break;
                        counter++;
                        Console.Write("{0} . ", counter);
                        outfile.Write("{0}. ", counter);
                        List<int> cover = allcover;
                        coverIdea = 0;
                        cover = procedure_1(neighbors, cover);
                        s = cover_size(cover);
                        if (s < min) min = s;
                        if (s <= k)
                        {
                            WriteClique(outfile,cover, n, s);
                            covers.Add(cover);
                            found = true;
                            break;
                        }
                        for (j = 0; j < n - k; j++)
                            cover = procedure_2(neighbors, cover, j);
                        s = cover_size(cover);
                        if (s < min) min = s;
                        WriteClique(outfile,cover, n, s);
                        covers.Add(cover);
                        if (s <= k)
                        {
                            found = true;
                            break;
                        }
                    }
                    //Pairwise Intersections 
                    for (p = 0; p < covers.Count; p++)
                    {
                        if (found) break;
                        for (q = p + 1; q < covers.Count; q++)
                        {
                            if (found) break;
                            counter++;
                            Console.Write("{0} . ", counter);
                            outfile.Write("{0}. ", counter);
                            List<int> cover = allcover;
                            for (r = 0; r < cover.Count; r++)
                                if (covers[p][r] == 0 && covers[q][r] == 0) cover[r] = 0;
                            cover = procedure_1(neighbors, cover);
                            s = cover_size(cover);
                            if (s < min) min = s;
                            if (s <= k)
                            {
                                WriteClique(outfile,cover, n, s);
                                found = true;
                                break;
                            }
                            for (j = 0; j < k; j++)
                                cover = procedure_2(neighbors, cover, j);
                            s = cover_size(cover);
                            if (s < min) min = s;
                            WriteClique(outfile,cover, n, s);
                            if (s <= k)
                            {
                                found = true;
                                break;
                            }
                        }
                    }
                    infile.Close();
                    outfile.Close();
                    if (found) Console.WriteLine("Found Clique of size at least {0}.", K);
                    else
                        Console.Write("Could not find Clique of size at least {0}. Maximum Clique size found is {1}.", K,
                                      n - min);
                }
                Console.WriteLine("See cliques.txt for results.");
                Console.ReadKey();
            }
    
            private static bool removable(List<int> neighbor, List<int> cover)
            {
                bool check = true;
                for (int i = 0; i < neighbor.Count; i++)
                    if (cover[neighborIdea] == 0)
                    {
                        check = false;
                        break;
                    }
                return check;
            }
    
            private static int max_removable(List<List<int>> neighbors, List<int> cover)
            {
                int r = -1, max = -1;
                for (int i = 0; i < cover.Count; i++)
                {
                    if (coverIdea == 1 && removable(neighborsIdea, cover))
                    {
                        List<int> temp_cover = cover;
                        temp_coverIdea = 0;
                        int sum = 0;
                        for (int j = 0; j < temp_cover.Count; j++)
                            if (temp_cover[j] == 1 && removable(neighbors[j], temp_cover))
                                sum++;
                        if (sum > max)
                        {
                            max = sum;
                            r = i;
                        }
                    }
                }
                return r;
            }
    
            private static List<int> procedure_1(List<List<int>> neighbors, List<int> cover)
            {
                List<int> temp_cover = cover;
                int r = 0;
                while (r != -1)
                {
                    r = max_removable(neighbors, temp_cover);
                    if (r != -1) temp_cover[r] = 0;
                }
                return temp_cover;
            }
    
            private static List<int> procedure_2(List<List<int>> neighbors, List<int> cover, int k)
            {
                int count = 0;
                List<int> temp_cover = cover;
                //int i = 0;
                for (int i = 0; i < temp_cover.Count; i++)
                {
                    if (temp_coverIdea == 1)
                    {
                        int sum = 0, index = 0;
                        for (int j = 0; j < neighborsIdea.Count; j++)
                            if (temp_cover[neighborsIdea[j]] == 0)
                            {
                                index = j;
                                sum++;
                            }
                        if (sum == 1 && cover[neighborsIdea[index]] == 0)
                        {
                            temp_cover[neighborsIdea[index]] = 1;
                            temp_coverIdea = 0;
                            temp_cover = procedure_1(neighbors, temp_cover);
                            count++;
                        }
                        if (count > k) break;
                    }
                }
                return temp_cover;
            }
    
            private static int cover_size(List<int> cover)
            {
                int count = 0;
                for (int i = 0; i < cover.Count; i++)
                    if (coverIdea == 1) count++;
                return count;
            }
    
            private static void WriteClique(StreamWriter outfile,List<int> cover,int n, int s)
            {
                outfile.Write("Clique ({0}): ", n - s);
                for (int j = 0; j < cover.Count; j++) if (cover[j] == 0) 
                    outfile.Write("{0} ", j + 1);
                outfile.WriteLine();
                Console.WriteLine("Clique Size: {0}", n - s);
            }
        }
    
        public static class Extensions
        {
            public static int ReadInt(this TextReader reader)
            {
                var c = (char) reader.Read();
                while (Char.IsWhiteSpace(c))
                    c = (char) reader.Read();
                return c - 48;
            }
        }
    }


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-06-2010, 09:57 59106 σε απάντηση της 59074

    Απ: Clique algorithm, Bron-Kerbosch

    Παναγιώτη σε ευχαριστώ πραγματικά για το χρόνο που αφιέρωσες...
    Τι να πω...

    Ξεκινάω την ανάγνωση μπας και βγάλω άκρη...


    Markos: κοιτάω τα link που μου παραθέτεις, με τον Kerbosch νομίζω ότι βρίσκει τους ολοκληρωμένους γράφους (completed undirected graphs) που βρίσκονται μέσα σε ένα γράφο
    θα δω κι αυτο με τα enumerations...

    και επανέρχομαι...
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems