Das Ziel ist eine Gartenfläche in möglichst Quadratische Kleingärten zu unterteilen.
Zu erst muss eine Definition des Begriffes Quadratisch beschrieben werden. Quadratisch ist das Verhältnis von der kleinen Seite zur großen Seite. Sollte dieses 1 sein, so ist das gegebene Rechteck zu 100% Quadratisch. Der Mathematische Ausdruck lautet wie folgt:
b und h beschreiben die Breite und Höhe des Rechtecks und sind immer positiv. Der Funktionswert von s kann zwischen 0 und 1 sein.
Die Suche nach der optimalen Aufteilung ist die Suche nach dem maximalen Funktionswert von s. Hierfür suchen wir in einem Interval von
Hierbei wird wie folgt vorgegangen:
- Gehe durch das Interval mit Schrittweite 1. Dies ist die momentane Anzahl der plots
- Gehe durch alle möglichen Anzahlen an Reihen von 1 zu momentane Anzahl der plots + 1, welche Teiler dieser Anzahl an Plots sind.
- Berechne für jede Reihe die Anzahl an möglichen Spalten.
- Bestimme die Breite und Höhe eines einzelnen Plots.
- Merke dir die Höhe und Breite.
- Nachdem das Interval untersucht wurde, sortiere die gemerkten Plots nach ihrer Quadratförmigkeit.
- Die ersten drei Plots nach der Sortierung sind das Ergebnis.
Der Mathematisch Ausdruck hierfür währe wie folgt:
Wobei:
-
$n$ die Plot Anzahl ist -
$r$ die Anzahl der Reihen ist -
$c$ die Anzahl der Spalten ist -
$W$ die Gesamtbreite ist -
$H$ die Gesamthöhe ist -
$n_{min}$ und$n_{max}$ die Intervalgrenzen sind
Die Formel beschreibt die Suche nach der Kombination von Plot Anzahl und Reihen Anzahl, die die höchste Quadratförmigkeit ergibt, unter Berücksichtigung der Randbedingungen.
...
...
class GardenPlotter:
def _init_(self, width, height, interested):
self.total_width = width
self.total_height = height
self.min_plots = interested
self.max_plots = int(interested * 1.1)
def calculate_squareness(self, width, height):
return min(width, height) / max(width, height)
def find_best_division(self):
best_squareness = 0
best_division = None
for plots in range(self.min_plots, self.max_plots + 1):
for rows in range(1, plots + 1):
if plots % rows == 0:
cols = plots // rows
plot_width = self.total_width / cols
plot_height = self.total_height / rows
squareness = self.calculate_squareness(plot_width, plot_height)
if squareness > best_squareness:
best_squareness = squareness
best_division = {
'rows': rows,
'cols': cols,
'total_plots': plots,
'plot_width': plot_width,
'plot_height': plot_height,
'squareness': squareness
}
return best_division
Für calculate_squareness(w, h) gilt:
Für find_best_division() gilt: