Hallo an Alle, bitte ich bin neue in C# und seit ca 2 Monaten bei dem Firma wo ich mein praxissemester mache versuche ich ein NetzplanTechnik zu berechnen.
ich habe bis jetzt die Vorwärtskalkulation geschafft aber die Rückwärtskalkulation schaffe ich irgendwie Nicht. und ich brauche eure Hilfe Bitte. Dazu gebe ich Ihnen Alle Infos und mein Code
Algorithmus des Netzplanes
mein Code:
Danke in Voraus.
ich habe bis jetzt die Vorwärtskalkulation geschafft aber die Rückwärtskalkulation schaffe ich irgendwie Nicht. und ich brauche eure Hilfe Bitte. Dazu gebe ich Ihnen Alle Infos und mein Code
Algorithmus des Netzplanes
Code:
Berechne-Netzplan (Arbeitspakete A = {AP1,...,APn}, Abhängigkeit Dep ⊂ A × A) A' ← TOPOLOGISCHES-SORTIEREN(A,Dep) (jetzt stehen alle abhängigen APs hinter ihren Voraussetzungen) for AP ∈ A' (gemäß topologischer Reihenfolge) do ⌈ if AP ist erste Aufgabe then [ FB(AP) ← 0 else [ FB(AP) ← max X ∈ AP mit (X,AP) ∈ Dep : FE(X) ⌊ FE(AP) ← FB(AP) + D(AP) for AP ∈ A' (gemäß umgekehrter topologischer Reihenfolge) do ⌈ if AP ist letzte Aufgabe then [ SE(AP) ← maximale Porjektdauer (bzw. FE(AP)) else [ SE(AP) ← min X ∈ AP mit (AP,X) ∈ Dep : SB(X) ⌊ SB(AP) ← SE(AP) - D(AP)
Code:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.Collections; using System.Windows; namespace WindowsFormsApplication1 { public partial class Form1 : Form { SqlConnection connection = new SqlConnection("Data Source= .\\SQLEXPRESS;" + " Initial Catalog= zeit; integrated security = true"); DataSet ds = new DataSet(); Hashtable ArbeitPacket; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void getAbhaengigkeit() { SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand("SELECT VorgangName"+ ",Abhängigkeiten FROM vSicht_Abhängigkeit WHERE Abhängigkeiten is Not null", connection); ds.Clear(); da.Fill(ds); dataGr.DataSource = ds.Tables[0]; connection.Open(); da.SelectCommand.ExecuteNonQuery(); DataTable dt = ds.Tables[0]; foreach (DataRow row in dt.Rows) { Task t1 = (Task)ArbeitPacket[row[0]]; Task t2 = (Task)ArbeitPacket[row[1]]; t1.Nachfolgers.Add(t2); } connection.Close(); } private void selectAll_Click(object sender, EventArgs e) { DataSet dss = new DataSet(); SqlDataAdapter dat = new SqlDataAdapter(); dat.SelectCommand = new SqlCommand("SELECT V_Name, Dauer,Frühester_Anfang,Frühestere_Ende "+ ", Späterer_Anfang,Späterere_Ende,Puffer from Netzplan", connection); dss.Clear(); dat.Fill(dss); DataGrSelect.DataSource = dss.Tables[0]; connection.Open(); dat.SelectCommand.ExecuteNonQuery(); ArbeitPacket = new Hashtable(); DataTable dt = dss.Tables[0]; foreach (DataRow row in dt.Rows) { Task task = new Task(); task.Name = row[0].ToString(); task.Dauer = (int)row[1]; ArbeitPacket.Add(task.Name, task); } connection.Close(); getAbhaengigkeit(); keys = ArbeitPacket.Keys; foreach (Object key in keys) { textBox1.Text += "[" + ArbeitPacket[key].ToString() + "] - "; } ArbeitPacket = TopologischeSort(ArbeitPacket); } public Hashtable TopologischeSort(Hashtable arbeitPacket) { List<Task> sortiert = new List<Task>(); int ohne = 0; foreach (Object key in keys) { Task task = (Task)ArbeitPacket[key]; if (task.Nachfolgers.Count == 0) { sortiert.Insert(0, task); ohne++; } else { int i = 0; int count = task.Nachfolgers.Count; while (count > 0 && i < sortiert.Count) { if (task.Nachfolgers.Contains(sortiert[i])) { count--; } i++; } if (count != 0) sortiert.Insert(ohne, task); else sortiert.Insert(i, task); } } textBox1.Text += "************************"; Hashtable result = new Hashtable(); foreach (Task t in sortiert) { t.computeTermin(); textBox1.Text += "[" + t + "] - "; result.Add(t.Name, t); } return result; } public ICollection keys { get; set; } private void SpaetBerechnung_Click(object sender, EventArgs e) { } } } //Meine angehängte klasse using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Data; using System.Collections; namespace WindowsFormsApplication1 { class Task { SqlConnection connection = new SqlConnection("Data Source= .\\SQLEXPRESS;" + " Initial Catalog= zeit; integrated security = true"); DataSet ds = new DataSet(); public String Name{get; set;} public int Dauer{get; set;} public int FA{get; set;} public int FE { get; set; } public int SA { get; set; } public int SE { get; set; } public int Puffer { get; set; } public List<Task> Nachfolgers{get; set;} public List<Task> Vorgang { get; set; } public Task() { Nachfolgers = new List<Task>(); } public override string ToString() { String val = Name + "* *" + Dauer + "* *" + FA + "* *" + FE +"* *" + SA + "* *" + SE; for (int i = 0; i < Nachfolgers.Count; i++) val += " " + Nachfolgers[i].Name + ","; return val; } public void computeTermin() { this.FA = Max(Nachfolgers); this.FE = this.FA + this.Dauer; this.SE = FindMaxFEnde(Nachfolgers); if (this.SE > 0) { this.SE = FindMaxFEnde(Vorgang); this.SA = this.SE - this.Dauer; } else { this.SE = FE; this.SA = this.SE - this.Dauer; } } private int Max(List<Task> tasks) { if (tasks.Count == 0) return 0; int max = tasks[0].FE; //int max2 = tasks[0].SE; foreach (Task task in tasks) { if (task.FE > max) max = task.FE; } return max; } public int FindMaxFEnde(List<Task> task) { if (task.Count == task.LongCount()) if (task.Count != 0) SE = this.FE; return SE; } } } //Bitte wie kann ich die RückwärtKalkulation berechnen? Wie kann ich prüfen meine arbeitspacket keine nachfolger mehr hat? Wenn ich es weiße dann habe ich die Aufgabe gelöst
Comment