static public List <Daerah> getInfoDaerah(string file_keterhubungan, string file_populasi)
        {
            int           counter = 0, numOfDaerah = 0;
            string        line, line3, daerah_terinfeksi = "";
            List <Daerah> list_daerah = new List <Daerah>();

            // Read the file and display it line by line.
            System.IO.StreamReader file =
                new System.IO.StreamReader(file_populasi);
            while ((line = file.ReadLine()) != null)
            {
                counter++;
                if (counter == 1)
                {
                    string[] line1 = line.Split(' ');
                    for (int i = 0; i < line1.Length; i++)
                    {
                        if (i == 0)
                        {
                            numOfDaerah = Int32.Parse(line1[i]);
                        }
                        else if (i == 1)
                        {
                            daerah_terinfeksi = line1[i];
                        }
                    }
                }
                else if (counter > 1)
                {
                    string[] line2 = line.Split(' ');
                    for (int i = 0; i < line2.Length; i++)
                    {
                        Daerah daerah_temp = new Daerah();
                        if (i == 0)
                        {
                            daerah_temp.setNamaDaerah(line2[i]);
                            daerah_temp.setPopulasi(Int32.Parse(line2[i + 1]));
                            daerah_temp.setFirstDayInfected(100000000);
                            list_daerah.Add(daerah_temp);
                        }
                    }
                }
            }

            counter = 0;
            System.IO.StreamReader file1 =
                new System.IO.StreamReader(file_keterhubungan);
            while ((line3 = file1.ReadLine()) != null)
            {
                counter++;
                if (counter > 1)
                {
                    string[] line4 = line3.Split(' ');
                    int      i     = 0;
                    int      a     = 0;
                    bool     found = false;
                    while (a < list_daerah.Count && !found)
                    {
                        if (list_daerah[a].nama == line4[i])
                        {
                            found = true;
                        }
                        else
                        {
                            a += 1;
                        }
                    }
                    Daerah daerah_temp = list_daerah[a];
                    daerah_temp.addChildren(line4[i + 1], float.Parse(line4[i + 2]));
                }
            }

            file1.Close();
            file.Close();
            // System.Console.WriteLine("There were {0} lines.", counter);
            System.Console.WriteLine("Ada {0} daerah", numOfDaerah);
            System.Console.WriteLine("Daerah yang pertama kali diinfeksi {0}", daerah_terinfeksi);
            foreach (Daerah daerah in list_daerah)
            {
                if (daerah_terinfeksi == daerah.nama)
                {
                    daerah.setIsInfected(true);
                }
            }
            return(list_daerah);
        }
        static public List <Daerah> findInfectedDaerah(int jumlahHari, string file_keterhubungan, string file_populasi)
        {
            List <Daerah>  list_daerah    = new List <Daerah>();
            Queue <string> sumber         = new Queue <string>();
            Queue <String> tujuan         = new Queue <String>();
            Queue <float>  peluang_travel = new Queue <float>();

            // BACA FILE
            list_daerah = getInfoDaerah(file_keterhubungan, file_populasi);
            foreach (Daerah daerah in list_daerah)
            {
                System.Console.WriteLine();
                daerah.printInfo();
            }

            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"C:\Users\ASUS\source\repos\SimulasiCovid19\SimulasiCovid19\file-external\bfs-queue.csv"))
            {
                file.WriteLine("Nama Daerah,Berhasil Terinfeksi,Daerah Asal Infeksi,Populasi Terinfeksi,Hari Pertama Terinfeksi");
                string line = "";

                // INISIASI QUEUE PERTAMA
                Daerah first_daerah = new Daerah();
                string first;
                foreach (Daerah daerah in list_daerah)
                {
                    if (daerah.is_infected)
                    {
                        first_daerah = daerah;
                    }
                }

                first = first_daerah.nama;
                int i = find_index(list_daerah, first);
                list_daerah[i].setFirstDayInfected(0);
                list_daerah[i].setTotalHari(jumlahHari - list_daerah[i].first_day_infected);

                foreach (KeyValuePair <string, float> kvp in list_daerah[i].daerah_tetangga)
                {
                    sumber.Enqueue(list_daerah[i].nama);
                    tujuan.Enqueue(kvp.Key);
                    peluang_travel.Enqueue(kvp.Value);
                }

                // LOOPING
                while (tujuan.Count() > 0)
                {
                    line = "";
                    string c_sumber         = sumber.Dequeue();
                    string c_tujuan         = tujuan.Dequeue();
                    float  c_peluang_travel = peluang_travel.Dequeue();

                    int s = find_index(list_daerah, c_sumber);
                    int t = find_index(list_daerah, c_tujuan);

                    // MENGECEK APAKAH BERHASIL TERINFEKSI/TIDAK
                    if (list_daerah[s].berhasil_terinfeksi(c_peluang_travel) == true)
                    {
                        list_daerah[t].setIsInfected(true);
                        double p   = list_daerah[s].populasi;
                        double tr  = c_peluang_travel;
                        double day = -4 * (1 / Math.Log(Math.E, (p * tr - 1) / (p - 1))) + 1;

                        int first_day_new = (int)day + list_daerah[s].first_day_infected;
                        System.Console.WriteLine("first_day_new {0}", first_day_new);
                        System.Console.WriteLine("first_day_old {0}", list_daerah[t].first_day_infected);

                        // ANAK DARI NODE AKAN DIMASUKKAN KE QUEUE APABILA FIRST DAY INFECTED LEBIH KECIL DARI YANG LAMA
                        if (first_day_new < list_daerah[t].first_day_infected)
                        {
                            list_daerah[t].setInfectedFrom(list_daerah[s].nama);
                            list_daerah[t].setFirstDayInfected(first_day_new);
                            list_daerah[t].setTotalHari(jumlahHari - list_daerah[t].first_day_infected);
                            System.Console.WriteLine("day pertama {0} terinfeksi = {1}", list_daerah[t].nama, list_daerah[t].first_day_infected);
                            foreach (KeyValuePair <string, float> kvp in list_daerah[t].daerah_tetangga)
                            {
                                sumber.Enqueue(list_daerah[t].nama);
                                tujuan.Enqueue(kvp.Key);
                                peluang_travel.Enqueue(kvp.Value);
                            }
                        }
                    }

                    line += list_daerah[t].nama + ",";
                    if (list_daerah[s].berhasil_terinfeksi(c_peluang_travel) == true)
                    {
                        int terinfeksi = (int)(list_daerah[s].populasi_terinfeksi * c_peluang_travel);
                        line += "Berhasil" + ",";
                        line += list_daerah[s].nama + ",";
                        line += terinfeksi + ",";
                        line += list_daerah[t].first_day_infected;
                    }
                    else
                    {
                        line += "Tidak Berhasil" + ",";
                        line += list_daerah[s].nama + ",";
                        line += "0,-";
                    }

                    file.WriteLine(line);
                }
            }
            return(list_daerah);
        }
