diff --git a/ALGA/Optimalizalas/09_VisszalepesesKereses.cs b/ALGA/Optimalizalas/09_VisszalepesesKereses.cs index 976236b..df6db93 100644 --- a/ALGA/Optimalizalas/09_VisszalepesesKereses.cs +++ b/ALGA/Optimalizalas/09_VisszalepesesKereses.cs @@ -1,4 +1,5 @@ using System; +using System.Formats.Asn1; using System.Linq; using Microsoft.Identity.Client; @@ -6,16 +7,16 @@ namespace OE.ALGA.Optimalizalas { public class VisszalepesesOptimalizacio { - int n; - int[] M; - T[,] R; - Func ft; - Func fk; - Func josag; + public int n; + public int[] M; + public T[,] R; + public Func ft; + public Func fk; + public Func josag; public int Lepesszam { get; set;} = 0; - public VisszalepesesOptimalizacio(int n, int[] M, T[,] R, Func ft, Func fk, Func josag) + public VisszalepesesOptimalizacio(int n, int[] M, T[,] R, Func ft, Func fk, Func josag) { this.n = n; this.M = M; @@ -25,7 +26,7 @@ namespace OE.ALGA.Optimalizalas this.josag = josag; } - public bool[] OptimalisMegoldas() + public T[] OptimalisMegoldas() { int szint = 0; T[] E = new T[n]; @@ -76,7 +77,7 @@ namespace OE.ALGA.Optimalizalas public class VisszalepesesHatizsakPakolas { HatizsakProblema problema; - public int LepesSzam {get;} + public int LepesSzam {get; set;} public VisszalepesesHatizsakPakolas(HatizsakProblema problema) { @@ -84,25 +85,91 @@ namespace OE.ALGA.Optimalizalas } virtual public bool[] OptimalisMegoldas() { - int[] M; - bool[] R; - } - public int OptimalisErtek() - { + int[] M = new int[problema.N]; + bool[,] R = new bool[problema.N, 2]; + for (int i = 0; i < problema.N; i++) + { + M[i] = 2; + R[i, 0] = true; + R[i, 1] = false; + } + VisszalepesesOptimalizacio visszalepesesoptimalizacio = new VisszalepesesOptimalizacio(problema.N, M, R, Ft, Fk, Josag); + bool[] eredmeny = visszalepesesoptimalizacio.OptimalisMegoldas(); + LepesSzam = visszalepesesoptimalizacio.Lepesszam; + return eredmeny; } + public float OptimalisErtek() + { + return problema.OsszErtek(OptimalisMegoldas()); + } + private float Josag(bool[] pakolas) + { + float ertek = 0; + if (!problema.Ervenyes(pakolas)) + { + ertek = -1; + } + else + { + ertek = problema.OsszErtek(pakolas); + } + return ertek; + } + private bool Ft(int egesz, bool logikai) + { + return true; + } + private bool Fk(int egesz, bool logikai, bool[] tomb) + { + int weight = 0; + for (int i = 0; i < problema.N; i++) + { + if(tomb[i]) + { + weight += problema.W[i]; + } + } + return (weight <= problema.Wmax); + } + } public class SzetvalasztasEsKorlatozasOptimalizacio : VisszalepesesOptimalizacio { public Func fb; - public SzetvalasztasEsKorlatozasOptimalizacio(Func fb, int n, int[] M, T[,] R, Func ft, Func fk, Func josag) : base(n, M, R, ft, fk, josag) + public SzetvalasztasEsKorlatozasOptimalizacio(Func fb, int n, int[] M, T[,] R, Func ft, Func fk, Func josag) : base(n, M, R, ft, fk, josag) { this.fb = fb; } - public override void Backtrack(int szint, T[] E, bool van, T[] O) + public override void Backtrack(int szint, ref T[] E, ref bool van, ref T[] O) { - + int i = 0; + while(i < M[szint]) + { + Lepesszam++; + i++; + if (ft(szint, R[szint, i])) + { + if(fk(szint, R[szint, i], E) && fb(szint, O) > 6) + { + E[szint] = R[szint, i]; + + if (szint == n) + { + if ((!van) || josag(E) > josag(O)) + { + O = E; + } + van = true; + } + else + { + Backtrack(szint+1, ref E, ref van, ref O); + } + } + } + } } } public class SzetvalasztasEsKorlatozasHatizsakPakolas : VisszalepesesHatizsakPakolas @@ -112,7 +179,8 @@ namespace OE.ALGA.Optimalizalas } public override bool[] OptimalisMegoldas() { - + bool[] asd = new bool[2] {true, true}; + return asd; } } } diff --git a/Tesztek/09_VisszalepesesKereses.cs b/Tesztek/09_VisszalepesesKereses.cs index 4abb032..1d64477 100644 --- a/Tesztek/09_VisszalepesesKereses.cs +++ b/Tesztek/09_VisszalepesesKereses.cs @@ -1,103 +1,103 @@ -//using NUnit.Framework; -//using OE.ALGA.Optimalizalas; +using NUnit.Framework; +using OE.ALGA.Optimalizalas; -//namespace OE.ALGA.Tesztek.Optimalizalas -//{ -// [TestFixture(Category = "Optimalizalas", TestName = "09 - Visszalépéses Keresés Tesztek")] -// public class VisszalepesesKeresesTesztek -// { -// [TestCase] -// public void JegyzetbenLevoPeldaErtekTeszt() -// { -// HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.jegyzet_n, PakolasTesztEsetek.jegyzet_Wmax, PakolasTesztEsetek.jegyzet_w, PakolasTesztEsetek.jegyzet_p); -// VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); -// Assert.Multiple(() => -// { -// Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.jegyzet_optimalis_ertek)); -// Assert.That(opt.LepesSzam, Is.EqualTo(98)); -// }); -// } -// [TestCase] -// public void JegyzetbenLevoPeldaMegoldasTeszt() -// { -// HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.jegyzet_n, PakolasTesztEsetek.jegyzet_Wmax, PakolasTesztEsetek.jegyzet_w, PakolasTesztEsetek.jegyzet_p); -// VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); -// Assert.Multiple(() => -// { -// Assert.That(opt.OptimalisMegoldas(), Is.EquivalentTo(PakolasTesztEsetek.jegyzet_optimalis_pakolas)); -// Assert.That(opt.LepesSzam, Is.EqualTo(98)); -// }); -// } -// [TestCase] -// public void NagyPeldaMegoldasTeszt() -// { -// HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.nagy_n, PakolasTesztEsetek.nagy_Wmax, PakolasTesztEsetek.nagy_w, PakolasTesztEsetek.nagy_p); -// VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); -// Assert.Multiple(() => -// { -// Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.nagy_optimalis_ertek)); -// Assert.That(opt.LepesSzam, Is.EqualTo(4832)); -// }); -// } -// [TestCase] -// public void LepesszamVizsgalat() -// { -// HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.nagy_n, PakolasTesztEsetek.nagy_Wmax, PakolasTesztEsetek.nagy_w, PakolasTesztEsetek.nagy_p); -// VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); -// Assert.Multiple(() => -// { -// Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.nagy_optimalis_ertek)); -// Assert.That(opt.LepesSzam, Is.EqualTo(4832)); -// }); -// } -// } +namespace OE.ALGA.Tesztek.Optimalizalas +{ + [TestFixture(Category = "Optimalizalas", TestName = "09 - Visszalépéses Keresés Tesztek")] + public class VisszalepesesKeresesTesztek + { + [TestCase] + public void JegyzetbenLevoPeldaErtekTeszt() + { + HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.jegyzet_n, PakolasTesztEsetek.jegyzet_Wmax, PakolasTesztEsetek.jegyzet_w, PakolasTesztEsetek.jegyzet_p); + VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); + Assert.Multiple(() => + { + Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.jegyzet_optimalis_ertek)); + Assert.That(opt.LepesSzam, Is.EqualTo(98)); + }); + } + [TestCase] + public void JegyzetbenLevoPeldaMegoldasTeszt() + { + HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.jegyzet_n, PakolasTesztEsetek.jegyzet_Wmax, PakolasTesztEsetek.jegyzet_w, PakolasTesztEsetek.jegyzet_p); + VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); + Assert.Multiple(() => + { + Assert.That(opt.OptimalisMegoldas(), Is.EquivalentTo(PakolasTesztEsetek.jegyzet_optimalis_pakolas)); + Assert.That(opt.LepesSzam, Is.EqualTo(98)); + }); + } + [TestCase] + public void NagyPeldaMegoldasTeszt() + { + HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.nagy_n, PakolasTesztEsetek.nagy_Wmax, PakolasTesztEsetek.nagy_w, PakolasTesztEsetek.nagy_p); + VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); + Assert.Multiple(() => + { + Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.nagy_optimalis_ertek)); + Assert.That(opt.LepesSzam, Is.EqualTo(4832)); + }); + } + [TestCase] + public void LepesszamVizsgalat() + { + HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.nagy_n, PakolasTesztEsetek.nagy_Wmax, PakolasTesztEsetek.nagy_w, PakolasTesztEsetek.nagy_p); + VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); + Assert.Multiple(() => + { + Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.nagy_optimalis_ertek)); + Assert.That(opt.LepesSzam, Is.EqualTo(4832)); + }); + } + } -// [TestFixture(Category = "Optimalizalas", TestName = "09 - Szétválasztás és Korlátozás Tesztek")] -// public class SzetvalasztasEsKorlatozasTesztek -// { -// [TestCase] -// public void JegyzetbenLevoPeldaErtekTeszt() -// { -// HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.jegyzet_n, PakolasTesztEsetek.jegyzet_Wmax, PakolasTesztEsetek.jegyzet_w, PakolasTesztEsetek.jegyzet_p); -// SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); -// Assert.Multiple(() => -// { -// Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.jegyzet_optimalis_ertek)); -// Assert.That(opt.LepesSzam, Is.EqualTo(62)); -// }); -// } -// [TestCase] -// public void JegyzetbenLevoPeldaMegoldasTeszt() -// { -// HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.jegyzet_n, PakolasTesztEsetek.jegyzet_Wmax, PakolasTesztEsetek.jegyzet_w, PakolasTesztEsetek.jegyzet_p); -// SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); -// Assert.Multiple(() => -// { -// Assert.That(opt.OptimalisMegoldas(), Is.EquivalentTo(PakolasTesztEsetek.jegyzet_optimalis_pakolas)); -// Assert.That(opt.LepesSzam, Is.EqualTo(62)); -// }); -// } -// [TestCase] -// public void NagyPeldaMegoldasTeszt() -// { -// HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.nagy_n, PakolasTesztEsetek.nagy_Wmax, PakolasTesztEsetek.nagy_w, PakolasTesztEsetek.nagy_p); -// SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); -// Assert.Multiple(() => -// { -// Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.nagy_optimalis_ertek)); -// Assert.That(opt.LepesSzam, Is.EqualTo(618)); -// }); -// } -// [TestCase] -// public void LepesszamVizsgalat() -// { -// HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.nagy_n, PakolasTesztEsetek.nagy_Wmax, PakolasTesztEsetek.nagy_w, PakolasTesztEsetek.nagy_p); -// SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); -// Assert.Multiple(() => -// { -// Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.nagy_optimalis_ertek)); -// Assert.That(opt.LepesSzam, Is.EqualTo(618)); -// }); -// } -// } -//} \ No newline at end of file + [TestFixture(Category = "Optimalizalas", TestName = "09 - Szétválasztás és Korlátozás Tesztek")] + public class SzetvalasztasEsKorlatozasTesztek + { + [TestCase] + public void JegyzetbenLevoPeldaErtekTeszt() + { + HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.jegyzet_n, PakolasTesztEsetek.jegyzet_Wmax, PakolasTesztEsetek.jegyzet_w, PakolasTesztEsetek.jegyzet_p); + SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); + Assert.Multiple(() => + { + Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.jegyzet_optimalis_ertek)); + Assert.That(opt.LepesSzam, Is.EqualTo(62)); + }); + } + [TestCase] + public void JegyzetbenLevoPeldaMegoldasTeszt() + { + HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.jegyzet_n, PakolasTesztEsetek.jegyzet_Wmax, PakolasTesztEsetek.jegyzet_w, PakolasTesztEsetek.jegyzet_p); + SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); + Assert.Multiple(() => + { + Assert.That(opt.OptimalisMegoldas(), Is.EquivalentTo(PakolasTesztEsetek.jegyzet_optimalis_pakolas)); + Assert.That(opt.LepesSzam, Is.EqualTo(62)); + }); + } + [TestCase] + public void NagyPeldaMegoldasTeszt() + { + HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.nagy_n, PakolasTesztEsetek.nagy_Wmax, PakolasTesztEsetek.nagy_w, PakolasTesztEsetek.nagy_p); + SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); + Assert.Multiple(() => + { + Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.nagy_optimalis_ertek)); + Assert.That(opt.LepesSzam, Is.EqualTo(618)); + }); + } + [TestCase] + public void LepesszamVizsgalat() + { + HatizsakProblema problema = new HatizsakProblema(PakolasTesztEsetek.nagy_n, PakolasTesztEsetek.nagy_Wmax, PakolasTesztEsetek.nagy_w, PakolasTesztEsetek.nagy_p); + SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); + Assert.Multiple(() => + { + Assert.That(opt.OptimalisErtek(), Is.EqualTo(PakolasTesztEsetek.nagy_optimalis_ertek)); + Assert.That(opt.LepesSzam, Is.EqualTo(618)); + }); + } + } +} \ No newline at end of file diff --git a/Tesztek/09_VisszalepesesKeresesTesztek.cs b/Tesztek/09_VisszalepesesKeresesTesztek.cs index 4608715..519a00b 100644 --- a/Tesztek/09_VisszalepesesKeresesTesztek.cs +++ b/Tesztek/09_VisszalepesesKeresesTesztek.cs @@ -1,6 +1,6 @@ // using Microsoft.VisualStudio.TestTools.UnitTesting; // using OE.ALGA.Optimalizalas; -// + // namespace OE.ALGA.Tesztek // { // [TestClass()] @@ -13,7 +13,7 @@ // VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); // Assert.AreEqual(PakolasTesztEsetek.jegyzet_optimalis_ertek, opt.OptimalisErtek()); // } -// + // [TestMethod()] // public void JegyzetbenLevoPeldaMegoldasTeszt() //F2. // { @@ -21,7 +21,7 @@ // VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); // CollectionAssert.AreEqual(PakolasTesztEsetek.jegyzet_optimalis_pakolas, opt.OptimalisMegoldas()); // } -// + // [TestMethod()] // public void NagyPeldaMegoldasTeszt() //F2. // { @@ -29,7 +29,7 @@ // VisszalepesesHatizsakPakolas opt = new VisszalepesesHatizsakPakolas(problema); // Assert.AreEqual(PakolasTesztEsetek.nagy_optimalis_ertek, opt.OptimalisErtek()); // } -// + // [TestMethod()] // public void LepesszamVizsgalat() //F2. // { @@ -39,7 +39,7 @@ // Console.WriteLine("Lépésszám: " + opt.LepesSzam); // } // } -// + // [TestClass()] // public class SzetvalasztasEsKorlatozasTesztek // { @@ -50,7 +50,7 @@ // SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); // Assert.AreEqual(PakolasTesztEsetek.jegyzet_optimalis_ertek, opt.OptimalisErtek()); // } -// + // [TestMethod()] // public void JegyzetbenLevoPeldaMegoldasTeszt() //F4. // { @@ -58,7 +58,7 @@ // SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); // CollectionAssert.AreEqual(PakolasTesztEsetek.jegyzet_optimalis_pakolas, opt.OptimalisMegoldas()); // } -// + // [TestMethod()] // public void NagyPeldaMegoldasTeszt() //F4. // { @@ -66,7 +66,7 @@ // SzetvalasztasEsKorlatozasHatizsakPakolas opt = new SzetvalasztasEsKorlatozasHatizsakPakolas(problema); // Assert.AreEqual(PakolasTesztEsetek.nagy_optimalis_ertek, opt.OptimalisErtek()); // } -// + // [TestMethod()] // public void LepesszamVizsgalat() //F4. // {