Program İçin Algoritma Önerisi
-
Eger acelen yoksa ugrasabilirim c# win formile bisiler yapabilirim hocam
-
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.
-
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...
-
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 -
mts nedir ? ağırlıkmı ? hacimmi?
-
İlgilenen arkadaşlara teşekkürler. Şeyhim, mts = metric tonnes daha bir türkçesi TON :)
-
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 -
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.
-
Şeyhim,
Çok teşekkür ettim. Hemen deniyorum. Ters birşey olursa, haber veriyorum.
Saygılarımla, -
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