folder Tahribat.com Forumları
linefolder Programlamaya Giriş
linefolder Program İçin Algoritma Önerisi



Program İçin Algoritma Önerisi

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dhmm
    dhmm's avatar
    Kayıt Tarihi: 15/Eylül/2011
    Erkek

    Eger acelen yoksa ugrasabilirim c# win formile bisiler yapabilirim hocam


    Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver !!! // Hayatin herkes icin bir bavulu vardir !!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Zande
    Zande's avatar
    Kayıt Tarihi: 16/Mayıs/2012
    Erkek

    Acelem yok. Bende yapabilirim ancak dediğim gibi algoritmayı oturtamadım. Müsait olduğun zaman bana bir draft hazırlayabilirsen, ben üzerinden devam edebilirim. Çok teşekkürler.

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dhmm
    dhmm's avatar
    Kayıt Tarihi: 15/Eylül/2011
    Erkek

    Kardesim,

    5 tur siviyi tanklara karistirmadan koymak diyorsun....

    Bunu tam kavramadim... Demek istedigim her siviyi esit esit tanklara mi bolucek...?

    Zaten tankta karismiyorlar mi ?

     

    Aksam pcyi acarim buyuk ihtimal... istiyorsan pmden ulas vereyim maili yardimci olayim...

     

    dhmm tarafından 26/Haz/13 11:28 tarihinde düzenlenmiştir

    Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver !!! // Hayatin herkes icin bir bavulu vardir !!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    guru
    guru's avatar
    Kayıt Tarihi: 30/Mart/2007
    Erkek

    hocam bu soruyu gecen gun bi arkadasima sordum ve onun icin cozdum. iliskili c kodunu asagida atiyorum.

    olayin mantigi su sekilde, tanklarin butun permutasyonlarini bulduruyoruz ve her biri icin sivilari sirasiyla tanklara aktariyoruz. her ihtimali goz onunde bulundururken de, 'kac tank kullanildi ?' ve 'kaci daha aktif kullanildi ?' sorulariyla en iyi ihtimali bulmaya calisiyoruz. ornek olmasi icin yazilmis bi kod bu yuzden guzel bi yaklasim ve kodlama beklememeniz yerinde olur :)

     

    #include <stdio.h>
    #include <string.h>
    
    #define N 3
    #define ARRAYSIZE(arr) ( sizeof((arr)) / sizeof((*arr)) )
    
    static int best [N] = {0};
    static int used_tank_count = 0x7FFFFFFF;
    static int rem_tank_size = 0x7FFFFFFF;
    
    void print_tanks(int *arr, int n)
    {
    	int i;
    	
    	for (i = 0; i < n; ++i) {
    		printf("%d ", arr[i]);
    	}
    }
    
    void calculate(int *tanks, int ntanks, int *liqs, int nliqs)
    {
    	int i;
    	int cur_liq, tank_cnt;
    	int rem_size;
    	
    	for (rem_size = tank_cnt = i = 0; i < nliqs; ++i) {
    	
    		cur_liq = liqs[i];
    		for (; cur_liq > 0; tank_cnt++) {
    			// tasma olucak
    			if (tank_cnt >= ntanks) 
    				goto overflow;
    			cur_liq = cur_liq - tanks[tank_cnt];
    		}
    			
    		// '-=' cunku cur_liq eksi oldugu icin.. 
    		//  ters mantik yani ;)
    		rem_size -= cur_liq;
    	}
    overflow:
    
    	// en iyi durum olustu mu ? 
    	if (tank_cnt <= used_tank_count && rem_size < rem_tank_size) {
    		used_tank_count = tank_cnt;
    		rem_tank_size = rem_size;
    		memcpy(best, tanks, sizeof(best));
    	}
    	
    	print_tanks(tanks, ntanks);
    	printf(": %d (%d)\n", tank_cnt, rem_size);
    }
    
    void swap(int *i, int *j)
    {
    	int temp = *i;
    	*i = *j;
    	*j = temp;
    }
    
    void findsols(int *tanks, int j, int ntanks, int *liqs, int nliq)
    {
    	int i;
    	
    	if (j == ntanks - 1)
    		calculate(tanks, ntanks, liqs, nliq);
    	
    	for (i = j; i < ntanks; ++i) {
    		swap(&tanks[i], &tanks[j]);
    		findsols(tanks, j + 1, ntanks, liqs, nliq);
    		swap(&tanks[i], &tanks[j]);
    	}
    }
    
    int main(int argc, char **argv)
    {
    	int liqs[] 	= {30, 20};
    	int tanks[N] 	= {10, 20, 30};
    	int i;
    	
    	findsols(tanks, 0, ARRAYSIZE(tanks), liqs, ARRAYSIZE(liqs));
    	
    	printf("--------\n");
    	
    	print_tanks(best, ARRAYSIZE(tanks));
    	printf(": %d (%d)\n", used_tank_count, rem_tank_size);
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    guru tarafından 05/Ağu/13 13:42 tarihinde düzenlenmiştir

    ..
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tarikat Şeyhi
    HolyOne
    HolyOne's avatar
    Kayıt Tarihi: 01/Haziran/2002
    Erkek

    mts nedir ? ağırlıkmı ? hacimmi?


    Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı kötektir!
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Zande
    Zande's avatar
    Kayıt Tarihi: 16/Mayıs/2012
    Erkek

    İlgilenen arkadaşlara teşekkürler. Şeyhim, mts = metric tonnes daha bir türkçesi TON :)

  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tarikat Şeyhi
    HolyOne
    HolyOne's avatar
    Kayıt Tarihi: 01/Haziran/2002
    Erkek

    Hocam mts yi yanlış algıladığımdan önceki kodda Volume da yanlış hesaplama var. Yenisini bu şekilde çıkardım

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public class Sivi : IComparable
            {
                public string Name { get; set; }
                public double Ton { get; set; }
                public double Density { get; set; }
    
                public Sivi(string namestr, double mts, double densityf)
                {
                    Ton = mts;
                    Name = namestr;
                    Density = densityf;
                }
    
                public double Volume { get { return Ton / Density; } }
    
                public int CompareTo(object obj)
                {
                    return this.Volume.CompareTo(((Sivi)obj).Volume);
                }
    
                public override string ToString()
                {
                    return Name + "\tSize" + Ton.ToString() + "\tVol:" + Volume.ToString();
                }
    
                public double KalanVolume { get; set; }
            }
    
            public class Tank : IComparable
            {
                public string Name { get; set; }
                public double Volume { get; set; }
                public Sivi Liquid { get; set; }
    
                public Tank(string namestr, double volumef)
                {
                    Liquid = null; //en basta ici bos
                    Volume = volumef;
                    Name = namestr;
                }
    
                public double DoluOlanVolume { get; set; }
    
                public int CompareTo(object obj)
                {
                    return this.Volume.CompareTo(((Tank)obj).Volume);
                }
    
                public override string ToString()
                {
                    string str = Name + "\tVol:" + Volume.ToString();
    
                    if (this.Liquid != null) str += "\r\n\t Icindeki sivi:" + this.Liquid.Name + "\t Dolu olan volume:" + DoluOlanVolume.ToString();
    
                    return str;
                }
            } 
            static void Main(string[] args)
            {
                 
                List<Tank> Tanks = new List<Tank>();     //Tanklarimiz
                List<Sivi> Liquids = new List<Sivi>(); //Sivilarimiz
    
                //-----------iclerini dolduralim---------
                Tanks.Add(new Tank("1P", 557.1));
                Tanks.Add(new Tank("1S", 559.5));
                Tanks.Add(new Tank("2P", 828.7));
                Tanks.Add(new Tank("2S", 827.9));
                Tanks.Add(new Tank("3P", 271.5));
                Tanks.Add(new Tank("3S", 273.1));
                Tanks.Add(new Tank("4P", 667.6));
                Tanks.Add(new Tank("4S", 667.8));
                Tanks.Add(new Tank("5P", 892.2));
                Tanks.Add(new Tank("5S", 895.5));
                Tanks.Add(new Tank("6P", 728.5));
                Tanks.Add(new Tank("6S", 723.9));
                Tanks.Add(new Tank("7P", 1116.6));
                Tanks.Add(new Tank("7S", 1118.5));
                Tanks.Add(new Tank("8P", 385.7));
                Tanks.Add(new Tank("8S", 391.2));
                Tanks.Add(new Tank("9P", 605.3));
                Tanks.Add(new Tank("9S", 604.2));
                Tanks.Add(new Tank("10P", 444.6));
                Tanks.Add(new Tank("10S", 445.8));
    
    
                Liquids.Add(new Sivi("Ethanol", 3580, 0.79));
                Liquids.Add(new Sivi("Ethanol", 2500, 0.79));
                Liquids.Add(new Sivi("ETAC", 2000, 0.9));
                Liquids.Add(new Sivi("Ethanol2", 830, 0.815)); //bunun adini deistirdim densityi farkli vermissin
                Liquids.Add(new Sivi("Ethanol", 1090, 0.79));
    
                //-----------------------------------------------------
                Liquids.Sort();
                Tanks.Sort();
    
                //for (int i = Tanks.Count-1; i >= 0; i--)for (int j = 0; j < Liquids.Count; j++)
                for (int i = 0; i < Tanks.Count; i++)
                {
                    for (int j = Liquids.Count - 1; j >= 0; j--)
                    {
    
                        if (Tanks[i].Liquid == null) //tankın içi boşsa
                            if (Tanks[i].Volume > Liquids[j].Volume)
                            {
                                Tanks[i].Liquid = Liquids[j];
                                // bu sivinin isi bitti kullandik
                                Tanks[i].DoluOlanVolume = Liquids[j].Volume;
                                Liquids.RemoveAt(j);
                                break; // bu tankin isi bitti siradakine gecelim
                            }
                    }
    
                }
                /*
                Console.WriteLine("-----Tanklarin Durumlari-----");
                foreach (Tank    t in Tanks)
                {
                    Console.WriteLine(t.ToString());
                }*/
    
                //Bosta kalan (hicbir tanka girmeyen) sivilar olmalı.
                //simdi bunlari en buyk bosta kalan tanktan başlayıp dizmemis lazim
    
    
                for (int j = Liquids.Count - 1; j >= 0; j--)
                {
                    double LiquidVolume = Liquids[j].Volume;
                    for (int i = Tanks.Count - 1; i >= 0; i--)
                    {
                        if (LiquidVolume < 0) break;
                        if (Tanks[i].Liquid == null)
                        {
                            Tanks[i].Liquid = Liquids[j];
                            Tanks[i].DoluOlanVolume = LiquidVolume > Tanks[i].Volume ? Tanks[i].Volume : LiquidVolume;
                            LiquidVolume -= Tanks[i].Volume;
                        }
                    }
                    if (LiquidVolume < 0) Liquids.RemoveAt(j); else Liquids[j].KalanVolume = LiquidVolume;
                }
    
                Console.WriteLine("-----Tanklarin Durumlari-----");
                Tanks = (Tanks.OrderBy(x => x.Name)).ToList(); //sort edelim 
                foreach (Tank t in Tanks)
                {
                    Console.WriteLine(t.ToString());
                }
    
    
                //Fakat haaala da boşta kalan olabilir cimrilik edip yeterli tank almadıysan
    
                // iş bitti boşta kalan sıvı varmı?
                if (Liquids.Count > 0)
                {
                    Console.WriteLine("-----Bosta kalan (hicbir tanka girmeyen) sivilar-----");
                    foreach (Sivi lq in Liquids)
                    {
                        Console.WriteLine(lq.ToString());
                        Console.WriteLine("\tBosta kalan miktar:"+ lq.KalanVolume.ToString());
                    }
                }
    
    
    
                Console.WriteLine("Bitti, kapatmak için bi tuşa basıver");
                Console.ReadKey();
                 
            }
        }
    }
    
    

    Çıktısı

     

    -----Tanklarin Durumlari-----
    10P     Vol:444,6
             Icindeki sivi:ETAC      Dolu olan volume:55,6222222222221
    10S     Vol:445,8
             Icindeki sivi:ETAC      Dolu olan volume:445,8
    1P      Vol:557,1
             Icindeki sivi:ETAC      Dolu olan volume:557,1
    1S      Vol:559,5
             Icindeki sivi:ETAC      Dolu olan volume:559,5
    2P      Vol:828,7
             Icindeki sivi:Ethanol   Dolu olan volume:828,7
    2S      Vol:827,9
             Icindeki sivi:Ethanol   Dolu olan volume:796,745569620253
    3P      Vol:271,5
             Icindeki sivi:Ethanol   Dolu olan volume:271,5
    3S      Vol:273,1
             Icindeki sivi:Ethanol   Dolu olan volume:273,1
    4P      Vol:667,6
             Icindeki sivi:Ethanol   Dolu olan volume:667,6
    4S      Vol:667,8
             Icindeki sivi:Ethanol   Dolu olan volume:667,8
    5P      Vol:892,2
             Icindeki sivi:Ethanol   Dolu olan volume:892,2
    5S      Vol:895,5
             Icindeki sivi:Ethanol   Dolu olan volume:895,5
    6P      Vol:728,5
             Icindeki sivi:Ethanol   Dolu olan volume:728,5
    6S      Vol:723,9
             Icindeki sivi:Ethanol   Dolu olan volume:723,9
    7P      Vol:1116,6
             Icindeki sivi:Ethanol2  Dolu olan volume:1018,40490797546
    7S      Vol:1118,5
             Icindeki sivi:Ethanol   Dolu olan volume:1118,5
    8P      Vol:385,7
             Icindeki sivi:Ethanol   Dolu olan volume:385,7
    8S      Vol:391,2
             Icindeki sivi:Ethanol   Dolu olan volume:391,2
    9P      Vol:605,3
             Icindeki sivi:Ethanol   Dolu olan volume:376,756962025316
    9S      Vol:604,2
             Icindeki sivi:ETAC      Dolu olan volume:604,2
    -----Bosta kalan (hicbir tanka girmeyen) sivilar-----
    Ethanol Size1090        Vol:1379,74683544304
            Bosta kalan miktar:58,2468354430379


    Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı kötektir!
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tarikat Şeyhi
    HolyOne
    HolyOne's avatar
    Kayıt Tarihi: 01/Haziran/2002
    Erkek

    Hepsini birbiriyle karşılaştırmaya gerek olmaması lazım. tankları ve sıvıları hacmine göre sıraladım.

    Sıra ile ilerleyip En küçük tanka elimdeki en büyük sıvıyı sokmaya çalışarak ilerledim. böylece hepsi oturması gereken yerlere oturdu.

    Eğer hesabımda hata varsa muhtemelen volume, birim hatalarından kaynaklıdır diye düşünüyorum.


    Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı kötektir!
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Zande
    Zande's avatar
    Kayıt Tarihi: 16/Mayıs/2012
    Erkek

    Şeyhim,


    Çok teşekkür ettim. Hemen deniyorum. Ters birşey olursa, haber veriyorum.


    Saygılarımla,

  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tarikat Şeyhi
    HolyOne
    HolyOne's avatar
    Kayıt Tarihi: 01/Haziran/2002
    Erkek

    Bu arada mesela iki tane 1 litrelik Ethanol 'un varsa onları Sıvı Listesinde birleştirmezsen ayrı ayrı yerleştirmeye çalışır. Doğru mantık bu diye düşündüm.

    OOP baya kolaylaştırır bu işi, yeterki sen nesnelerini doğru oluştur elindeki malların


    Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı kötektir!
Toplam Hit: 4605 Toplam Mesaj: 32