M2000 Δημοσ. 27 Μαΐου 2016 Δημοσ. 27 Μαΐου 2016 Απλοϊκοί λογισμοί! Τα κουτιά μπορούν να δένουν όπως τρία παράλληλα να έρχονται κάθετα σε ένα τρίτο. σαν σύμβολο: τρία παράλληλα ένα κάθετο: ΞιΞιΞΙΞΙ τρία παράλληλα 5 φορές και ένα κάθετο ΞΞΞΞΞΙ αν ο υπολογισμός γίνει με έναν προσανατολισμό τότε πρέπει να είμαστε τυχεροί ο κενός χώρος να είναι ελάχιστος, ή να μπορούμε να βάλουμε κάθετα κουτιά. (υποτίθεται ότι όλα τα κουτά έχουν μια ένδειξη Up, και τη διατηρούμε σωστά προσανατολισμένη). Εδώ φαίνεται βολικό γιατί υπάρχει μια αναλογία 1/3 (πλάτοςΧμήκος). Τι γίνεται αν έχουμε μια άλλη αναλογία; 1
groot Δημοσ. 27 Μαΐου 2016 Δημοσ. 27 Μαΐου 2016 Αυτό "Θεωρείς τις διαστάσεις του κουτιού: X_box >= Y_box >= Z_box." από που προκύπτει; Για τα mod έχεις δίκιο. Από το ότι το κουτί είναι δικό σου και ο τυπάς που θα χρησιμοποιήσει το πρόγραμμα θα ξέρει πόσο είναι το κουτί. Οπότε, ό,τι και να βάλει στα text boxes σου, για να λειτουργήσει σωστά αυτό που σου έδωσα θα πρέπει οι μεταβλητές να έχουν αυτή τη σχέση. Ότι έχω δίκιο το ξέρω... Υ.Γ. Κολλάς στο δέντρο ή κοιτάς το δάχτυλο. Διάλεξε.
panos_saxo Δημοσ. 27 Μαΐου 2016 Μέλος Δημοσ. 27 Μαΐου 2016 Όσων αφορα εμένα , προτιμώ να στηθούν με την ίδια φορά όλα τα κιβώτια. Μιλάμε για περιπου 3-4.000 κιβωτια τα οποία δεν θα ήθελα να αδειασω ξανά ενα ενα σε περίπτωση λάθους. Αν συμβεί το οτιδήποτε , θα μπορω ανα πάσα στιγμη να μετρησω εύκολα το ποσά κιβώτια έχω τοποθετησει αφού θα είναι ίδια σε κάθε σειρα . ναι μεν αν τα βάλω αντικριστά θα είναι πιο ασφαλή , αλλά σε ενα κατα την φόρτωση την εκατσα. Για τυχόν κενά που συνήθως μένουν , χρησιμοποιώ σακούλες που φουσκώνουν που είναι για τέτοιο σκοπό,κλείνω το κενό με αυτές κ δεν κουνιετε τπτ.
groot Δημοσ. 27 Μαΐου 2016 Δημοσ. 27 Μαΐου 2016 Τότε απλοποιείται το θέμα. Από τους συνδυασμούς, απλά δεν υπολογίζεις αυτούς που δεν θέλεις. Δηλαδή, αφού το έχει φτιάξει το παλικάρι, μπορεί άνετα να βάλει check box για να ακυρώνεις τοποθετήσεις. Ή, ακόμα, αφού παίζουν διάφορα είδη από κούτες, να σου υπολογίζει με ποιο είδος και με ποιο προσανατολισμό θα έχεις λιγότερο άδειο χώρο.
panos_saxo Δημοσ. 27 Μαΐου 2016 Μέλος Δημοσ. 27 Μαΐου 2016 Αυτό ακριβως που ψάχνω δλδ! Να του δίνω διαστάσεις κ να μου υπογιζει με ποιον τροπο στησίματος θα καλυψω περισσότερο χώρο.
groot Δημοσ. 27 Μαΐου 2016 Δημοσ. 27 Μαΐου 2016 Δεν κατάλαβες. Εγώ εννοώ και πώς θα προσανατολίζεις την κούτα. Δηλαδή, ποια διάσταση να επιλέξεις για ύψος, ποια για μήκος και ποια για πλάτος.
groot Δημοσ. 27 Μαΐου 2016 Δημοσ. 27 Μαΐου 2016 Α. ΟΚ. Τότε εγώ δεν κατάλαβα. Just to be sure, όταν λέω ύψος, δεν εννοώ του container. Δηλαδή, έχεις μία ψηλή κούτα αλλά οι υπολογισμοί σου λένε ότι καλύτερα, για το συγκεκριμένο container, να την χρησιμοποιήσεις ως πλατιά κούτα. Το λέω επειδή είπες ότι σε νοιάζει να μην γυρνάνε οι κούτες όπως λάχει.
PC_MAGAS Δημοσ. 27 Μαΐου 2016 Δημοσ. 27 Μαΐου 2016 Στη λογική του 'Technology fan' έχει γίνει το προγραμματάκι (screenShot στο επισυναπτόμενο αρχείο). Αν σου κάνει μπορώ να στο στείλω. Απλά απαιτεί εγκαταστημένη java 8. Γιατί φίλε δεν βάζεις τον αλγόριθμο στο github; Ίσως η λύση σου να βοηθήσει κόσμο. Ακόμη οι κούτες έχουν στάνταρτ διαστάσεις; Η θα είναι ανάμεικτων μεγεθών;
M2000 Δημοσ. 28 Μαΐου 2016 Δημοσ. 28 Μαΐου 2016 Συνήθως τα κουτιά έχουν μια "οροφή", οπότε μπορείς να τα περιστρέψεις στον Κάθετο άξονα αλλά όχι στους οριζόντιους. Η συσκευασία δέχεται βάρος, και αν το εμπόρευμα προορίζεται για χύμα φόρτωση πρέπει να αντέχει το βάρους του Ν φορές (μαζί με το ίδιο), όπου Ν ο αριθμός πακέτων στο κάθετο άξονα. εδώ έχει τα μήκη για τα σημερινού τύπου κοντέινερ, και άλλα χαρακτηριστικά: https://en.m.wikipedia.org/wiki/Containerization#Full_container_load
FISHERMAN Δημοσ. 28 Μαΐου 2016 Δημοσ. 28 Μαΐου 2016 φανταστική δουλειά και το έχω και εγω μεγάλο ζόρι στη δουλειά...μπορώ να το έχω παρακαλώ;
giso Δημοσ. 29 Μαΐου 2016 Δημοσ. 29 Μαΐου 2016 Μετά τις υποδείξεις του 'groot' package containerstuffing; import java.awt.GraphicsEnvironment; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.stage.Stage; /* Controls the application's screen */ public class StuffingController { @FXML private Button fillButton; @FXML private Button clearButton; @FXML private Button exitButton; @FXML private TextField containerLength; @FXML private TextField containerWidth; @FXML private TextField containerHeight; @FXML private TextField boxWidth; @FXML private TextField boxLength; @FXML private TextField boxHeight; @FXML private TextArea results; @FXML private TextField totalBoxes; private double x_c, y_c, z_c, x_b, y_b, z_b; private String resultString; private int sumNumBoxes; private int rows; public void initManager(Scene scene, Stage stage) { int graphicsDeviceWidth = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width; int graphicsDeviceHeight = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height; int x = graphicsDeviceWidth/2 - 225; int y = graphicsDeviceHeight/2 - 280; stage.setX(x); stage.setY(y); stage.show(); sumNumBoxes = 0; Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Alert message"); alert.setHeaderText(null); alert.initOwner(stage); fillButton.setOnAction((ActionEvent event) -> { resultString = ""; boolean validDimensions = true; sumNumBoxes = 0; results.clear(); totalBoxes.clear(); if (containerLength.getText().matches("^[0-9]+(\\.[0-9]+)?$")) x_c = Double.valueOf(containerLength.getText()); else { validDimensions = false; alert.setContentText("Wrong number for the length of the container"); alert.showAndWait(); containerLength.clear(); containerLength.requestFocus(); } if (containerWidth.getText().matches("^[0-9]+(\\.[0-9]+)?$")) y_c = Double.valueOf(containerWidth.getText()); else { validDimensions = false; alert.setContentText("Wrong number for the width of the container"); alert.showAndWait(); containerWidth.clear(); containerWidth.requestFocus(); } if (containerHeight.getText().matches("^[0-9]+(\\.[0-9]+)?$")) z_c = Double.valueOf(containerHeight.getText()); else { validDimensions = false; alert.setContentText("Wrong number for the height of the container"); alert.showAndWait(); containerHeight.clear(); containerHeight.requestFocus(); } if (boxWidth.getText().matches("^[0-9]+(\\.[0-9]+)?$")) x_b = Double.valueOf(boxWidth.getText()); else { validDimensions = false; alert.setContentText("Wrong number for the widht of the box"); alert.showAndWait(); boxWidth.clear(); boxWidth.requestFocus(); } if (boxLength.getText().matches("^[0-9]+(\\.[0-9]+)?$")) y_b = Double.valueOf(boxLength.getText()); else { validDimensions = false; alert.setContentText("Wrong number for the length of the box"); alert.showAndWait(); boxLength.clear(); boxLength.requestFocus(); } if (boxHeight.getText().matches("^[0-9]+(\\.[0-9]+)?$")) z_b = Double.valueOf(boxHeight.getText()); else { validDimensions = false; alert.setContentText("Wrong number for the height of the box"); alert.showAndWait(); boxHeight.clear(); boxHeight.requestFocus(); } double containerVolume = x_c * y_c * z_c; double boxVolume = x_b * y_b * z_b; if (containerVolume < boxVolume) { validDimensions = false; alert.setContentText("Box larger than container"); alert.showAndWait(); boxWidth.clear(); boxLength.clear(); boxHeight.clear(); boxWidth.requestFocus(); } if (validDimensions) { calculateFilling(); results.setText(resultString); totalBoxes.setText("Total number of boxes: " + sumNumBoxes + " in " + rows + " rows"); } }); clearButton.setOnAction((ActionEvent event) -> { containerLength.clear(); containerWidth.clear(); containerHeight.clear(); boxWidth.clear(); boxLength.clear(); boxHeight.clear(); results.clear(); totalBoxes.clear(); containerLength.requestFocus(); }); exitButton.setOnAction((ActionEvent event) -> { Platform.exit(); // The program is ended }); } private void calculateFilling() { int x, xy, xyz, y, yz, z; x = (int) Math.floor(x_c / x_; if (x > y_ xy = (int) Math.floor(x / y_; else xy = 0; if (xy > 0) xyz = (int) Math.floor(xy / z_; else if (x > z_ xyz = (int) Math.floor(x / z_; else xyz = 0; x += xy + xyz; y = (int) Math.floor(x_c / y_; if (y > z_ yz = (int) Math.floor(y / z_; else yz = 0; y += yz; z = (int) Math.floor(x_c / z_; double bd_1 = 0, bd_2 = 0, Lmod = 0, Wmod = 0, Hmod = 0; String dbs_1 = "", dbs_2 = ""; int maxval = Math.max(Math.max(x, y), z); if (maxval == x) { bd_1 = y_b; bd_2 = z_b; Lmod = x_b; dbs_1 = "b"; dbs_2 = "c"; resultString += "[L <--> a] "; } if (maxval == y) { bd_1 = x_b; bd_2 = z_b; Lmod = y_b; dbs_1 = "a"; dbs_2 = "c"; resultString += "[L <--> b] "; } if (maxval == z) { bd_1 = x_b; bd_2 = y_b; Lmod = z_b; dbs_1 = "a"; dbs_2 = "b"; resultString += "[L <--> c] "; } y = (int) Math.floor(y_c / bd_1); if (y > bd_2) yz = (int) Math.floor(y / bd_2); else yz = 0; y += yz; z = (int) Math.floor(y_c / z_; maxval = Math.max(y, z); Wmod = bd_1; resultString += "[W <--> " + dbs_1 + "] "; Hmod = bd_2; resultString += "[H <--> " + dbs_2 + "] --> "; int rowBoxes = (int) Math.floor(x_c / Lmod ) * (int) Math.floor(y_c / Wmod); resultString += rowBoxes + " boxes\n"; double Lgap = (double)Math.round((x_c - (int) Math.floor(x_c / Lmod) * Lmod) * 1000d) / 1000d; double Wgap = (double)Math.round((y_c - (int) Math.floor(y_c / Wmod) * Wmod) * 1000d) / 1000d; double Hgap = (double)Math.round((z_c - (int) Math.floor(z_c / Hmod) * Hmod) * 1000d) / 1000d; resultString += "Container gaps after fill: " + "[L <--> " + Lgap + "] " + "[W <--> " + Wgap + "] " + "[H <--> " + Hgap + "]"; rows = (int) Math.floor(z_c / Hmod); sumNumBoxes = rowBoxes * rows; } } Βέβαια στο κενό: [L <--> 0.7] μπορεί να προστεθούν άλλα 4 κουτιά 0.7x1.1x1.6, αλλά ο συγκεκριμένος αλγόριθμος δεν μπορεί να καλύψει αυτήν την περίπτωση.
giso Δημοσ. 29 Μαΐου 2016 Δημοσ. 29 Μαΐου 2016 Αδερφέ, μάλλον το έκανες όχι όπως το είπα. Μάλλον κάτι δεν κατάλαβα σωστά. Θεώρησα ότι ο προσανατολισμός των εισαγόμενων κουτιών είναι ίδιος για όλες τις σειρές. Στα δεδομένα της εικόνας δοκίμασα “με το χέρι” 8 διαφορετικούς προσανατολισμούς και ο μέγιστος αριθμός εισαγόμενων κουτιών είναι ο ίδιος με το αποτέλεσμα του προγράμματος για τον ίδιο προσανατολισμό (χέρι & πρόγραμμα).
groot Δημοσ. 29 Μαΐου 2016 Δημοσ. 29 Μαΐου 2016 Μάλλον και εγώ δεν το εξήγησα σωστά. Κάθε κούτα έχει έναν 3D προσανατολισμό. Κάποια διάσταση για ύψος, κάποια για πλάτος, και κάποια για μήκος. Έστω ότι οι διαστάσεις της κούτας είναι οι x_box, y_box, z_box. Εάν δεν γράψεις πάνω στην κούτα "this side up" δεν ξέρεις ποια είναι το ύψος, ποια το πλάτος, ποια το μήκος. Στο συγκεκριμένο πρόβλημα είναι να βρεις ποιος προσανατολισμός της κούτας θα είναι καλύτερος για να χωρέσουν περισσότερα κουτιά. Εάν βάλουμε σε φθίνουσα σειρά τις διαστάσεις της κούτας έχουμε X_box > Y_box > Z_box όπου μπορεί το x_box ≠ X_box. Όταν κάνεις το πρώτο Math.floor(X_box/x_cont) τότε βλέπεις πόσα κουτιά μπορούν να μπουν με την X_box στην x_box. Αφού όμως Y_box < X_box τότε ό,τι μείνει μπορεί να καλυφθεί από τα κουτιά εάν τα τοποθετήσεις με την Y_box στην x_cont. Το αυτό και για την Z_box στην x_cont. Βέβαια, μπορεί η x_cont να διαιρείται καλύτερα με την Y_box, όπου καλύτερα σημαίνει να μπαίνουν πιο πολλά κουτιά. Εάν μείνει χώρος, τότε κοιτάς και για την Z_box, αφού Z_box < Y_box. Το ίδιο και για την Z_box, μόνο που δεν κοιτάς άλλη διάσταση γιατί το κουτί έχει μόνο 3ς. Τώρα, εάν π.χ. επιλέξεις να το βάλεις με την Y_box στην x_cont, σου μένουν οι 2 άλλες διαστάσεις του κουτιού για τις άλλες δύο διαστάσεις του container. Όπου, κάνεις τον ίδιο υπολογισμό αλλά έχεις μόνο δύο περιπτώσεις και άπαξ και βρεις την καλύτερη διάσταση, τότε έχεις και την άλλη αυτομάτως. Δηλαδή, εάν επιλέξεις την Z_box για την y_cont, σου μένει η X_box για την z_cont. Εάν ήθελες να βελτιστοποιήσεις για όλες τις *_cont την λύση σου, θα έπρεπε να πάρεις όλες τις διατάξεις.. π.χ. {X_box --> x_cont, Y_box --> y_cont, Z_box --> z_cont}, {X_box --> y_cont, Y_box --> z_cont, Z_box --> x_cont} κτλ. Εάν κάνεις και το θέμα με την εισαγωγή κουτιών σε άλλο προσανατολισμό για μία διάσταση *_cont (δηλαδή το xy_mod στον προηγούμενο κώδικά μου) τότε έχεις και για αυτά τα κουτιά τον υπολογισμό για διαφορετικό προσανατολισμό. Όμως, ο ΟΡ είπε ότι δεν τον νοιάζει στο πλάτος (νομίζω). Αυτό όμως, για εσένα, είναι απλά ένα check box που σου κάνει skip ή όχι κάποιες πράξεις. Οπότε, είναι υπό-περίπτωση. Οι υπολογισμοί μπορούν να γίνουν μία ρουτίνα/μέθοδος με 3 ορίσματα, οπότε με γεννήτρια διατάξεων έχεις τελειώσει με το θέμα των υπολογισμών.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα