Announcement

Collapse
No announcement yet.

NetzplanTechnik

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • NetzplanTechnik

    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
    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)
    mein Code:


    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
    Danke in Voraus.

  • #2
    Ich rate mal und Du verbesserst mich, falls ich falsch liege.

    Ein "Arbeitspaket" wird in Deiner Lösung dargestellt als Instanz von Task.
    Dann hat es keine Nachfolger, wenn Task.Nachfolgers gleich null ist oder keine unbehandelten Tasks enthält.

    Comment


    • #3
      Hallo Luker , ja ist es so eigentlich. liegst ja richtig.

      ich weiße es nicht wie ich machen kann damit ich die berechnung in rückwärt kriege. Es ist zuerst sehr wichtig, dass ich sie in vorwärts berechne damit ich alle früheste begin und früheste ende berechne. dann den rückwärt berechnen.
      um den rückwärt zu berechnen wichtigste ist nur zu sehen alle "Arbeitspakete" die keine nachfolger haben die bekommen einfach als Spätere ende die maximale wert von Frühester ende.

      wie kann ich es tun? hat du eine idee bitte?

      Comment

      Working...
      X