Autor |
Beitrag |
Black Rider
      
Beiträge: 21
|
Verfasst: Mo 23.09.13 19:12
Hallo zusammen
Ich habe mehrere Aufgaben, welche auch einem Termin haben, welche auf verschiedene Mitarbeiter aufgeteilt werden.
Das ganze so zu sortieren ist mit compare kein Problem. Jetzt gibt es jedoch Bearbeitungen, welche erst gemacht werden können, sobald der andere Arbeiter seine Arbeit abgeschlossen hat.
Meine Klasse sieht also so aus:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| public class Arbeiten { public Int32 arbeits_id = 0; public Int32 bearbeitungs_id = 0; public DateTime termin = new DateTime(); public string arbeiter = ""; public string auftrag = ""; } |
Wir gehen davon aus, das man für jede Bearbeitung 1nen Tag braucht.
Bsp:
Martin, so wie er ausgelastet ist, kann mit dem Auftrag XYZ erst am 21.12 beginnen. Dh: Markus, kann die zweite Bearbeitung an diesem Auftrag frühestens am 22.12 machen.
Mein Problem ist, das ich für die Sortierung auf das Datum angewiesen bin, an welchem der "Vorarbeiter" seine Bearbeitung gemacht hat. Da ich das aber erst NACH der Sortierung weiss, habe ich jetzt ein Problem.
Ich hoffe ich habe mein Anliegen verständlich rüber gebracht.
Ich denke der Weg dazu ist sicherlich nicht einmal schwer, ich sehen ihn nur nicht. Kann mir da einer helfen?
Gruss Black Rider
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 23.09.13 21:17
Klingt nicht nach etwas das man nur durch sortieren wirklich lösen könnte. Eher nach einer Optimierungsmethode ala Branch&Bound oder dem Johnson-Algorithmus. Die hab ich nur noch ganz dünn aus meinem Studium in Erinnerung. Eigentlich kann ich mich nur erinnern das ich die gehasst habe. Deshalb empfehle ich MS Project oder eine andere Projektverwaltung deiner Wahl 
|
|
Black Rider 
      
Beiträge: 21
|
Verfasst: Mo 23.09.13 22:16
Hi Ralf
Danke, aber aufgeben ist keine Option
Warten wir's mal ab, ob sich noch jemand dazu äussert. Ansonsten probier ich mal was mit ner while. Habe nur schiss das da schnell ne Unendlichschleife draus wird, wenn irgend eine Konstellation nicht nach allen Paramentern sortierbar ist.
|
|
Christoph1972
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Di 24.09.13 06:58
Hi,
ich befürchte ich habe die Problemstellung noch nicht begriffen!!??
Besteht das Problem auch, wenn du ein fixes default Datum vergibst, welches in der fernen Vergangenheit liegt?
Black Rider hat folgendes geschrieben : | Jetzt gibt es jedoch Bearbeitungen, welche erst gemacht werden können, sobald der andere Arbeiter seine Arbeit abgeschlossen hat. |
Das könnte man doch prima über ein Flag kennzeichnen, sogar die verschiedenen Stadien.
Ich kenne etwas ähnliches aus einem Laborbetrieb. Da ist es so, das gewisse Analysen erst gemacht werden können, wenn eine andere Analyse zuvor gelaufen ist, da diese beispielsweise aus dem Rückstand gemacht werden, oder aber das Ergebnis zur Berechnung benötigt wird.
Aber wie gesagt, ich befürchte dein Problem ist so komplex, das mein kleiner Kopf dieses noch nicht erfasst hat. 
_________________ Gruß
Christoph
|
|
Black Rider 
      