Beispiel #3
0
        public void Form2_Load(Form1 form1)
        {
            string file_keterhubungan = f1.textBox2.Text;
            string file_populasi      = f1.textBox1.Text;
            string str  = f1.inputBox.Text;
            int    hari = Int32.Parse(str);
            Info   info = new Info(hari, file_keterhubungan, file_populasi);

            info.writeBFSIntoCSV();

            //create a viewer object
            Microsoft.Msagl.GraphViewerGdi.GViewer viewer = new Microsoft.Msagl.GraphViewerGdi.GViewer();
            //create a graph object
            Daerah child = new Daerah();

            Microsoft.Msagl.Drawing.Graph graph = new Microsoft.Msagl.Drawing.Graph("Graf");
            foreach (Daerah parent in info.infected_daerah)
            {
                foreach (KeyValuePair <string, float> anak in parent.daerah_tetangga)
                {
                    // jika anak terinfeksi dan asalnya dari daerah maka beri warna
                    // cari nama anak di info.infected_daerah
                    foreach (Daerah daerah in info.infected_daerah)
                    {
                        if (anak.Key == daerah.nama)
                        {
                            child = daerah;
                        }
                    }
                    // jika child terinfeksi dan asalnya dari parent maka beri warna
                    if (child.is_infected)
                    {
                        if ((child.infected_from == parent.nama))
                        {
                            graph.AddEdge(parent.nama, child.nama).Attr.Color = Microsoft.Msagl.Drawing.Color.Red;
                        }
                        else
                        {
                            graph.AddEdge(parent.nama, anak.Key);
                        }
                    }
                    else
                    {
                        graph.AddEdge(parent.nama, anak.Key);
                    }
                }
            }
            // mewarnai node
            foreach (Daerah daerah in info.infected_daerah)
            {
                if (daerah.is_infected)
                {
                    graph.FindNode(daerah.nama).Attr.FillColor = Microsoft.Msagl.Drawing.Color.Red;
                }
                else
                {
                    graph.FindNode(daerah.nama).Attr.FillColor = Microsoft.Msagl.Drawing.Color.Gray;
                }
            }
            viewer.Graph = graph;
            //associate the viewer with the form
            this.SuspendLayout();
            viewer.Dock = System.Windows.Forms.DockStyle.Fill;
            this.Controls.Add(viewer);
            this.ResumeLayout();
        }