diff --git a/ALGA/Optimalizalas/09_VisszalepesesKereses.cs b/ALGA/Optimalizalas/09_VisszalepesesKereses.cs index 2de0940..5c12371 100644 --- a/ALGA/Optimalizalas/09_VisszalepesesKereses.cs +++ b/ALGA/Optimalizalas/09_VisszalepesesKereses.cs @@ -1,30 +1,260 @@ +// using System; + +// namespace OE.ALGA.Optimalizalas +// { +// public class VisszalepesesOptimalizacio +// { +// 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) +// { +// this.n = n; +// this.M = M; +// this.R = R; +// this.ft = ft; +// this.fk = fk; +// this.josag = josag; +// } + +// public T[] OptimalisMegoldas() +// { +// int szint = 0; +// T[] E = new T[n]; +// bool van = false; +// T[] O = new T[n]; +// Backtrack(szint, ref E, ref van, ref O); +// if (van) +// { +// return O; +// } +// else +// { +// throw new Exception("Nincs megoldas"); +// } + +// } + +// virtual public 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)) +// { +// 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 VisszalepesesHatizsakPakolas +// { +// HatizsakProblema problema; +// public int LepesSzam {get; set;} + +// public VisszalepesesHatizsakPakolas(HatizsakProblema problema) +// { +// this.problema = problema; +// } +// virtual public bool[] OptimalisMegoldas() +// { +// 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) +// { +// this.fb = fb; +// } + +// 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 +// { +// public SzetvalasztasEsKorlatozasHatizsakPakolas(HatizsakProblema problema) : base(problema) +// { +// } +// public override bool[] OptimalisMegoldas() +// { +// bool[] asd = new bool[2] {true, true}; +// return asd; +// } +// } +// } + + + + + + using System; namespace OE.ALGA.Optimalizalas { public class VisszalepesesOptimalizacio { - public int n; - public int[] M; - public T[,] R; - public Func ft; - public Func fk; - public Func josag; + protected int n; + protected int[] M; + protected T[,] R; + protected Func ft; + protected Func fk; + protected Func josag; + public int LepesSzam { get; protected set; } - 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; - this.R = R; + this.M = m; + this.R = r; this.ft = ft; this.fk = fk; this.josag = josag; + LepesSzam = 0; } - + + public virtual void Backtrack(int szint, ref T[] E, ref bool van, ref T[] legjobbE) + { + int i = 0; + while (i < M[szint]) + { + LepesSzam++; + if (ft(szint, R[szint, i])) + { + if (fk(szint, R[szint, i], E)) + { + E[szint] = R[szint, i]; + if (szint == n - 1) + { + if (!van || josag(E) > josag(legjobbE)) + { + legjobbE = (T[])E.Clone(); + } + van = true; + } + else + { + Backtrack(szint + 1, ref E, ref van, ref legjobbE); + } + } + } + i++; + } + } + + public T[] OptimalisMegoldas() { + // T[] E = new T[n]; + // T[] O = new T[n]; + // bool van = false; + + // Backtrack(0, ref E, ref van, ref O); + + // if (van) + // return O; + // else + // throw new NincsElKivetel(); + int szint = 0; T[] E = new T[n]; bool van = false; @@ -38,363 +268,145 @@ namespace OE.ALGA.Optimalizalas { throw new Exception("Nincs megoldas"); } - - } - - virtual public 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)) - { - 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 VisszalepesesHatizsakPakolas { - HatizsakProblema problema; - public int LepesSzam {get; set;} - + protected HatizsakProblema problema; public VisszalepesesHatizsakPakolas(HatizsakProblema problema) { this.problema = problema; } - virtual public bool[] OptimalisMegoldas() + public int LepesSzam { get; protected set; } + + public virtual bool[] OptimalisMegoldas() { 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; + + Func ft = (sz, r) => true; + + Func fk = (sz, r, meg) => + { + float suly = 0; + for (int i = 0; i < sz; i++) + if (meg[i]) suly += problema.W[i]; + if (r) suly += problema.W[sz]; + return suly <= problema.Wmax; + }; + + var opt = new VisszalepesesOptimalizacio(problema.N, M, R, ft, fk, problema.OsszErtek); + bool[] legjobb = opt.OptimalisMegoldas(); + LepesSzam = opt.LepesSzam; + return legjobb; + } - public float OptimalisErtek() + + public double 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) + private readonly Func fb; + + public SzetvalasztasEsKorlatozasOptimalizacio( + int n, + int[] m, + T[,] r, + Func ft, + Func fk, + Func josag, + Func fb) + : base(n, m, r, ft, fk, josag) { this.fb = fb; } - public override void Backtrack(int szint, ref T[] E, ref bool van, ref T[] O) + public override void Backtrack(int szint, ref T[] e, ref bool van, ref T[] legjobbE) { int i = 0; - while(i < M[szint]) + while (i < M[szint]) { - Lepesszam++; - i++; + LepesSzam++; if (ft(szint, R[szint, i])) { - if(fk(szint, R[szint, i], E) && fb(szint, O) > 6) + if (fk(szint, R[szint, i], e)) { - E[szint] = R[szint, i]; - - if (szint == n) + e[szint] = R[szint, i]; + if (szint == n - 1) { - if ((!van) || josag(E) > josag(O)) + if (!van || josag(e) > josag(legjobbE)) { - O = E; + legjobbE = (T[])e.Clone(); } van = true; } else { - Backtrack(szint+1, ref E, ref van, ref O); + if (josag(e) + fb(szint, e) > josag(legjobbE)) + Backtrack(szint + 1, ref e, ref van, ref legjobbE); } } } - } + i++; + } } } + public class SzetvalasztasEsKorlatozasHatizsakPakolas : VisszalepesesHatizsakPakolas { public SzetvalasztasEsKorlatozasHatizsakPakolas(HatizsakProblema problema) : base(problema) { } + + + public override bool[] OptimalisMegoldas() { - bool[] asd = new bool[2] {true, true}; - return asd; + 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; + } + Func ft = (sz, r) => true; + + Func fk = (sz, r, e) => + { + float s = 0; + for (int i = 0; i < sz; i++) + if (e[i]) s += problema.W[i]; + if (r) s += problema.W[sz]; + return s <= problema.Wmax; + }; + Func fb = (sz, e) => + { + float b = 0; + for (int i = sz; i < problema.N; i++) + { + if (problema.OsszSuly(e) + problema.W[i] <= problema.Wmax) + b += problema.P[i]; + } + return b; + }; + var opt = new SzetvalasztasEsKorlatozasOptimalizacio(problema.N, M, R, ft, fk, problema.OsszErtek, fb); + bool[] legjobb = opt.OptimalisMegoldas(); + LepesSzam = opt.LepesSzam; + return legjobb; } } } - - - - - - -// using System; -// using System.Linq; -// using OE.ALGA; - -// namespace OE.ALGA.Optimalizalas -// { -// public class VisszalepesesOptimalizacio -// { -// protected int n; -// protected int[] M; -// protected T[,] R; -// protected Func ft; -// protected Func fk; -// protected Func josag; -// public int LepesSzam { get; protected set; } - -// public VisszalepesesOptimalizacio(int n, int[] m, T[,] r, Func ft, Func fk, Func josag) -// { -// this.n = n; -// this.M = m; -// this.R = r; -// this.ft = ft; -// this.fk = fk; -// this.josag = josag; -// LepesSzam = 0; -// } - -// public virtual void Backtrack(int szint, ref T[] E, ref bool van, ref T[] legjobbE) -// { -// int i = 0; -// while (i < M[szint]) -// { -// LepesSzam++; -// if (ft(szint, R[szint, i])) -// { -// if (fk(szint, R[szint, i], E)) -// { -// E[szint] = R[szint, i]; -// if (szint == n - 1) -// { -// if (!van || josag(E) > josag(legjobbE)) -// { -// legjobbE = (T[])E.Clone(); -// } -// van = true; -// } -// else -// { -// Backtrack(szint + 1, ref E, ref van, ref legjobbE); -// } -// } -// } -// i++; -// } -// } - - -// public T[] OptimalisMegoldas() -// { -// T[] E = new T[n]; -// T[] O = new T[n]; -// bool van = false; - -// Backtrack(0, ref E, ref van, ref O); - -// if (van) -// return O; -// else -// throw new NincsElKivetel(); -// } -// } - -// public class VisszalepesesHatizsakPakolas -// { -// protected HatizsakProblema problema; -// public VisszalepesesHatizsakPakolas(HatizsakProblema problema) -// { -// this.problema = problema; -// } -// public int LepesSzam { get; protected set; } - -// public virtual bool[] OptimalisMegoldas() -// { -// 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; -// } - -// Func ft = (sz, r) => true; - -// Func fk = (sz, r, meg) => -// { -// float suly = 0; -// for (int i = 0; i < sz; i++) -// if (meg[i]) suly += problema.w[i]; -// if (r) suly += problema.w[sz]; -// return suly <= problema.Wmax; -// }; - -// var opt = new VisszalepesesOptimalizacio(problema.n, M, R, ft, fk, problema.OsszErtek); -// bool[] legjobb = opt.OptimalisMegoldas(); -// LepesSzam = opt.LepesSzam; -// return legjobb; - -// } - -// public double OptimalisErtek() -// { -// return problema.OsszErtek(OptimalisMegoldas()); -// } -// } - -// public class SzetvalasztasEsKorlatozasOptimalizacio : VisszalepesesOptimalizacio -// { -// private readonly Func fb; - -// public SzetvalasztasEsKorlatozasOptimalizacio( -// int n, -// int[] m, -// T[,] r, -// Func ft, -// Func fk, -// Func josag, -// Func fb) -// : base(n, m, r, ft, fk, josag) -// { -// this.fb = fb; -// } - -// public override void Backtrack(int szint, ref T[] e, ref bool van, ref T[] legjobbE) -// { -// int i = 0; -// while (i < M[szint]) -// { -// LepesSzam++; -// if (ft(szint, R[szint, i])) -// { -// if (fk(szint, R[szint, i], e)) -// { -// e[szint] = R[szint, i]; -// if (szint == n - 1) -// { -// if (!van || josag(e) > josag(legjobbE)) -// { -// legjobbE = (T[])e.Clone(); -// } -// van = true; -// } -// else -// { -// if (josag(e) + fb(szint, e) > josag(legjobbE)) -// Backtrack(szint + 1, ref e, ref van, ref legjobbE); -// } -// } -// } -// i++; -// } -// } -// } - -// public class SzetvalasztasEsKorlatozasHatizsakPakolas : VisszalepesesHatizsakPakolas -// { -// public SzetvalasztasEsKorlatozasHatizsakPakolas(HatizsakProblema problema) : base(problema) -// { -// } - - - -// public override bool[] OptimalisMegoldas() -// { -// 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; -// } -// Func ft = (sz, r) => true; - -// Func fk = (sz, r, e) => -// { -// float s = 0; -// for (int i = 0; i < sz; i++) -// if (e[i]) s += problema.w[i]; -// if (r) s += problema.w[sz]; -// return s <= problema.Wmax; -// }; -// Func fb = (sz, e) => -// { -// float b = 0; -// for (int i = sz; i < problema.n; i++) -// { -// if (problema.OsszSuly(e) + problema.w[i] <= problema.Wmax) -// b += problema.p[i]; -// } -// return b; -// }; -// var opt = new SzetvalasztasEsKorlatozasOptimalizacio(problema.n, M, R, ft, fk, problema.OsszErtek, fb); -// bool[] legjobb = opt.OptimalisMegoldas(); -// LepesSzam = opt.LepesSzam; -// return legjobb; -// } -// } -// }