Beiträge: 21
|
Verfasst: Di 24.09.13 17:24
Hi Christoph1972
Mit einer Flag? Das verstehe ich nicht.
Mit einem defaultdatum geht es nicht, ausser ich überlege falsch. Ich versuche es nocheinmal zu erklären.
Bsp: Ich habe 3 Arbeiter. 10 Aufträge wobei jeder Auftrag aus 3 Bearbeitungen besteht. Jeder Auftrag hat einen Termin an welchem er fertig sein muss.
Jetzt ist das Problem, das bei Auftrag 100 der Markus mit bohren anfängt, sobald er fertig ist der Paul schleifen kann und sobald dieser fertig ist der Peter das Teil verstopfen kann.
Nehmen wir an dieser Auftrag ist der erste von Markus, dann fängt er heute an(24.09), braucht einen Tag, dann ist er morgen fertig. Also kann morgen der Paul weitermachen (25.09). Sobald dieser fertig ist, wenn Peter gerade nix anderes zu tun hat, kann er also frühstens am 26.09 beginnen, muss aber bis am 20.09 (<< Termin) fertig sein.
Jetzt gibt es jedoch nicht nur einen Auftrag, sondern mehrere die ineinander verlaufen. Eventuell kann ja Paul am 25.09 nicht weitermachen weil er bei Auftrag XYZ noch was machen muss und dieser einen früheren Termin hat.
Das Grundproblem ist also, das für die sortierung bekannt sein muss, WANN der Vorarbeiter mit seiner bearbeitung zu ende ist. Dies weiss man jedoch erst nach der sortierung.
Irgendwie schwebt mir da was im Kopf rum vonwegen zuerst mal grob sortieren, und dann das ganze so lange hin und her rücken lassen bis alles passt. Aber k.A. wie ich das realisieren soll.
Ich hoffe ich konnte es verständlicher rüberbringen.
Gruss Black Rider
|
|
Christoph1972
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Di 24.09.13 18:31
_________________ Gruß
Christoph
|
|
Black Rider 
      
