Ik wil een programma maken om de inhoud van tabellen te minimaliseren. Ik wil hiervoor een algoritme programmeren die de waarden in de tabel lineairiseert, uiteraard met zo weinig mogelijk verliezen aan nauwkeurigheid. De tabel geeft het inhoud van een tank weer, afhankelijk de de vloeistofhoogte en de hoek waaronder de tank zich op dat moment bevindt. De data wordt ingelezen (en gecached) door een PLC en dat gaat niet bepaald snel, hierdoor wil ik de in te lezen data minimaliseren.
De tabel bouw ik als volgt op:
De eerste regel geeft de hoek weer (muv de eerste kolom). Daarna is de eerste kolom de hoogte in mm en de waarden die erna staan de inhoud in m3. Ik wil een tabel overhouden met zo weinig mogelijk rijen en kolommen, met een zo groot mogelijke nauwkeurigheid. Aangezien in de PLC ruimte is voor 1000 rijen wil ik dit als maximum aanhouden en wil ik de nauwkeurigheid instelbaar maken. Meestal heeft een tabel minder dan 1000 rijen en speelt nauwkeurigheid een rol.
Om het eenvoudig te houden wil ik eerst het algoritme toepassen op een enkele kolom. In het voorbeeld zou dit voor de eerste kolom 3 records opleveren ({0, 0}, {30, 3}, {80. 4}) en voor de zesde kolom 5 records ({0, 5}, {10, 6.1}, {20, 7}, {30, 8}, {80, 9}) bij 0% afwijking. De tabel die uiteindelijk gelineairiseerd moet worden is uiteraard veel groter en complexer.
Mijn eerste gedachte was om stappen te zoeken met de meeste regels en met de kleinste afwijking. Ik voorzie hier het probleem dat de afwijking zich in het meest lineaire gedeelte van de tabel gaat concentreren en niet verdeeld wordt over de totale inhoud. Dit lijkt in eerste instantie de bedoeling, maar het zou beter zijn als een ander lineair gebied ook een deel van de afwijking voor zijn rekening zou nemen.
De volgende gedachte was om een stap te berekenen met de laagste afwijking. Er zal een nieuwe maximale afwijking voor de stap bijgehouden worden en als er een stap is met een kleinere afwijking, zal deze gekozen worden. Probleem is dat de maximale afwijking niet gelijk hoeft te zijn aan de werkelijke afwijking.
Een derde gedachte is om elke stap met een soort brute force/backtracking aloritme door te rekenen om de maximale nauwkeurigheid te behalen.
Zijn hier misschien slimmere algoritme's voor?
De tabel bouw ik als volgt op:
code:
1
2
3
4
5
6
| -1.5 -1 -0.5 0 0.5 1.5 0 0 1 2 3 4 5 10 1 2 3 4 5 6.1 20 2 3 4 5 6 7 30 3 4 5 6 7 8 80 4 5 6 7 8 9 |
De eerste regel geeft de hoek weer (muv de eerste kolom). Daarna is de eerste kolom de hoogte in mm en de waarden die erna staan de inhoud in m3. Ik wil een tabel overhouden met zo weinig mogelijk rijen en kolommen, met een zo groot mogelijke nauwkeurigheid. Aangezien in de PLC ruimte is voor 1000 rijen wil ik dit als maximum aanhouden en wil ik de nauwkeurigheid instelbaar maken. Meestal heeft een tabel minder dan 1000 rijen en speelt nauwkeurigheid een rol.
Om het eenvoudig te houden wil ik eerst het algoritme toepassen op een enkele kolom. In het voorbeeld zou dit voor de eerste kolom 3 records opleveren ({0, 0}, {30, 3}, {80. 4}) en voor de zesde kolom 5 records ({0, 5}, {10, 6.1}, {20, 7}, {30, 8}, {80, 9}) bij 0% afwijking. De tabel die uiteindelijk gelineairiseerd moet worden is uiteraard veel groter en complexer.
Mijn eerste gedachte was om stappen te zoeken met de meeste regels en met de kleinste afwijking. Ik voorzie hier het probleem dat de afwijking zich in het meest lineaire gedeelte van de tabel gaat concentreren en niet verdeeld wordt over de totale inhoud. Dit lijkt in eerste instantie de bedoeling, maar het zou beter zijn als een ander lineair gebied ook een deel van de afwijking voor zijn rekening zou nemen.
De volgende gedachte was om een stap te berekenen met de laagste afwijking. Er zal een nieuwe maximale afwijking voor de stap bijgehouden worden en als er een stap is met een kleinere afwijking, zal deze gekozen worden. Probleem is dat de maximale afwijking niet gelijk hoeft te zijn aan de werkelijke afwijking.
Een derde gedachte is om elke stap met een soort brute force/backtracking aloritme door te rekenen om de maximale nauwkeurigheid te behalen.
Zijn hier misschien slimmere algoritme's voor?
You don't have to be crazy to do this job, but it helps ....