Hier ist ein kleines Mathematica Programm.
Obwohl es nur zwei Zeilen Code (!) ist, werden Sie wahrscheinlich mehr in einer konventionellen Sprache benötigen, sowie eine Mathematikbibliothek, die in der Lage ist, ein Maximum an Funktionen zu finden.
Ich nehme an, Sie sind nicht in Mathematica fließend, so werde ich Zeile für Zeile erklären und kommentieren.
Zunächst erstellen wir eine Tabelle mit 10 zufälligen Punkten in {0,1} x {0,1} und nennen sie p.
p = Table[{RandomReal[], RandomReal[]}, {10}];
Nun erstellen wir eine Funktion zu maximieren:
f[x_, y_] = Min[ x^2,
y^2,
(1 - x)^2,
(1 - y)^2,
((x - #[[1]])^2 + (y - #[[2]])^2) & /@ p];
Ha! Syntax wurde knifflig! Lassen Sie uns erklären:
Die Funktion gibt Ihnen für jeden Punkt in {0,1} x {0,1} die Mindestabstand von diesem Punkt zu unserem Satz p UND die Kanten. Die ersten vier Terme sind die Abstände zu den Kanten und die letzte (schwer zu lesen, ich weiß) ist ein Set, das die Entfernung zu allen Punkten enthält.
Was wir als nächstes tun werden, ist maximiert diese Funktion, so dass wir den Punkt bekommen, wo der Mindestabstand zu unseren Zielen maximal ist.
Aber zuerst schauen wir uns f [] an. Wenn Sie es kritisch betrachten, werden Sie sehen, dass es nicht wirklich die Entfernung ist, sondern die Entfernung im Quadrat. Ich habe es so definiert, weil auf diese Weise die Funktion viel einfacher zu maximieren ist und die Ergebnisse gleich sind.
Beachten Sie auch, dass f [] keine "hübsche" Funktion ist. Wenn wir es in plotten {0,1}, erhalten wir so etwas wie:
Das ist, warum müssen Sie ein schönes mathematisches Paket das Maximum zu finden.
Mathematica ist so ein schönes Paket, dass wir einfach, die Sache zu maximieren:
max = Maximize[{f[x, y], {0 <= x <= 1, 0 <= y <= 1}}, {x, y}];
Und das ist es. Die Funktion "Maximieren" gibt den Punkt und die Quadratdistanz zum nächsten Rand/Punkt zurück.
HTH! Wenn Sie Hilfe bei der Übersetzung in eine andere Sprache benötigen, hinterlassen Sie einen Kommentar.
bearbeiten
Obwohl ich kein C# Person bin, nach dem in SO nach Referenzen suchen und googeln, kam dies:
Ein Kandidat Paket ist DotNumerics
Sie die folgen sollten, folgendes Beispiel in der Verpackung:
file: \DotNumerics Samples\Samples\Optimization.cs
Example header:
[Category("Constrained Minimization")]
[Title("Simplex method")]
[Description("The Nelder-Mead Simplex method. ")]
public void OptimizationSimplexConstrained()
HTH!
2D, 3D? ...... –
Können Sie mehr über die Anforderungen erfahren? Wie weit weg? Sicher, du willst nicht nur 1e6,1e6 (, 1e6) zu einem zufälligen Punkt hinzufügen? Warum auch nach den Punkten und Kanten suchen? Da die Punkte in der Box sind, warum nicht einfach die Kanten verwenden? – EboMike
Dieses Problem ist vage. es gibt keinen Sinn dafür, wie "weit weg von den Rändern der Box" gegen "am weitesten entfernt von zuvor hinzugefügten Punkten" gemessen wird. Gibt es eine Funktion, die du aufschreiben kannst, um sie zu minimieren? – lijie