Beiträge: 21
|
Verfasst: Di 24.09.13 20:49
Hi
So hast Du das gemeint mit der Flag.
Das erledigt sich daurch das in der Liste nur Aufträge und Bearbeitungen sind welche noch gemacht werden müssen.
Wenn die Liste noch unsortiert ist, weiss ich als Auftragsverteiler auch nicht wer wann welche Bearbeitung macht. Also ist auch noch kein Datum bekannt. Das ist das Problem.
Richtig, Arbeitsablauf optimierung. Also eigtl. so, das der "Cheff" nicht mehr überlegen muss wann er wem welche Arbeiten gibt sondern das Programm ihm die beste Reihenfolge vorgibt.
Da das Problem doch nicht so einfach zu lösen wird wie ich gehofft habe, werde ich am Weekend ein Beispielprojekt erstellen und hier rein stellen.
Danke an alle und eine kurze Arbeitswoche
Gruss
Black Rider
|
|
Christoph1972
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Di 24.09.13 21:33
Black Rider hat folgendes geschrieben : | so, das der "Cheff" nicht mehr überlegen muss wann er wem welche Arbeiten gibt sondern das Programm ihm die beste Reihenfolge vorgibt. |
Ich denke das ist blanke Theorie und wird in der Praxis nie wirklich funktionieren, ein Chef muss immer überlegen  Ich bin der Meinung, das du erfassen musst, wann eine Arbeit begonnen wird, dann kannst du den Start des nächsten Jobs kalkulieren und auch wann der Starter für seinen nächsten Auftrag frei wird. Demnach wird es ein Produktionsleitsystem oder MES (Manufacturing Execution System) schau mal hier: de.wikipedia.org/wik...ing_Execution_System
Ich denke du hast dir da ein schönens Projekt ausgesucht 
_________________ Gruß
Christoph
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 24.09.13 22:49
Ich habe das Gefühl, die Modellierung bleibt noch hinter der Realität zurück.
Hat jeder Auftrag immer nur diese drei Arbeitssschritte? Gibt es auch Aufträge, wo Arbeitsschritte ausgelassen werden können? Die Bearbeitung dauert immer genau einen Tag? Oder vielfaches von Tagen?
Bis jetzt sieht es eigentlich so aus, als könntest du strikt mit dem Auftrag anfangen, der die geringste freie Pufferzeit (= Zeit bis Deadline - Bearbeitungszeit) hat. Das hat der erste in der Schlange zu machen, der Rest arbeitet einfach das weiter was vorne angefangen wird.
Real wird das wohl so gehandhabt, dass das frühest mögliche Enddatum nach der Kapazität geplant wird. In meinem BWL Skript heißt es dazu: Zitat: | Je häufiger unterschiedliche, voneinander unabhängige Aufträge vollständig oder teilweise in ein- und demselben Bereich verarbeitet werden, umso wichtiger ist die kapazitätsorientierte Terminermittlung. |
Konkret also: Bei vielen Aufträgen muss man das Enddatum nach Auslastung planen. Bei wenige Aufträgen kann man einfach feste Daten vorgeben - der Betrieb wird dann aber nicht ausgelastet. Eine geringe Auslasung ist natürlich doof, weil sich dann (im Beispiel) Markus, Peter und Paul langweilen.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 25.09.13 00:41
So wirklich kapiert hab ich das Problem nicht, aber ich denke mal, du möchtest eine Software schreiben, die deinem Chef die Möglichkeit bietet, die Projekt-Zeiten und Zuordnung der Arbeitsschritte komfortabel zu planen.
Ohne irgendwelche Zeiten wird das nix, aber ich habe eine kleine Idee, wie du deinem Chef doch eine Hilfe beim Planen verschaffen kannst:
Eine Art Zeitstrahl pro Auftrag, vom aktuellen Datum bis zur DeadLine, die er vor gibt, oder die durch andere Faktoren vorgegeben wird.
Die Anzahl der Arbeitsschritte kann flexibel angelegt werden zbd jedem Arbeitsschritt kann ein Mitarbeiter zugeordnet werden.
Die jeweilige Zeit, die Jeder pro Arbeitsschritt hat, kann dann flexibel im Zeitstrahl verschoben werden und ob die ganze Überlegung dann realistisch ist, kann man halbwegs visuell ablesen.
Wenn nun mehrere Aufträge anstehen, können diese Aufträge untereinander aufgereiht stehen. Beginnend am aktuellen Datum und vortlaufend bis zur DeadLine, die unter allen Aufträgen am spätesten ist, sodass die Zeit-Intervalle gleich sind.
So kann er die Arbeitszeit jedes Einzelnen zu ordnen und mit den anderen Aufträgen schauen, wer frei ist.
Denken muss er dann allerdings immer noch selber und eine Absprache mit den Arbeitern ist auch von Vorteil, aber es erleichtert die Planung doch schon um einiges. Etwas Ähnliches gibt es auch in Outlook, nur dass es dort im Wochen-Design ist und der "Zeitstrahl" innerhalb des Tages von Oben nach Unten reicht, wie ein Kalender.
Was du aber noch einbauen könntest:
Du kannst Gemeinsamkeiten aus allen Arbeitsschritten aller Aufträge zusammen sammeln und eine Default-Zeit erfragen. Wenn dann jedem Arbeitsschritt eine dieser Punkte zugeordnet ist, kann die Software eine Voraus-Schätzung abliefern, die dann nur angepasst werden muss.
Mit einbeziehen kannst du ja auch noch fixe Werte für Umfang und Schwierigkeitsgrad.
Und als zusätzliches Feature baust du ein, dass registriert wird, ob eine DeadLine eingehalten wurde und wer bei welchem Arbeitsschritt länger/kürzer als geplant gebraucht hat. Die Werte werden dann immer mit den vorherigen Werten verglichen und ein entsprechender Mittelwert gebildet.
Auch das lässt sich ja wieder automatisieren, indem jeder Arbeiter Beginn und Ende irgendwo registrieren muss.
Das ist denke ich mal das beste, was du da machen kannst, denn gerade bei Zeiten bist du auf feste Werte angewiesen, sonst kannst du eigentlich nichts machen, als den ehlden Wert irgendwie selber abzuschätzen und darauf dann wieder auf bauen.
PS:
Was mir auch noch einfällt, bei uns im Team gibt es seit einiger Zeit das Modell SCRUM, um ein Projekt entsprechend anzugehen.
Das funktioniert sehr gut, gerade beim Thema Softwareentwicklung, denn genau dafür wurde es gemacht. Aber ich denke, auf andere Anwendungsbereiche lässt es sich auch übertragen.
Das erfordert viel Kommunikation im Team, sorgt aber auch gerade zu Beginn dafür, dass das Team die eigenen Fähigkeiten und die Fägigkeiten des Einzelnen besser einschätzen kann, was wiederum die Planung erleichtert.
|
|
Christoph1972
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Mi 25.09.13 07:07
Palladin007 hat folgendes geschrieben : |
Eine Art Zeitstrahl pro Auftrag, vom aktuellen Datum bis zur DeadLine, die er vor gibt, oder die durch andere Faktoren vorgegeben wird.
Die Anzahl der Arbeitsschritte kann flexibel angelegt werden zbd jedem Arbeitsschritt kann ein Mitarbeiter zugeordnet werden.
Die jeweilige Zeit, die Jeder pro Arbeitsschritt hat, kann dann flexibel im Zeitstrahl verschoben werden und ob die ganze Überlegung dann realistisch ist, kann man halbwegs visuell ablesen.
|
Das ist ein MES-System, diese sind auch gerne mit einem "Zeitstrahl" visualisiert. Man findet Beispeile via Google[Bilder] -> MES
Palladin007 hat folgendes geschrieben : |
Wenn nun mehrere Aufträge anstehen, können diese Aufträge untereinander aufgereiht stehen. Beginnend am aktuellen Datum und vortlaufend bis zur DeadLine, die unter allen Aufträgen am spätesten ist, sodass die Zeit-Intervalle gleich sind.
So kann er die Arbeitszeit jedes Einzelnen zu ordnen und mit den anderen Aufträgen schauen, wer frei ist.
|
Zudem besteht so die Möglichkeit einer Auswertung (vorausgesetzt man speichert alles weg) um Schwächen und Probleme aufzuspüren.
Wenn man mal wirklich alles bis ins letzte Detail durchdenkt, wird man festellen, das es ein sehr großes Projekt werden kann. -> Welcher Mitarbeiter kann was, Wann ist wer da (Feiertage/Urlaub/Schichtplan), sind Rohstoffe/Materialen vorhanden.......
Das kann aber fertig gekauft werden, gibt es schon für viele Bereiche:
Software - SCRUM (habe ich soeben gelernt)
Industrie - MES
Landwirdschaft - erweiterte Ackerschlagkarteien
Wenn man gezielt auf die Suche geht, wird man eventuell etwas fertiges zum Kauf finden 
_________________ Gruß
Christoph
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 25.09.13 07:50
Black Rider hat folgendes geschrieben : | Also ist auch noch kein Datum bekannt. Das ist das Problem. |
Richtig. Und solange du kein Datum hast, kannst du auch nicht danach sortieren.
Eine Möglichkeit, wie so ein Problem (sinnvoll) gelöst werden kann, ist eine Liste von Teil-Arbeiten mit einer voraussichtlichen (oder bereits statistisch ermittelten) Bearbeitungszeit. Darüber kannst du dann vom Startzeitpunkt ausrechnen, wann die Arbeit erledigt sein sollte. Das wäre dann dein Datum, dass du suchst. Wenn du dann noch ein Flag mitführst, worüber du feststellen kannst, ob das Ziel-Datum aus der Berechnung entstanden ist oder "echt" ist, hast du auch schon weitere Infos für die Sicherheit der Zeitplanung.
|
|
Black Rider 
      
Beiträge: 21
|
Verfasst: Mi 25.09.13 21:12
Guten Abend zusammen
Erst einmal Danke für die Beiträge und das Ihr Euch solche Mühe gebt.
Die Anzahl und Dauer der Bearbeitungen von den Aufträgen ist nicht immer gleich. Die Anzahl Bearbeitungen wird von mir beim Planen angegeben, da ich zb: weiss das das Teil vorgefräst, geschliffen und dann geschlichtet werden muss. (In diesem Fall 3 Bearbeitungen). Die jeweilige Zeit wird von mir dann geschätzt.
Ich dachte eigtl. nicht das dieses Problem ein Solches Ausmass annimmt. Aus diesem Grund habe ich wohl zu wenig Hintergrundinformationen gegeben. Das Projekt dieser Arbeitsverwaltungssoftware startete in den letzten Weihnachtsferien. Läuft sein Februar schon erfolgreich in der Firma. Damit wurden schon ca. 500 Aufträge eingetragen, 1500 Bearbeitungen bearbeitet und ca. 6000 Arbeitsstunden abgerechnet. Das ganze wird in einer MS SQL DB gespeichert. Die Eingabe der Aufträge läuft über ein dafür Erstelltes Form (Textboxes --> Speichern --> Hochladen). Die Ausgabe der verschiedenen Aufträge werden in DataGridViews angezeigt und die Visualisierung der Planung über einen Terminkalender.
Es läuft auch alles super. Ich will halt nur die Sortierung zur Planung der Zukünftigen Aufträge optimieren.
Ich habe nun das Demoprojekt erstellt. (Bild 1.) Ich habe das Projekt auch angefügt.
Im ersten DataGridView sieht man die Bearbeitungen welche nach Namen und dann nach dem Termin sortiert sind. In dieser Reihenfolge wird dann der Bearbeitungsbegin und das Bearbeitungsende berechnet.
Wenn man die Arbeiten von Pascal ansieht. (Oberes DatagridView) Dann sieht das ja super aus. Er fängt mit der ersten Bearbeitung heute (25.09) an. Diese braucht 2 Tage (Dauer), somit ist er am 27.9 fertig. Am 28 fängt er die nächste an. Mit dieser ist er nach 2 Tagen am 30 fertig.
Der Arbeiter ist somit IMMER ausgelastet
Sieht man die Sache aber vom Standpunkt des Auftrages (DataGridView unten). Habe ich ein fettes Problem.
Die Bearbeitungsnummern sind wild durcheinander. Es wird nicht mit Bearbeitung 1 angefangen, sondern einfach ein Wirrwarr. Halt eben so, wie der Arbeiter gerade Zeit hatte.
Ich muss in der Sortierung irgendwas implementieren das der guckt das die Bearbeitung 2 erst angefangen wird, wenn Bearbeitung 1 zu Ende ist. Etc.
Wie bringe ich also hin, dass jeder Arbeiter bestmöglich ausgelastet ist, die Bearbeitung in richtiger Reihenfolge ausgeführt werden und das Datum jeweils nicht überschneidend ist.
Btw.: Zur Zeit löse ich das so, das in meinem Kalender zum Planen die Bearbeitungen welche nicht Bearbeitungsnummer 1 haben, hellgrün sind. Ich also weiss, das diese noch nicht Bereit sind. Das verfälscht jedoch meine Vorkalkulation der Planung. Da mein Programm vorschlägt das der Arbeiter1 morgen die Platte2 fräst. Da er aber nicht geckt das die noch nicht bereit ist weil der Arbeiter 3 noch nicht fertig ist muss ich eine Bearbeitung vorziehen und dann stimmt die Planung wieder nicht.
Ich hoffe ich konnte es nun verständliche rüberbringen. Wie erwähnt, es geht legendlich um die Sortierung.
Einloggen, um Attachments anzusehen!
|
|
Black Rider 
      
Beiträge: 21
|
Verfasst: Do 26.09.13 20:27
Ich habs 
Eigtl. ist es ganz einfach. Ich sortiere die Liste nach Namen und nach Termin. Somit ist die Reihenfolge klar.
Danach Starte ich mit nem DateTime von JETZT und rechne den in einer while immer weiter hoch. Somit kann ich eigtl. die Zeit simulieren. So gehen ich Bearbeitung für Bearbeitung durch. Wenn Bearbeitung X nicht Bereit ist, weil die Vorarbeit von davon noch nicht beendet ist, schnappt er sich einfach die nächste Bearbeitung.
So im nachhinein gesehen wars ziemlich simpel.
Im Anhang wieder das Bild und für die die es interessiert das Projekt.
Mir ist bewusst, das es von der Performance sicherlich bessere Wege gäbe. Ich habe jedoch so programmiert wie es für meine Vorstellungskraft am besten war. Optimieren kann man es immer noch
Gruss und ein grosses Danke an alle
Black Rider
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Black Rider am Do 26.09.13 20:29, insgesamt 1-mal bearbeitet
|
|
OlafSt
      
Beiträge: 486
Erhaltene Danke: 99
Win7, Win81, Win10
Tokyo, VS2017
|
Verfasst: Sa 28.09.13 00:11
Dieselbe Idee hatte ich auch: Anstatt das Problem aus Sicht des Arbeiters zu betrachten, wäre es deutlich besser, das ganze aus Sicht des Werkstücks zu betrachten und auf dieser Sicht basierend dann seinen Algorithmus zu formulieren.
Schlußendlich weiß das Werkstück am besten, wann es fertig bearbeitet ist 
_________________ Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
|
|
|