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 public double Ton public double Density public Sivi public double Volume { get } public int CompareTo public override string ToString public double KalanVolume } public class Tank : IComparable { public string Name public double Volume public Sivi Liquid public Tank public double DoluOlanVolume public int CompareTo public override string ToString } static void Main { 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 //tankın içi boşsa if } } / Console. WriteLine ; foreach / //Bosta kalan 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 . Volume; for (int i = Tanks. Count - 1; i >= 0; i--) { if (LiquidVolume < 0) break; if } if (LiquidVolume < 0) Liquids. RemoveAt ; else Liquids . KalanVolume = LiquidVolume; } Console. WriteLine ; Tanks = (Tanks. OrderBy . ToList ; //sort edelim foreach //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 sivilar "); foreach } Console. WriteLine ; Console. ReadKey ; } } } Çıktısı Tanklarin Durumlari 10P Vol:444,6 Icindeki sivi:ETAC Dolu olan volume:55,622222222222110S Vol:445,8 Icindeki sivi:ETAC Dolu olan volume:445,81P Vol:557,1 Icindeki sivi:ETAC Dolu olan volume:557,11S Vol:559,5 Icindeki sivi:ETAC Dolu olan volume:559,52P Vol:828,7 Icindeki sivi:Ethanol Dolu olan volume:828,72S Vol:827,9 Icindeki sivi:Ethanol Dolu olan volume:796,7455696202533P Vol:271,5 Icindeki sivi:Ethanol Dolu olan volume:271,53S Vol:273,1 Icindeki sivi:Ethanol Dolu olan volume:273,14P Vol:667,6 Icindeki sivi:Ethanol Dolu olan volume:667,64S Vol:667,8 Icindeki sivi:Ethanol Dolu olan volume:667,85P Vol:892,2 Icindeki sivi:Ethanol Dolu olan volume:892,25S Vol:895,5 Icindeki sivi:Ethanol Dolu olan volume:895,56P Vol:728,5 Icindeki sivi:Ethanol Dolu olan volume:728,56S Vol:723,9 Icindeki sivi:Ethanol Dolu olan volume:723,97P Vol:1116,6 Icindeki sivi:Ethanol2 Dolu olan volume:1018,404907975467S Vol:1118,5 Icindeki sivi:Ethanol Dolu olan volume:1118,58P Vol:385,7 Icindeki sivi:Ethanol Dolu olan volume:385,78S Vol:391,2 Icindeki sivi:Ethanol Dolu olan volume:391,29P Vol:605,3 Icindeki sivi:Ethanol Dolu olan volume:376,7569620253169S Vol:604,2 Icindeki sivi:ETAC Dolu olan volume:604,2 Bosta kalan sivilar Ethanol Size1090 Vol:1379,74683544304 Bosta kalan miktar:58,2468354430379 Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı ktektir!

guru hocam: O değilde ben bunun 3d sine uzun zamandır kafa yoruyorum hiç onu düşündün mü? Yani diyelim ki tank değil de bir depon var. Depoda 10 tane büyük 5 tane dar alan var. bunlara da çeşitli en boy ve genişlikte kutuları yerleştirecen. O zaman nasıl bir brute force çekmeyi planlarsın =) Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı ktektir!

Hepsini birbiriyle karşılaştırmaya gerek olmaması lazım. tankları ve sıvıları hacmine gre sıraladım. Sıra ile ilerleyip En küçük tanka elimdeki en büyük sıvıyı sokmaya çalışarak ilerledim. bylece 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ı ktektir!

Sorunuzdan herşey anlaşılmıyor yada ben açım aklım basmıyor. Yinede yoğunluğu en yüksek olan sıvıyı en büyük hacimli tank'a basarsan en az tank la en çok sıvı doldurmuş olursun.

