Decision Making Under Uncertainty Automation C#(Belirsizlik Altında Karar Verme Otomasyonu C#)

Karar verme teknikleri çatısı altında bulunan karar verme yöntemlerinden belirsizlik altında karar verme problemlerinin  çözümünün C# dilinde yazılmış kodlarını paylaşma gereği duydum çünkü, internette bu konuyla alakalı Türkçe ve yabancı kaynak göremedim.Yorum satırlarında gerekli bilgiler verildiği için bir ön açıklama yapma gereği duymadım ama sizler sorularınız olduğu takdirde yorum bırakabilir veya instagram hesabımdan benimle iletişime geçebilirsiniz.İşinize yarayacağını umuyorum iyi çalışmalar dilerim.





            int n = 0, m = 0;

            Console.WriteLine("*****Decision Making Under Uncertainty Automation*****"); // Belirsizlik altında karar verme otomasyonu.

            Console.WriteLine("Please enter the values we need"); // Lütfen ihtiyacımız olan sayıları girin
            //Create the matris ( Matrisi oluşturacağız)

            Console.WriteLine("Please enter the matris column pax :  "); // lütfen matrisin sütun sayısını giriniz

            n = Convert.ToInt32(Console.ReadLine());  // n değişkenine sütunu atadık

            Console.WriteLine("Please enter the matris line pax : "); // lütfe matrisin satır sayısını giriniz

            m = Convert.ToInt32(Console.ReadLine()); // m değişkenine satır sayısını atadık

            int[,] masterValues = new int[n,m]; // matrisimizi n ve m sayılarına göre oluşturduk.

            string[] decisionVariable = new string[n]; // decisionVariable alternatif demek yani burada alternatiflerin adını tutucaz(örn. network)

            //Read Values // Kullanıcıdan matrise veri girişi yapmasını istiyoruz burada


            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    Console.WriteLine("Please enter Values : [" + (i + 1) + "][" + (j + 1) + "]");

                    masterValues[i, j] = Convert.ToInt32(Console.ReadLine());
                }
            }
            // alternatiflerin adını girdireceğiz aşağıdaki döngüde

            // ( örn : network , network + güvenlik)
            Console.WriteLine("Please enter the decision variables name : "); // LÜTFEN ALTERNATİFLERİN ADINI GİRİN
           
           
            for (int i = 0; i < n; i++)
            {
                Console.WriteLine((i + 1) + ". decision name : ");  

                decisionVariable[i] = Console.ReadLine();

            }
            Console.Clear(); // bu komutla konsol ekranını temizlemiş olduk yani önceki yazılanlar silindi.

            Console.WriteLine(" ");

            //Write Values On Screen (Kullanıcının girdiği değerleri ekrana yazdırıcaz.)

            for (int i = 0; i < n; i++)
            {

                for (int j = 0; j < m; j++)
                {
                    Console.Write(masterValues[i, j] + "\t");

                }
                Console.WriteLine(" ");
            }

            //MaxiMax


            string maxiMaxDecisionName = " "; // Maximax işlemi sonucunda seçilen kararın adını tutacağımız değişkeni tanımladık.

            int maxiMax = 0; // maximax sonuç değerimizi tutacağımız değişkeni tanımladık.

            int[] maxNumber = new int[n]; // Her satırın en büyük değerini tutacağımız diziyi tanımladık.

            int helper = 0; // her satırdaki büyük değişkeni bulup maxNumber dizisine atmamızı sağlayacak olan değişken.

            for (int i = 0; i < n; i++)   
            {
                for (int j = 0; j < m; j++)                 //her satırdaki en büyük değeri buluyoruz
                {
                    if (masterValues[i, j] > helper)
                    {
                        helper = masterValues[i, j];


                    }

                }
                maxNumber[i] = helper;
            }
            helper = 0;                     // bu sefer her satırın en büyük elemanları arasında en büyük olanı seçeceğimiz için helper değişkenini tekrardan 0 yaptık.
            for (int i = 0; i < n; i++)
            {
                if (maxNumber[i] > helper)
                {
                    maxiMax = maxNumber[i];
                    maxiMaxDecisionName = decisionVariable[i];
                }
            }

            //MaxiMin
            int maxiMin = 0;    // maximin karar değişkenimizi tutacağımız değişkeni tanımladık
            string maxiMinDecisionName = " ";  // maximin de seçilen alternatifi tutacağımız değişkeni tanımladık  
            int[] minNumber = new int[n];    // her satırın maximin değerini tutacağımız diziyi tanımladık
            helper = 100000;  /// küçük olan sayıyı bulmak için helper değişkenine 10000 sayısını atadık.
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)         //her satırdaki en küçük elemanı buluyoruz
                {
                    if (masterValues[i, j] < helper)
                    {
                        helper = masterValues[i, j];

                    }

                }
                minNumber[i] = helper;
            }

            helper = -500;  // en büyük elemanı bulacağımız için helpera -500 tanımladık
            for (int i = 0; i < n; i++)
            {
                if (minNumber[i] > helper)
                {
                    helper = minNumber[i];
                    maxiMin = minNumber[i];
                    maxiMinDecisionName = decisionVariable[i];

                }
            }
            //Harwics
            Console.WriteLine("Please enter the alpha value : "); // alfa değeri istiyoruz kullanıcıdan
            double alpha = Convert.ToDouble(Console.ReadLine()); //
            double oneMinusAlpha = (1 - alpha); // burada 1- alfa değişkenine değer olarak 1-alpha değerini atadık.
            int[] harwics = new int[n];
            string harwicsDecisionName = "";
            for (int i = 0; i < n; i++)
            {
                harwics[i] = (int)(alpha * maxNumber[i]) + (int)(oneMinusAlpha * minNumber[i]); // Her satırdaki en büyük elemanla alfayı,
                                                                                                // en küçük elemanla 1- alfayı çarpıyoruz
            }
            helper = 0;
            double harwicsMax = 0;
            for (int i = 0; i < n; i++)
            {
                if (harwics[i] > helper)                // burada her alternatif için bulduğumuz hurwics değerlerinin en büyüğünü buluyoruz.
                {
                    harwicsMax = harwics[i];
                    harwicsDecisionName = decisionVariable[i];
                }
            }
            //Laplace Criterion
            double temporary = 0;
            int[] laplace = new int[n];
            int laplaceDecision = 0;
            string laplaceDecisionName = "";
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {

                    temporary = temporary + masterValues[i, j];             //geçici değişkene bütün satırın elemanlarını atıyoruz,
                                                                            //aşağıda (1 / satır sayısı)na bölebilmek için.

                }
                temporary *= 0.166666666666667;
                laplace[i] = Convert.ToInt32(temporary);

                temporary = 0;

            }
            temporary = 0;
            for (int i = 0; i < n; i++)
            {
                if (laplace[i] > temporary)                 // her  alternatif için bulduğumuz laplace değerlerinin en büyük olanını bulduğumuz kısımdayız
                {
                    laplaceDecision = laplace[i];
                    laplaceDecisionName = decisionVariable[i];
                }
            }
            //MinMax
            int[] minMax = new int[m];              //her sütunun minmax değerini tutacağımız diziyi tanımladık
            int[,] temporaryMasterValues = new int[n, m]; // minmax işlemi sonrasında matrisin yeni halini tutacağımız matrisi tanımladık.
            int counter = 0;
            int c = 0;
            int l = 0;
            helper = -500;          
            for (int i = 0; i < n; i++)                         // ana matrisimizi yeni matrisin içine kopyalıyoruz
            {
                for (int j = 0; j < m; j++)
                {
                    temporaryMasterValues[i, j] = masterValues[i, j];
                }
            }


            for (l = 0; l < m;     )             //Burada her sütunun  en büyük değerini bulacağımızdan ötürü bir sayaç yardımıyla bu işlemi gerçekleştirdik
            {                                    // mantığı ise sayaç satır sayısı kadar döndüğünde satır indisini başa al sütunu ise 1 arttır şeklinde
                if (masterValues[c, l] > helper) // bir yol izliyoruz.
                {
                    helper = masterValues[c, l];
                    minMax[l] = masterValues[c, l];
                }
                counter++;
                c++;
                if (counter == n)
                {
                    counter = 0;
                    c = 0;
                    l++;
                    helper = -500;
                }
            }
            c = 0;
            l = 0;
            counter = 0;           
            for (l = 0; l < m;)                 //burada ise her sütunun en büyük elemanını bulduktan sonra o sütune ait elemanlardan bulduğumuz
            {                                   //sayıyı çıkartıyoruz.
                temporaryMasterValues[c, l] = minMax[l] - (temporaryMasterValues[c, l]);
                counter++;
                c++;
                if (counter == n)
                {
                    counter = 0;
                    c = 0;
                    l++;
                }

            }
            int[] minMaxsMaxNumber = new int[n];
            int miniMax = 0;                   
            string minMaxDecisionName = " ";
            //sort
            helper = -500;
            for (int i = 0; i < n; i++)         //artık yeni tabloyu elde ettik ve her satırın en büyüğünü bulup onlar arasından
            {                                   //en küçüğünü seçeceğimiz kısımdayız.
                for (int j = 0; j < m; j++)
                {
                    if (temporaryMasterValues[i, j] > helper)
                    {
                        helper = temporaryMasterValues[i, j];


                    }

                }
                minMaxsMaxNumber[i] = helper;
                helper = -500;
            }
            helper = -500;
            for (int i = 0; i < n; i++)
            {
                if (minMaxsMaxNumber[i] > helper)
                {
                    miniMax = minMaxsMaxNumber[i];
                    minMaxDecisionName = decisionVariable[i];

                }
            }

            // Expected Value(gain)    -- (beklenen değer / kar )
            int[] expectedValue = new int[n];
            double[] expectedValueMultiply = new double[6] { 0.15, 0.25, 0.1, 0.15, 0.25, 0.1 };


            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {

                    expectedValue[i] += Convert.ToInt32(expectedValueMultiply[j] * Convert.ToDouble(masterValues[i, j]));
                }
            }
            //sort
            helper = -500;                  //burada her satır için bulduğumuz değerlerin en büyüğünü alıyoruz.
            int expectedValueDecision = 0;
            string expectedValueDecisionName = " ";
            for (int i = 0; i < n; i++)
            {
                if (expectedValue[i] > helper)
                {
                    helper = expectedValue[i];
                    expectedValueDecision = expectedValue[i];
                    expectedValueDecisionName = decisionVariable[i];
                }
            }

            // Expected value of complete information     // tam bilginin beklenen değeri
            double evoci = 0;
            c = 0;
            l = 0;
            counter = 0;
            for (l = 0; l < m;)
            {
                if (temporaryMasterValues[c, l] == 0)
                {
                    evoci += expectedValueMultiply[l] * Convert.ToDouble(masterValues[c, l]);
                }
                counter++;
                c++;
                if (counter == 3)
                {
                    counter = 0;
                    c = 0;
                    l++;
                }

            }

            double realEvoci = evoci - expectedValueDecision;

            //Write the results // artık sonuçları ekrana yazdırıyoruz.
            Console.WriteLine(" ************************* MaxiMin *************************");
            Console.WriteLine(" ");
            Console.WriteLine("MaxiMin valuse is : " + maxiMin + ". \t And decision is : " + maxiMinDecisionName);
            Console.WriteLine(" ");
            Console.WriteLine(" ************************* MaxiMax *************************");
            Console.WriteLine(" ");
            Console.WriteLine("MaxiMax value is : " + maxiMax + ". \t And decision is : " + maxiMaxDecisionName);
            Console.WriteLine(" ");
            Console.WriteLine(" ************************* Hurwicz *************************");
            Console.WriteLine(" ");
            Console.WriteLine("The output of the table obtained based on Hurwicz criterion is as follows as a result of the examination, the decision value was : [" + harwicsMax + "]. \t And decision is" +
                ":" + harwicsDecisionName);

            for (int i = 0; i < n; i++)
            {

                Console.WriteLine(harwics[i]);

            }
            Console.WriteLine(" ************************* Laplace *************************");
            Console.WriteLine("The output of the table obtained based on Laplace criterion as follows as a result of the examination,the decision value was : [" + laplaceDecision + "]. \t And decision is " +
                ":" + laplaceDecisionName);

            for (int i = 0; i < n; i++)
            {

                Console.WriteLine(laplace[i]);

            }
            Console.WriteLine(" ");
            Console.WriteLine(" *************************minMax *************************");
            Console.WriteLine(" ");
            Console.WriteLine("You see your table status after minMax progress under this line ;  ");
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    Console.Write(temporaryMasterValues[i, j] + "\t");
                }
                Console.WriteLine(" ");
            }
            Console.WriteLine(" ");
            Console.WriteLine("And you see  every lines biggest value is under this line ");
            Console.WriteLine(" ");
            for (int i = 0; i < n; i++)
            {
                Console.WriteLine(minMaxsMaxNumber[i]);
            }
            Console.WriteLine(" ");
            Console.WriteLine("And miniMax decision value is : [" + miniMax + "],miniMax decision is :" + minMaxDecisionName);
            Console.WriteLine(" ");
            Console.WriteLine(" ************************* Expected Value *************************");
            Console.WriteLine(" ");
            Console.WriteLine("You see your decision and decisions expected values under this line");
            Console.WriteLine(" ");
            for (int i = 0; i < n; i++)
            {
                Console.WriteLine("[" + decisionVariable[i] + "] :" + expectedValue[i]);
            }
            Console.WriteLine(" ");
            Console.WriteLine("And expected values decision value is : [" + expectedValueDecision + "],and decision variable is : " + expectedValueDecisionName);
            Console.WriteLine(" ");
            Console.WriteLine(" ************************* Expected Value Of Complete Information *************************");
            Console.WriteLine(" ");
            Console.WriteLine("Expected value of complete informations is : " + evoci + " - " + expectedValueDecision + " = " + realEvoci);
            Console.ReadKey();
            Console.Clear();

                Console.ReadKey();