This commit is contained in:
+170
-3
@@ -166,7 +166,7 @@ final class ManagerReglerTest extends TestCase
|
||||
self::assertSame(500, $ergebnis['Restabweichung_W']);
|
||||
}
|
||||
|
||||
public function testGleichePrioritaetBevorzugtWieEnelix1DenVerbraucherMitWenigerEnergie(): void
|
||||
public function testGleicheNaechsteLeistungBevorzugtWenigerEnergie(): void
|
||||
{
|
||||
$ergebnis = ManagerRegler::verteile(
|
||||
0.0,
|
||||
@@ -183,7 +183,7 @@ final class ManagerReglerTest extends TestCase
|
||||
self::assertSame(0, $ergebnis['Restabweichung_W']);
|
||||
}
|
||||
|
||||
public function testEnergievergleichVerwendetWieEnelix1ZweiKilowattstundenGruppen(): void
|
||||
public function testEnergiegleichstandVergleichtExakteWhStattZweiKilowattstundenGruppen(): void
|
||||
{
|
||||
$ergebnis = ManagerRegler::verteile(
|
||||
0.0,
|
||||
@@ -196,7 +196,174 @@ final class ManagerReglerTest extends TestCase
|
||||
[10 => 999.0, 20 => 0.0]
|
||||
);
|
||||
|
||||
self::assertSame([10 => 3000, 20 => 0], $ergebnis['Sollwerte']);
|
||||
self::assertSame([10 => 0, 20 => 3000], $ergebnis['Sollwerte']);
|
||||
}
|
||||
|
||||
/** @dataProvider beispielBudgets */
|
||||
public function testBestaetigteStufenfolge(int $budget, int $a, int $b): void
|
||||
{
|
||||
foreach (['PrioritaetPV', 'PrioritaetPeak'] as $feld) {
|
||||
$ergebnis = ManagerRegler::verteile(0.0, (float) $budget, [
|
||||
$this->verbraucher(20, 2, [0, 100, 110, 500, 780, 1500], 0),
|
||||
$this->verbraucher(10, 2, [0, 100, 200, 400, 800], 0),
|
||||
], $feld, [10 => 10000.0, 20 => 12000.0]);
|
||||
|
||||
self::assertSame([10 => $a, 20 => $b], $ergebnis['Sollwerte']);
|
||||
self::assertSame($budget - $a - $b, $ergebnis['Restabweichung_W']);
|
||||
}
|
||||
}
|
||||
|
||||
public function beispielBudgets(): array
|
||||
{
|
||||
return [
|
||||
[0, 0, 0], [99, 0, 0], [100, 100, 0], [199, 100, 0],
|
||||
[200, 100, 100], [209, 100, 100], [210, 100, 110],
|
||||
[309, 100, 110], [310, 200, 110], [509, 200, 110],
|
||||
[510, 400, 110], [899, 400, 110], [900, 400, 500],
|
||||
[1179, 400, 500], [1180, 400, 780], [1579, 400, 780],
|
||||
[1580, 800, 780], [2299, 800, 780], [2300, 800, 1500],
|
||||
[3000, 800, 1500],
|
||||
];
|
||||
}
|
||||
|
||||
public function testLeistungsniveauGehtVorEnergieUndSchrittdifferenz(): void
|
||||
{
|
||||
$ergebnis = ManagerRegler::verteile(0.0, 220.0, [
|
||||
$this->verbraucher(10, 0, [0, 100, 200], 0),
|
||||
$this->verbraucher(20, 0, [0, 110, 120], 0),
|
||||
], 'PrioritaetPV', [10 => 0.0, 20 => 50000.0]);
|
||||
|
||||
self::assertSame([10 => 100, 20 => 120], $ergebnis['Sollwerte']);
|
||||
}
|
||||
|
||||
public function testPicoUndGoETeilenBudgetTrotzGrossemEnergieunterschied(): void
|
||||
{
|
||||
$ergebnis = ManagerRegler::verteile(0.0, 12312.0, [
|
||||
$this->verbraucher(31986, 2, array_merge([0], range(4104, 12312, 684)), 0),
|
||||
$this->verbraucher(43878, 2, array_merge([0], range(4104, 10944, 684)), 0),
|
||||
], 'PrioritaetPV', [31986 => 41192.78, 43878 => 128082.87]);
|
||||
|
||||
self::assertSame([31986 => 6156, 43878 => 6156], $ergebnis['Sollwerte']);
|
||||
self::assertSame(0, $ergebnis['Restabweichung_W']);
|
||||
}
|
||||
|
||||
public function testNegativeDefizitverteilungBehaeltBisherigeEnergiegruppen(): void
|
||||
{
|
||||
$ergebnis = ManagerRegler::verteile(300.0, 0.0, [
|
||||
$this->verbraucher(10, 0, [['Von_W' => -300, 'Bis_W' => 300]], 0),
|
||||
$this->verbraucher(20, 0, [['Von_W' => -300, 'Bis_W' => 300]], 0),
|
||||
], 'PrioritaetPeak', [10 => 999.0, 20 => 0.0]);
|
||||
|
||||
self::assertSame([10 => -300, 20 => 0], $ergebnis['Sollwerte']);
|
||||
self::assertSame(0, $ergebnis['Restabweichung_W']);
|
||||
}
|
||||
|
||||
public function testGleicheLeistungUndEnergieEntscheidetStabilNachInstanzID(): void
|
||||
{
|
||||
$ergebnis = ManagerRegler::verteile(0.0, 100.0, [
|
||||
$this->verbraucher(20, 0, [0, 100], 0),
|
||||
$this->verbraucher(10, 0, [0, 100], 0),
|
||||
], 'PrioritaetPV');
|
||||
|
||||
self::assertSame([10 => 100, 20 => 0], $ergebnis['Sollwerte']);
|
||||
}
|
||||
|
||||
public function testNichtPassenderSchrittBlockiertKeineAndereErreichbareStufe(): void
|
||||
{
|
||||
$ergebnis = ManagerRegler::verteile(0.0, 210.0, [
|
||||
$this->verbraucher(10, 0, [0, 100, 200], 0),
|
||||
$this->verbraucher(20, 0, [0, 150], 0),
|
||||
], 'PrioritaetPV');
|
||||
|
||||
self::assertSame([10 => 200, 20 => 0], $ergebnis['Sollwerte']);
|
||||
self::assertSame(10, $ergebnis['Restabweichung_W']);
|
||||
}
|
||||
|
||||
public function testPeakVerwendetPeakPrioritaetVorLeistungUndEnergie(): void
|
||||
{
|
||||
$a = $this->verbraucher(10, 0, [0, 100, 200], 0);
|
||||
$b = $this->verbraucher(20, 9, [0, 300], 0);
|
||||
$a['Daten']['PrioritaetPeak'] = 9;
|
||||
$b['Daten']['PrioritaetPeak'] = 0;
|
||||
$ergebnis = ManagerRegler::verteile(0.0, 300.0, [$a, $b], 'PrioritaetPeak', [20 => 50000.0]);
|
||||
|
||||
self::assertSame([20 => 300, 10 => 0], $ergebnis['Sollwerte']);
|
||||
}
|
||||
|
||||
public function testGrosseBereicheWerdenGemeinsamOhneWattweiseSchleifeVerteilt(): void
|
||||
{
|
||||
$ergebnis = ManagerRegler::verteile(0.0, 1000000001.0, [
|
||||
$this->verbraucher(10, 0, [['Von_W' => 0, 'Bis_W' => 1000000000]], 0),
|
||||
$this->verbraucher(20, 0, [['Von_W' => 0, 'Bis_W' => 1000000000]], 0),
|
||||
], 'PrioritaetPV', [10 => 999.0, 20 => 0.0]);
|
||||
|
||||
self::assertSame([10 => 500000000, 20 => 500000001], $ergebnis['Sollwerte']);
|
||||
self::assertSame(0, $ergebnis['Restabweichung_W']);
|
||||
}
|
||||
|
||||
public function testBereicheUndEinzelwerteGegenWattweiseReferenz(): void
|
||||
{
|
||||
$angebote = [
|
||||
[0, ['Von_W' => 3, 'Bis_W' => 9], 15],
|
||||
[0, 5, ['Von_W' => 7, 'Bis_W' => 12], 18],
|
||||
[0, 4, 8, ['Von_W' => 14, 'Bis_W' => 20]],
|
||||
];
|
||||
$energien = [10 => 10000.5, 20 => 10000.0, 30 => 10000.0];
|
||||
$verbraucher = [];
|
||||
$diskret = [];
|
||||
foreach ($angebote as $index => $angebot) {
|
||||
$id = ($index + 1) * 10;
|
||||
$verbraucher[] = $this->verbraucher($id, 2, $angebot, 0);
|
||||
$diskret[$id] = [];
|
||||
foreach ($angebot as $wert) {
|
||||
foreach (is_int($wert) ? [$wert] : range($wert['Von_W'], $wert['Bis_W']) as $watt) {
|
||||
$diskret[$id][] = $watt;
|
||||
}
|
||||
}
|
||||
}
|
||||
for ($budget = 0; $budget <= 60; $budget++) {
|
||||
$erwartet = [10 => 0, 20 => 0, 30 => 0];
|
||||
$rest = $budget;
|
||||
while (true) {
|
||||
$schritte = [];
|
||||
foreach ($diskret as $id => $werte) {
|
||||
foreach ($werte as $wert) {
|
||||
if ($wert > $erwartet[$id]) {
|
||||
if ($wert - $erwartet[$id] <= $rest) {
|
||||
$schritte[] = [$wert, $energien[$id], $id];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($schritte === []) {
|
||||
break;
|
||||
}
|
||||
sort($schritte);
|
||||
[$wert, , $id] = $schritte[0];
|
||||
$rest -= $wert - $erwartet[$id];
|
||||
$erwartet[$id] = $wert;
|
||||
}
|
||||
$ergebnis = ManagerRegler::verteile(0.0, (float) $budget, array_reverse($verbraucher),
|
||||
'PrioritaetPV', $energien);
|
||||
$ist = $ergebnis['Sollwerte'];
|
||||
ksort($ist);
|
||||
self::assertSame($erwartet, $ist, 'Budget: ' . $budget);
|
||||
self::assertSame($rest, $ergebnis['Restabweichung_W']);
|
||||
}
|
||||
}
|
||||
|
||||
public function testNichtVerfuegbareLastWirdReserviertUndNichtNeuZugeteilt(): void
|
||||
{
|
||||
$a = $this->verbraucher(10, 0, [0, 100, 200], 100);
|
||||
$a['Daten']['Verfuegbar'] = false;
|
||||
$ergebnis = ManagerRegler::verteile(100.0, 200.0, [
|
||||
$a,
|
||||
$this->verbraucher(20, 0, [0, 100, 200], 0),
|
||||
], 'PrioritaetPV');
|
||||
|
||||
self::assertSame(100, $ergebnis['NichtSteuerbar_W']);
|
||||
self::assertSame([20 => 100], $ergebnis['Sollwerte']);
|
||||
}
|
||||
|
||||
public function testFestwertWirdUnabhaengigVonAenderungMoeglichZugewiesen(): void
|
||||
|
||||
Reference in New Issue
Block a user