vassoulaboo Δημοσ. 17 Δεκεμβρίου 2012 Δημοσ. 17 Δεκεμβρίου 2012 Καλησπέρα σας, έχω φοβερό πρόβλημα με τον κώδικα που έχω να τελειωσω για μια εργασία στο Matlab γιατί μου βγαίνουν αρνιτικοί αριθμοί ενώ δεν τους θέλω. έχω δοκιμάσει while, for και if και δεν εχω βγάλει άκρη, πάντα καταλλήγει ατέρμονο. έχετε καμιά ιδέα; ο κώδικας που έχω γράψει είναι ο εξής : function [min_c,x]=trans_prob(c,a,b ) %μεθοδος βορειοδυτικης γωνιας m=length(a); % ο καθετος πινακας (πηγες) n=length(b ); % ο οριζοντιος πινακας (προορισμοι) [m,n]=size©; % οι τιμες του κεντρικου πινακα (μοναδιαιο κοστος μεταφορας) x=zeros(m,n); % οι τιμες που θα εχει τελικα ο πινακας (ποσοτητα μοναδων που διανεμεται απο την πηγη στον προορισμο) sum_a=0; sum_b=0; for i=1:m sum_a=sum_a+a(i); % το αθροισμα των πηγων end for j=1:n sum_b=sum_b+b(j); % το αθροισμα των προορισμων end sum_a % ελεγχουμε αν ειναι σωστα τα αποτελεσματα sum_b min_c=0; if sum_a == sum_b% η διαδικασια γεμισματοσ του πινακα x γινεται με αυτον τον περιορισμο for j=1:n % γεμιζουμε τον x for i=1:m if a(i)>b(j)% αν η πηγη εχει τιμη μεγαλυτερη του προορισμου x(i,j)=b(j); % βαζουμε στην πρωτη θεση του x την τιμη του περιορισμου a(i)=a(i)-b(j); % και αφαιρουμε απο το a τον περιορισμο b(j)=b(j)-x(i,j);% και απο το b το x else % αλλιως x(i,j)=a(i); % βαζουμε στην πρωτη θεση του x την τιμη της πηγης b(j)=b(j)-a(i);% και αφαιρουμε απο το b την πηγη a(i)=b(i)-x(i,j);% και απο το a το x end min_c = min_c + c(i,j)*x(i,j); % το συνολικο κοστος end end end
gasgion Δημοσ. 17 Δεκεμβρίου 2012 Δημοσ. 17 Δεκεμβρίου 2012 πες μου λιγο τι ακριβως θες να κανεις μεχρι να το τρεξω να δω τι βγαινει.
V.I.Smirnov Δημοσ. 17 Δεκεμβρίου 2012 Δημοσ. 17 Δεκεμβρίου 2012 Σϊγουρα πρόκειται για πρότυπο μεταφοράς (γραμμικός προγραμματισμός-Simplex) και προσπαθείς να βρεις την αρχική δυνατή βασική λύση. Κάπου κάνεις αβλεψία ή παρανόηση στον αλγόριθμο. Πάρε ένα αριθμητικό παράδειγμα και λύστο με το χέρι βήμα-βήμα ακολουθώντας τον κώδικά σου. Μην περιμένεις να το κάνει άλλος για σένα αυτό - εκτός αν ξέρει καλά την μέθοδο και έχει χρόνο. Eγώ την ξέρω αλλά δεν έχω χρόνο να ασχοληθώ, δυστυχώς.... -
vassoulaboo Δημοσ. 17 Δεκεμβρίου 2012 Μέλος Δημοσ. 17 Δεκεμβρίου 2012 έχεις δίκιο, αυτό είναι το πρόβλημα της μεταφοράς. το έχω κάνει αυτό το βήμα στο χέρι και το ξέρω καλά.. από ότι έχω καταλάβει ο κωδικάς του loop είναι σωστός απλά υπάρχει ο περιορισμός ότι όλα τα χ <= 0 τον οποίο δεν ξέρω πως να τον εισάγω(με ποιά μορφή).. η αρμόδια καθηγήτρια μου πρότεινε κάτι σαν flag κώδικα τον οποίο δεν τον κατάλαβα πολύ.. να δημιουργήσω πίνακα με άσσους και να του λέω πως ότι όταν το χ παρει την τιμή 0 να μην ξαναγυρνάει σε αυτό.. λογικά είναι σωστό απλά εγώ δεν το καταλαβαίνω. γι αυτό ζήτησα μήπως έχετε κάποια άλλη δυνατή επιλογή..σαφώς και δεν ζητάω να μου το λύσετε, άλλωστε δεν θα είχε νόημα!
Timonkaipumpa Δημοσ. 17 Δεκεμβρίου 2012 Δημοσ. 17 Δεκεμβρίου 2012 Καλησπέρα σας, έχω φοβερό πρόβλημα με τον κώδικα που έχω να τελειωσω για μια εργασία στο Matlab γιατί μου βγαίνουν αρνιτικοί αριθμοί ενώ δεν τους θέλω. έχω δοκιμάσει while, for και if και δεν εχω βγάλει άκρη, πάντα καταλλήγει ατέρμονο. έχετε καμιά ιδέα; ο κώδικας που έχω γράψει είναι ο εξής : ..... > function [min_c,x]=trans_prob(c,a,b ) min_c = 0; x=zeros(size(c, 1), size(c, 2)); if isequal(sum( a ), sum( b ) ) for j=1:size(c, 2) for i=1:size(c, 1) if a(i)>b(j) x(i,j)=b(j); a(i)=a(i)-b(j); b(j)=b(j)-x(i,j); else x(i,j)=a(i); b(j)=b(j)-a(i); a(i)=a(i)-x(i,j); end min_c = min_c + c(i,j)*x(i,j); end end end Δοκίμασε αυτό. Δες τις αλλαγές που έκανα... είχες κάποια λαθάκια αλγοριθμικά. Εάν δεν σου δουλέψει και εάν μπορείς, ανέβασε και ένα test data set. Επίσης, δεν κάνεις πουθενά έλεγχο εάν το length( a ) == size(c, 1) και length( b ) == size(c, 2).
vassoulaboo Δημοσ. 17 Δεκεμβρίου 2012 Μέλος Δημοσ. 17 Δεκεμβρίου 2012 σε ευχαριστω για την προσπαθεια αλλα δεν είναι αυτό που θέλω.. ξέχασα να αναφέρω ότι για с είναι πίνακας π.χ. c=[3 2 3 4 1;4 1 2 4 2;1 0 5 3 2]; και αντίστοιχα a=[75 150 75]; b=[100 60 40 75 25];
Timonkaipumpa Δημοσ. 17 Δεκεμβρίου 2012 Δημοσ. 17 Δεκεμβρίου 2012 Με το data set που έδωσες δεν υπάρχουν αρνητικοί αριθμοί, που αυτό ήταν ο λόγος που έκανες post. Οπότε, το πρόβλημα για το οποίο έκανες post λύθηκε. Να φανταστώ ότι δεν μπήκες ΚΑΝ στον κόπο να δεις εάν υπάρχουν ή όχι αρνητικοί αριθμοί. Εάν μπήκες και ήταν αυτή η απάντησή σου, τότε λες ΨΕΜΑΤΑ στο post #4, όπου λες ότι "σαφώς και δεν ζητάω να μου το λύσετε". Η επιστροφή της function για > c=[3 2 3 4 1;4 1 2 4 2;1 0 5 3 2]; > a=[75 150 75]; και > b=[100 60 40 75 25]; Είναι: > min_c = 765 και > x = 75 0 0 0 0 25 60 40 25 0 0 0 0 50 25 Και οι αλλαγές που έγιναν (σε περίπτωση που υπάρχει ο ισχυρισμός ότι τα λάθη οφείλονται στις διορθώσεις) είναι απλές αντικαταστάσεις με έτοιμες συναρτήσεις του MATLAB συν την αλλαγή της γραμμής: a(i)=b(i)-x(i,j);% και απο το a το x σε a(i) = a(i) -x(i,j); όπου ΠΡΟΦΑΝΕΣΤΑΤΑ είχε γίνει τυπογραφικό.
vassoulaboo Δημοσ. 17 Δεκεμβρίου 2012 Μέλος Δημοσ. 17 Δεκεμβρίου 2012 καταρχήν δεν λέω ψέματα!! το πρόγραμμα το έτρεξα εγώ στον υπολογιστή μου και τα αποτελέσματα που πήρα δεν ήταν σωστά. ναι μεν ήταν θετικοί οι αριθμοί αλλά κάληπταν όλον τον πίνακα!!! για να μου δείχνεις εσύ αυτά τα αποτλέσματα τότε προφανώς κάτι δεν έγραψα καλά.. σε παρακαλώ μην λες χαζομάρες.. σπάω το κεφάλι μου πολύ καιρό τώρα γι αυτό το κομμάτι κώδικα και πίστεψέ με αν δεν ήμουν τόσο απελπισμένη δεν θα ζητούσα βοήθεια!!! σε ευχαριστώ πάντως για τον κόπο σου και το εκτιμώ που μου το απέδειξες κιόλας ότι είναι σωστό!! θα το ξανατσεκάρω. και δεν ζήτησα να μου το λύσετε γιατί με όσους καθηγητές κατάφερα να μιλήσω μου είπαν ότι ο μέχρι εκεί κώδικάς μου ήταν σωστός και το μόνο που έλειπε ήταν αυτή η λεπτομέρεια του χ>=0 .. δεν είμαι και τόσο χαζή.. είχες δίκιο τελικά!!! με συγχωρείς απλά χρειαζόμουν καθαρό μυαλό για να το δω.. όταν το έτρεξα εγώ στον υπολογιστή μου είχα από κάτω και τον υπόλοιπο κώδικα για την επίλυση του προβλήματος και δεν μπήκα στον κόπο να το τρέξω δεύτερη φορά λόγο ανάρμοστης συμπεριφοράς της καθηγήτριας!! ΣΕ ΕΥΧΑΡΣΤΩ τόσο πολύ.. πραγματικά μου έφυγε μεγάλο βάρος.. τελικά το όλο λάθος ήταν αυτό a(i) = a(i) -x(i,j); που δεν το έβλεπε κανείς άλλος εκτός απο σένα!! ελπίζω να μην παρεξηγηθήκαμε πολύ.. :$
Timonkaipumpa Δημοσ. 17 Δεκεμβρίου 2012 Δημοσ. 17 Δεκεμβρίου 2012 ΟΚ, δεκτό. Πάντως, πρόσεχε όταν γράφεις MATLAB να χρησιμοποιείς τα features του MATALB. Π.χ., δεν είναι ανάγκη να κάνεις πρόσθεση όλων των στοιχείων ενός vector με for loop. Υπάρχει η εντολή sum, η οποία παίρνει και όρισμα σχετικά με ποια διάσταση να πραγματοποιήσει την πρόσθεση... δηλαδή: το > a = [1 2 3; 4 5 6]; sum(a, 1) θα δώσει 6 και 15 ενώ το > sum(a, 2) θα δώσει 5, 7 και 9. Ακόμα, πρόσεχε τι ονόματα δίνεις στις μεταβλητές σου. Εκχωρούσες δύο φορές διαφορετική τιμή τα m και n. Μία από το size του c και μία από τα length σε a και b. Ακόμα, δεν είναι ανάγκη να παίρνεις το size για να βρεις σειρές και στήλες για να τα χρησιμοποιήσεις πιο μετά. Το size ακολουθεί την ίδια λογική του sum. Δηλαδή, και για τον πίνακα a που όρισα προηγουμένως θα έχεις: > size(a, 1) ans 2 και > size(a, 2) ans 3
vassoulaboo Δημοσ. 17 Δεκεμβρίου 2012 Μέλος Δημοσ. 17 Δεκεμβρίου 2012 σωστός.. απλά είναι στην ουσία ο πρώτος μου κώδικας και προσπαθω να τα γράφω αναλυτηκα για να καταλαβαινω.. μολισ τον τελειωσω με το καλο θα τον "συμαζέψω" και λίγο !! Ευχαριστώ και πάλι!!
Star_Light Δημοσ. 17 Δεκεμβρίου 2012 Δημοσ. 17 Δεκεμβρίου 2012 καταρχήν δεν λέω ψέματα!! το πρόγραμμα το έτρεξα εγώ στον υπολογιστή μου και τα αποτελέσματα που πήρα δεν ήταν σωστά. ναι μεν ήταν θετικοί οι αριθμοί αλλά κάληπταν όλον τον πίνακα!!! για να μου δείχνεις εσύ αυτά τα αποτλέσματα τότε προφανώς κάτι δεν έγραψα καλά.. σε παρακαλώ μην λες χαζομάρες.. σπάω το κεφάλι μου πολύ καιρό τώρα γι αυτό το κομμάτι κώδικα και πίστεψέ με αν δεν ήμουν τόσο απελπισμένη δεν θα ζητούσα βοήθεια!!! σε ευχαριστώ πάντως για τον κόπο σου και το εκτιμώ που μου το απέδειξες κιόλας ότι είναι σωστό!! θα το ξανατσεκάρω. και δεν ζήτησα να μου το λύσετε γιατί με όσους καθηγητές κατάφερα να μιλήσω μου είπαν ότι ο μέχρι εκεί κώδικάς μου ήταν σωστός και το μόνο που έλειπε ήταν αυτή η λεπτομέρεια του χ>=0 .. δεν είμαι και τόσο χαζή.. είχες δίκιο τελικά!!! με συγχωρείς απλά χρειαζόμουν καθαρό μυαλό για να το δω.. όταν το έτρεξα εγώ στον υπολογιστή μου είχα από κάτω και τον υπόλοιπο κώδικα για την επίλυση του προβλήματος και δεν μπήκα στον κόπο να το τρέξω δεύτερη φορά λόγο ανάρμοστης συμπεριφοράς της καθηγήτριας!! ΣΕ ΕΥΧΑΡΣΤΩ τόσο πολύ.. πραγματικά μου έφυγε μεγάλο βάρος.. τελικά το όλο λάθος ήταν αυτό a(i) = a(i) -x(i,j); που δεν το έβλεπε κανείς άλλος εκτός απο σένα!! ελπίζω να μην παρεξηγηθήκαμε πολύ.. :$ hahahaha δηλαδη οσοι ζητάμε βοηθεια μας θεωρει απελπισμενους παιδια!!!!!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα