This commit is contained in:
Lendaia Mirai
2026-01-13 03:27:55 +01:00
parent 75228324cc
commit fbd461e7b5
2 changed files with 272 additions and 272 deletions

View File

@@ -1,186 +1,186 @@
// using System;
using System;
// namespace OE.ALGA.Optimalizalas
// {
// public class VisszalepesesOptimalizacio<T>
// {
// public int n;
// public int[] M;
// public T[,] R;
// public Func<int, T, bool> ft;
// public Func<int, T, T[], bool> fk;
// public Func<T[], float> josag;
namespace OE.ALGA.Optimalizalas
{
public class VisszalepesesOptimalizacio<T>
{
public int n;
public int[] M;
public T[,] R;
public Func<int, T, bool> ft;
public Func<int, T, T[], bool> fk;
public Func<T[], float> josag;
// public int Lepesszam { get; set;} = 0;
public int Lepesszam { get; set;} = 0;
// public VisszalepesesOptimalizacio(int n, int[] M, T[,] R, Func<int, T, bool> ft, Func<int, T, T[], bool> fk, Func<T[], float> josag)
// {
// this.n = n;
// this.M = M;
// this.R = R;
// this.ft = ft;
// this.fk = fk;
// this.josag = josag;
// }
public VisszalepesesOptimalizacio(int n, int[] M, T[,] R, Func<int, T, bool> ft, Func<int, T, T[], bool> fk, Func<T[], float> 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");
// }
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];
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;}
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];
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<bool> visszalepesesoptimalizacio = new VisszalepesesOptimalizacio<bool>(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);
// }
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<bool> visszalepesesoptimalizacio = new VisszalepesesOptimalizacio<bool>(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<T> : VisszalepesesOptimalizacio<T>
// {
// public Func<int, T[], int> fb;
// public SzetvalasztasEsKorlatozasOptimalizacio(Func<int, T[], int> fb, int n, int[] M, T[,] R, Func<int, T, bool> ft, Func<int, T, T[], bool> fk, Func<T[], float> josag) : base(n, M, R, ft, fk, josag)
// {
// this.fb = fb;
// }
}
public class SzetvalasztasEsKorlatozasOptimalizacio<T> : VisszalepesesOptimalizacio<T>
{
public Func<int, T[], int> fb;
public SzetvalasztasEsKorlatozasOptimalizacio(Func<int, T[], int> fb, int n, int[] M, T[,] R, Func<int, T, bool> ft, Func<int, T, T[], bool> fk, Func<T[], float> 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];
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;
// }
// }
// }
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;
}
}
}

View File

@@ -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));
// });
// }
// }
// }
[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));
});
}
}
}