Hepsini birbiriyle karşılaştırmaya gerek olmaması lazım. tankları ve sıvıları hacmine gre sıraladım. Sıra ile ilerleyip En küçük tanka elimdeki en büyük sıvıyı sokmaya çalışarak ilerledim. bylece hepsi oturması gereken yerlere oturdu. Eğer hesabımda hata varsa muhtemelen volume, birim hatalarından kaynaklıdır diye düşünüyorum. hocam bu algoritmada hata var yalniz. elimizde 20 30 ltlik su oldugunu ve sirasiyla 20 30 lt alabilicek tankla sahip oldugumuzu dusunersek, anlattigina gore en buyuk suyu en kucuk tanktan baslayarak doldurmaya calisiyosun. fakat gordugun gibi en kucukten baslayarak doldurmaya baslarsak 30 lt. lik tankin 10 lt lik kisminin doldugunu ve 20 ltlik sivinin elimizde kaldigini goruyoruz. 30 ltlik suyu once 20 ltlik tanka dolduruyoruz ve kalan 10 lt yi de 30 ltlik tanka dolduruyoruz. yani 30 ltlik tankinda 10 lt si doluyor. sivilar karisamayacagi icin de elimizde 20 ltlik sivi kaliyor. halbuki olmasi gereken 20 ltlik suyun 20 ltlik tanka 30 ltlik suyun ise 30 ltlik tanka doldurulmasi ve elimizde hic suyun kalmamasi. yani bu sorunun heuristic bi cevaptan fazlasina sahip olmasi icin butun permutasyonlarin denenmesi gerekiyor. ..

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 ( sizeof / sizeof ) static int best = ; static int used_tank_count = 0x7FFFFFFF; static int rem_tank_size = 0x7FFFFFFF; void print_tanks { int i; for (i = 0; i < n; ++i) } void calculate { int i; int cur_liq, tank_cnt; int rem_size; for (rem_size = tank_cnt = i = 0; i < nliqs; ++i) { cur_liq = liqs ; for (; cur_liq > 0; tank_cnt++) // '-=' cunku cur_liq eksi oldugu icin.. // ters mantik yani ;) rem_size -= cur_liq; } overflow: // en iyi durum olustu mu? if print_tanks ; printf(": %d \n", tank_cnt, rem_size); } void swap void findsols { int i; if (j ntanks - 1) calculate ; for } int main { int liqs = ; int tanks = ; int i; findsols(tanks, 0, ARRAYSIZE , liqs, ARRAYSIZE ; printf ; print_tanks(best, ARRAYSIZE ; printf(": %d \n", used_tank_count, rem_tank_size); } guru tarafından 05/Ağu/13 13:42 tarihinde düzenlenmiştir..

bilmediğimden soruyorum, sıvıların yoğunluğu ne için veriliyor hocam

hocam yalnizca eklenen tanklari ve sulari verdigim ornekteki gibi duzenledim. ve gordugun gibi bosta kalan miktar 10 ancak 20 ve 30 lt alan tanklara 20 ve 30 lt iki ayri suyun aktarilmasi esitlenme ile sonuclanmaliydi. yani kalan miktarin 0 olmasi gerekiyodu. senin yaklasimin heuristic bi yaklasim, yani evet guzel ama tam anlamiyla cevabi vericeginden hic bi zaman emin olamiyacagimiz bi algoritma cevabindan tam anlamiyla emin olabilicegimiz bi algoritma icin ise, elimizde ki tanklarin permutasyonunu almamiz gerekiyor. ve tum permutasyonlari elde ederken de senin yaptigina benzer bi sekilde sivilari sirasiyla dizmeye calismaliyiz. ..

Evet, kesinlikle süper olmuş ve mantık doğru. Ancak bir de c++ kodunu alabilirmiyim :D

Olay tamamen optimizasyon ve olasılık işine giriyor. @Moi, evet, mümkün olduğunca az sayıda tank kullanması gerekiyor.

@İsot; Yüklenecek sıvıların hacimlerinin hesaplanması için. @SinusX; Hemen kontrol ediyorum.

bu iş sanki biraz sayısal hesap dersine giriyor. bir sürü bilinmeyen var ve yeteri kadar denklem yok.

Arkadaşlar, Konu başlığı saçma oldu ancak baya bir uykusuz olduğumdan saçmaladım sanırım. Şimdi şyle bir programı c yada excel'de yapmam gerekiyor. Hacimleri birbirinden farklı AMA belirli 10 tane tank var. Bu 10 tane tanka, sayıları 1 ile 10 arasında, yoğunluğu belirli sıvılardan bana sylenen ağırlıklarda doldurmam gerekiyor. En az sayıda ve mümkün olduğunca efektif olarak tank kullanarak, bu sıvıları bu tanklara nasıl doldururum? rnek veriyorum; X sıvısı - yoğunluk 0,7 - 10ton Y sıvısı - yoğunluk 1,3 - 15 ton gibi... Algoritmayı oturtamadığım için bir türlü giriş yapamıyorum. Neyi neye gre nasıl deneyeceğim?! Yardımcı olacak varsa çok sevinirim.

bunu yaparken en az sayıda tank kullanması gerekiyor değil mi? yanlış anlamadım? edit: ne kadar fazla olasılık kullanılırsa verimlilik o kadar artacaktır burada. yani birden fazla senaryo üretip sonuçları karşılaştırmak geliyor aklıma. sıvıları baz al; dağıtmaya en fazladan başla, en azdan başla, ortancadan başla... tankları baz al; dağıtmaya en büyük tankla başla, en küçük tank... bir kaç kere de rastgele paylaştır. sonunda elde edilen değerleri karşılaştır, en verimlisini kullan. veya rastgele ama belirlediğin kurallar dahilinde yüzlerce, binlerce kez paylaştır, en verimlisini kullan. moi tarafından 25/Haz/13 18:31 tarihinde düzenlenmiştir Sadece paranoyaklar hayatta kalır...

cizik ride or die..

mts nedir? ağırlıkmı? hacimmi? Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı ktektir!

Hacim yanlis anlamadiysam bardak misali dolduracan... Her tankin bir kapasitesi var... Bunlari bir tabloda tutabilirsin.. Veya class ile yapabilirsin Cesit cesit sivilar var. Her sivninda yogunluguna gore kapladigi hacim var... Bunlarida ayri bir tabloda tutabilirsin... Hesaplaman gerek tanki dolduruken... Koyacagin sivin hacmi. Eger tankta o kdr bos yer var ise tanka dolduracan Eger yok ise doldurmayacan 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

guru: yok hocam ben orda fazla zet geçtim. ordaki iş daha karmaşık. Ben hala bütün permütasyonların denenmesinin gerkmediğini düşünüyorum. Çünkü kaplar ve sıvılar hacme gre sıralı. İlk aşamada her sıvı büyükten küçüğe girebileceği en küçük kaba girmeye çalışıyor. Ondan sonra arta kalan sıvılar benzer mantıkla tekrar yerleşiyor (burada ufak bi verimsizlik olabilir yada bu aşamada sıvıdan 1 gram artınca tekrar sort etmek gerekebilir belki ) zande: ne C++ 'ı hacım? hayatından mı bezdin ne uğraşacan, o şey 2000 satır olur C++ da. Şu aşamada çıktısı gayet verimli grünüyor TANKLARIN ICINDEKI TOPLAM HACIM: 13005,2TOPLAM SIVI HACMI: 12316,5764972863TANKLARIN ICINDEKI TOPLAM SIVI HACMI: 12258,3296618433 Bosta kalan sivilar Ethanol Size1090 Vol:1379,74683544304 Bosta kalan miktar:58,2468354430379 HolyOne tarafından 05/Ağu/13 17:53 tarihinde düzenlenmiştir Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı ktektir!

Abü kodu değiştirdiysen tüm tank ve liquidleri silmeseydin de sonuçları karşılaştırsaydık. senin algoritman daha iyiyse adres ver geliorum :PPP Hocam bulduğun hatanın sebebi şuymuş Alttaki kod bloğuna bak onu > yapmışım ama >= olması gerekiyormuş, şimdi düzelttim olması gereken sonucu verdi. if //tankın içi boşsa if HolyOne tarafından 05/Ağu/13 19:05 tarihinde düzenlenmiştir Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı ktektir!

http://www.cprogramming.com/tutorial/c/lesson16.html recursive function kullanabilirsin işini grür gibi http://www.cagataycebi.com/programming/c_programming/c_programming_10.html Si vis pacem para bellum.

Şimdi hocam şyle anlatayım; Elimde 20 tane tank var ve hepsinin hacimleri aşağıdaki gibi; 1P - 557,1 m3 1S - 559,5 2P - 828,7 2S - 827,9 3P - 271,5 3S - 273,1 4P - 667,6 4S - 667,8 5P - 892,2 5S - 895,5 6P - 728,5 6S - 723,9 7P - 1116,6 7S - 1118,5 8P - 385,7 8S - 391,2 9P - 605,3 9S - 604,2 10P - 444,6 10S - 445,8 Tanklara koyacağım sıvılar; 3580mts Ethanol (density:0,79) 2500mts Ethanol (density:0,79) 2000mts ETAC (density:0,9) 830mts Ethanol (density:0,815) 1090mts Ethanol (density:0,79) Programcığın bu sıvıları birbirine karıştırmadan, tanklara dağıtmasını istiyorum. Ancak if yada case'ler ile bunu yapamadım.

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

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.

=)))) Ya aslında benimde içimden hepsiyle karşılaştırma geçio da bütün denemelerimde doğru sonucu verdi. Eğer bi saçmalık var derse eleman bir daha üstünden geçerim çalışan bişi yaptım da en doğru yol olduğuna çok da emin değilim yani=) ama yinede iş grüyor olması lazım guru'nun dediği gibi tankların permütasyonlarında grup toplamına en yakın sıvı hacmine gre puanlama ile veya genetik seçilme yntemiyle doğruya en yakın sonucu buldurabiliriz. ben biraz kastım yazmak için ama beceremedim. :) muhtemelen bi algoritma yarışması sorusu ve güzelmiş :)

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ı ktektir!

yok hocam oyle bi iddiam yok :) benim yazdigim kod parcasinin bununla da pek alakasi yok aslinda, yalnizca benzer oldugu icin yazdim edit: alakasi yok derken soru da density cart curt gibi ayrintilar yok yani :) guru tarafından 05/Ağu/13 19:39 tarihinde düzenlenmiştir..

=)))) Ya aslında benimde içimden hepsiyle karşılaştırma geçio da bütün denemelerimde doğru sonucu verdi. Eğer bi saçmalık var derse eleman bir daha üstünden geçerim çalışan bişi yaptım da en doğru yol olduğuna çok da emin değilim yani=) ama yinede iş grüyor olması lazım Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı ktektir!

bütün ihtimalleri denemeye gerek yok diye biliyorum ben de geçen sene bir süre uğraşmıştım holy'ninkine benzer bir algoritma ile yapmıştım devi ben de. aslında algoritmanın adı da vardı ama şimdi aklıma gelmiyor. :/ 3 boyutlu olduğunda nasıl yapılır tam olarak bilmiyorum ama bir cismi kutuya koyduğunda cismin kşelere gre projeksiyonunu alıp o 2 boyutlu veri üzerinde karşılaştırmalar yaparak çzülebilir gibi geliyor bana. ama burda en büyüğünü en küçüğe koy mantığı hiç işlemez çünkü şekiller çok çok farklı olabilir. :) . . .. . ... .

Şeyhim, Çok teşekkür ettim. Hemen deniyorum. Ters birşey olursa, haber veriyorum. Saygılarımla,

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

guru hocam: O değilde ben bunun 3d sine uzun zamandır kafa yoruyorum hiç onu düşündün mü? Yani diyelim ki tank değil de bir depon var. Depoda 10 tane büyük 5 tane dar alan var. bunlara da çeşitli en boy ve genişlikte kutuları yerleştirecen. O zaman nasıl bir brute force çekmeyi planlarsın =) hocam bu 'alanlardan' ne kastetmek istedigini tam olarak anlayamadim. olay, belli bi alanimiz var ve bu alana degisken boyutlardaki cisimleri mi sigdiricaz yoksa degisken boyutlarda alanlarimiz ve bunlara degisken boyutlarda ki cisimlerimi sigdiricaz :| edit: hocam yukarda kendimi anlatamadigimi hissettim tekrar yaziyorum :) ilk olarak kafamda kurguladigim durumu soyle acikliyim, cesitli boyutlara sahip cekmeceleri yuvalarina yerlestirmek gibi bi olaydi. ikinci olarak da, en boy uzunluga sahip kolileri bi depoya yerlestirmek. guru tarafından 06/Ağu/13 19:52 tarihinde düzenlenmiştir..

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