Compare commits
No commits in common. "master" and "v2.0" have entirely different histories.
2
.gitignore
vendored
@ -6,4 +6,4 @@
|
||||
|
||||
# Matlab related
|
||||
*.m~
|
||||
*.asv
|
||||
|
||||
|
@ -1,313 +0,0 @@
|
||||
% !TEX TS-program = xelatex
|
||||
% !TEX encoding = UTF-8 Unicode
|
||||
% !TEX spellcheck = el-GR
|
||||
%
|
||||
% Optimization techniques project report
|
||||
%
|
||||
% Requires compilation with pdfLaTeX or XeLaTeX
|
||||
%
|
||||
% authors:
|
||||
% Χρήστος Χουτουρίδης ΑΕΜ 8997
|
||||
% cchoutou@ece.auth.gr
|
||||
|
||||
%
|
||||
% Options:
|
||||
%
|
||||
% 1) mainlang=<language>
|
||||
% Default: english
|
||||
% Set the default language of the document which affects hyphenations,
|
||||
% localization (section, dates, etc...)
|
||||
%
|
||||
% example: \documentclass[mainlang=greek]{AUThReport}
|
||||
%
|
||||
% 2) <language>
|
||||
% Add hyphenation and typesetting support for other languages
|
||||
% Currently supports: english, greek, german, frenc
|
||||
%
|
||||
% example: \documentclass[english, greek]{AUThReport}
|
||||
%
|
||||
% 3) short: Requests a shorter title for the document
|
||||
% Default: no short
|
||||
%
|
||||
% example: \documentclass[short]{AUThReport}
|
||||
%
|
||||
\documentclass[a4paper, 11pt, mainlang=greek, english]{AUThReport}
|
||||
|
||||
\CurrentDate{\today}
|
||||
|
||||
% Document setup
|
||||
%---------------------------------
|
||||
|
||||
% \WorkGroup{Ομάδα Χ}
|
||||
|
||||
\AuthorName{Χρήστος Χουτουρίδης}
|
||||
\AuthorMail{cchoutou@ece.auth.gr}
|
||||
\AuthorAEM{8997}
|
||||
|
||||
%\CoAuthorName{Όνομα Επίθετο}
|
||||
%\CoAuthorAEM{AEM}
|
||||
%\CoAuthorMail{xxx@ece.auth.gr}
|
||||
|
||||
\DocTitle{Project: Γενετικοί αλγόριθμοι}
|
||||
\DocSubTitle{Ελαχιστοποίηση συνάρτησης πολλών μεταβλητών}
|
||||
|
||||
\Department{Τμήμα ΗΜΜΥ. Τομέας Ηλεκτρονικής}
|
||||
\ClassName{Τεχνικές Βελτιστοποίησης}
|
||||
%
|
||||
\InstructorName{Γ. Ροβιθάκης}
|
||||
\InstructorMail{rovithak@auth.gr}
|
||||
|
||||
\CoInstructorName{Θ. Αφορόζη}
|
||||
\CoInstructorMail{taforozi@ece.auth.gr}
|
||||
|
||||
|
||||
% Local package requirements
|
||||
%---------------------------------
|
||||
|
||||
\usepackage{enumitem}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{array}
|
||||
\usepackage{multirow}
|
||||
\usepackage{float}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{soul}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{footnote}
|
||||
\usepackage{footmisc}
|
||||
|
||||
\usepackage[labelformat=empty]{subcaption}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\InsertTitle
|
||||
%\tableofcontents
|
||||
|
||||
\section{Εισαγωγή}
|
||||
|
||||
Η παρούσα εργασία αφορά την ελαχιστοποίηση συνάρτησης πολλών μεταβλητών, χρησιμοποιώντας \textbf{γενετικό αλγόριθμο}.
|
||||
Στην παρούσα εργασία προσπαθήσαμε να βελτιστοποιήσουμε το συνολικό χρόνο διέλευσης από ένα οδικό δίκτυο, το οποίο καλείται να εξυπηρετήσει ένα προκαθορισμένο όγκο οχημάτων ανά λεπτό, ενώ οι οδεύσεις του έχουν πεπερασμένη και προκαθορισμένη χωρητικότητα.
|
||||
Η προσέγγιση του προβλήματος έγινε βάση δοθέντος από την εκφώνηση μαθηματικού μοντέλου για το χρόνο διέλευσης της κάθε κυκλοφοριακής κατεύθυνσης, το οποίο χρησιμοποιήθηκε ως συνάρτηση αξιολόγησης για το γενετικό αλγόριθμο που τον ελαχιστοποιεί.
|
||||
|
||||
\subsection{Παραδοτέα}
|
||||
Τα παραδοτέα της εργασίας αποτελούνται από:
|
||||
\begin{itemize}
|
||||
\item Την παρούσα αναφορά.
|
||||
\item Τον κατάλογο \textbf{scripts/}, που περιέχει τον κώδικα της MATLAB.
|
||||
\item Το \href{https://git.hoo2.net/hoo2/OptimizationTechniques/src/branch/master/Project}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα της MATLAB, της αναφοράς και τα παραδοτέα.
|
||||
\end{itemize}
|
||||
|
||||
\section{Γενετικοί Αλγόριθμοι}
|
||||
|
||||
Οι γενετικοί αλγόριθμοι (Genetic Algorithms - GAs) είναι αλγόριθμοι βελτιστοποίησης εμπνευσμένοι από τις αρχές της \textbf{φυσικής επιλογής} και της \textbf{γενετικής εξέλιξης}.
|
||||
Σε αντίθεση με μεθόδους που χρησιμοποιούν παραγώγους, όπως αυτή της μέγιστης καθόδους, του Newtown κλπ, οι γενετικοί αλγόριθμοι αποτελούν τεχνικές ολικής βελτιστοποίησης, δηλαδή της εύρεσης του ολικού ελάχιστου μια συνάρτησης.
|
||||
\par
|
||||
Oι γενετικοί αλγόριθμοι λειτουργούν με τη δημιουργία ενός πληθυσμού πιθανών λύσεων, όπου κάθε λύση αναπαριστάται ως ένα χρωμόσωμα (διάνυσμα παραμέτρων).
|
||||
Ο πληθυσμός εξελίσσεται μέσα από επαναλαμβανόμενες γενιές, εφαρμόζοντας τις εξής διαδικασίες:
|
||||
\begin{itemize}
|
||||
\item \textbf{Υπολογισμός καταλληλότητας (fitness evaluation)}: Κάθε λύση αξιολογείται βάσει μιας συνάρτησης καταλληλότητας, η οποία ποσοτικοποιεί πόσο καλή είναι σε σχέση με το πρόβλημα.
|
||||
\item \textbf{Επιλογή (selection)}: Επιλέγονται οι καλύτερες λύσεις από τον τρέχοντα πληθυσμό, οι οποίες έχουν υψηλότερη πιθανότητα να περάσουν στα επόμενα στάδια.
|
||||
\item \textbf{Διασταύρωση (crossover)}: Δημιουργούνται νέες λύσεις μέσω συνδυασμού δύο γονικών λύσεων, αναμιγνύοντας τα χαρακτηριστικά τους.
|
||||
\item \textbf{Μετάλλαξη (mutation)}: Σε ορισμένες λύσεις εφαρμόζονται μικρές, τυχαίες τροποποιήσεις ώστε να διατηρηθεί η ποικιλομορφία του πληθυσμού και να αποφευχθεί η παγίδευση σε τοπικά ελάχιστα.
|
||||
\item \textbf{Αντικατάσταση (replacement)}: Ο νέος πληθυσμός που προκύπτει αντικαθιστά τον παλιό, συνεχίζοντας τη διαδικασία μέχρι να ικανοποιηθεί κάποιο κριτήριο σύγκλισης.
|
||||
\end{itemize}
|
||||
|
||||
Η συνεχής επανάληψη αυτών των διαδικασιών επιτρέπει στον γενετικό αλγόριθμο να αναζητήσει και να προσεγγίσει την καλύτερη δυνατή λύση μέσα στον χώρο των πιθανών λύσεων.
|
||||
Στις επόμενες παραγράφους θα περιγράψουμε την υλοποίηση αυτών των διαδικασιών για την παρούσα εργασία.
|
||||
|
||||
\section{Μαθηματική διατύπωση του προβλήματος}
|
||||
|
||||
Το πρόβλημα μοντελοποιείται ως εξής:
|
||||
|
||||
\subsection*{Μεταβλητές Απόφασης}
|
||||
Ο ρυθμός διέλευσης οχημάτων $x$ σε κάθε δρόμο $i$ για τους $n$ δρόμους δίνεται ως:
|
||||
\[
|
||||
x = [x_1, x_2, \dots, x_n]
|
||||
\]
|
||||
|
||||
\subsection*{Χρόνος κίνησης σε κάθε δρόμο}
|
||||
Ο χρόνος διάσχισης $T_i$ του δρόμου $i$ συναρτήσει του ρυθμού διέλευσης είναι:
|
||||
\begin{equation}
|
||||
T_i(x_i) = t_i + \frac{a_i x_i}{1 - \frac{x_i}{c_i}}, \quad 0 \leq x_i < c_i, \quad i=1,2,\dots,n
|
||||
\label{eq:Ti}
|
||||
\end{equation}
|
||||
\subsection*{Συνολικός χρόνος κίνησης}
|
||||
Ο συνολικός χρόνος $T_total$ του οδικού δικτύου είναι:
|
||||
\begin{equation}
|
||||
T_{total} = \sum_{i=1}^{n} T_i(x_i)
|
||||
\label{eq:Ttotal}
|
||||
\end{equation}
|
||||
\subsection*{Στόχος}
|
||||
Ελαχιστοποίηση του συνολικού χρόνου διάσχισης:
|
||||
\begin{equation}
|
||||
\min_{x} T_{total} = \min_{x} \sum_{i=1}^{n} T_i(x_i) = \min_{x} \sum_{i=1}^{n} \left( t_i + \frac{a_i x_i}{1 - \frac{x_i}{c_i}} \right)
|
||||
\label{eq:problem}
|
||||
\end{equation}
|
||||
\par
|
||||
Εδώ θα πρέπει να τονίσουμε πως κάναμε την υπόθεση ότι ο χρόνος \boldmath $T_i$ αφορά \textbf{όλα τα οχήματα} που κινούνται το δεδομένο στιγμιότυπο στο δρόμο $i$\unboldmath.
|
||||
Η εκφώνηση της άσκησης δεν ξεκαθαρίζει αν ο χρόνος $T_i$ αφορά το κάθε μεμονωμένο όχημα ή όλα.
|
||||
Σε περίπτωση πάντως που αφορά το κάθε όχημα ξεχωριστά τότε το άθροισμα θα έπρεπε να τροποποιηθεί σε: $ \sum_{i=1}^{n} T_i(x_i)\cdot x_i = \sum_{i=1}^{n} \left( t_i + \frac{a_i x_i}{1 - \frac{x_i}{c_i}}\right)\cdot x_i $, το οποίο όμως δεν αλλάζει τη συμπεριφορά και τα ευρήματα της εργασίας.
|
||||
|
||||
\subsection*{Περιορισμοί}
|
||||
1. Ισορροπία εισερχομένων και εξερχομένων ροών σε κάθε κόμβο $j$:
|
||||
\[
|
||||
\sum_{i \in incoming(j)} x_i = \sum_{k \in outgoing(j)} x_k, \quad \forall j
|
||||
\]
|
||||
|
||||
2. Περιορισμός ροής:
|
||||
\[
|
||||
0 \leq x_i \leq c_i, \quad \forall i
|
||||
\]
|
||||
|
||||
3. Ο συνολικός ρυθμός εισόδου στο δίκτυο:
|
||||
\[
|
||||
\sum_{i=1}^{n} x_i = V
|
||||
\]
|
||||
|
||||
\section{Υλοποίηση}
|
||||
|
||||
Πριν περάσουμε στην παρουσίαση των αποτελεσμάτων, καλό θα ήταν να περιγράψουμε τις εξελικτικές διαδικασίες που χρησιμοποιήσαμε.
|
||||
Πιο συγκεκριμένα στην παρούσα εργασία υλοποιήσαμε ένα βρόχο με σταθερό αριθμό γενεών.
|
||||
Σε κάθε γενιά του βρόχου:
|
||||
\begin{itemize}
|
||||
\item Εκτελούμε τη \textbf{συνάρτηση καταλληλότητας} η οποία απλώς χρησιμοποιεί τη μαθηματική μοντελοποίηση που περιγράψαμε στις εξισώσεις \ref{eq:Ti}, \ref{eq:Ttotal} για να αξιολογήσει τη συνολική απόδοση του πληθυσμού.
|
||||
Με αυτό τον τρόπο έχουμε τον χρόνο σε κάθε δρόμο αλλά και τον συνολικό χρόνο για κάθε ένα χρωμόσωμα ξεχωριστά.
|
||||
\item Έπειτα εκτελούμε \textbf{διασταύρωση}.
|
||||
Για το σκοπό αυτό ταξινομούμε τον πληθυσμό με βάση τη συνολική ικανότητα και διαλέγουμε τις μισές καλύτερες λύσεις (χρωμοσώματα).
|
||||
Αυτά τα χρησιμοποιούμε ως γονείς.
|
||||
Με τυχαίο τρόπο επιλέγουμε δύο -- δύο κάθε φορά και από αυτό το ζευγάρι δημιουργούμε δύο παιδιά.
|
||||
Το κάθε παιδί δημιουργείται με τη μέθοδο της \textbf{διακριτής διασταύρωσης}.
|
||||
Εδώ να πούμε πως το πόσο μεγάλο κομμάτι από τον κάθε γονέα θα περάσει στο κάθε παιδί το επιλέγουμε με τυχαίο τρόπο.
|
||||
\item Έπειτα ολοκληρώνουμε τη διαδικασία αντικατάσταση, χρησιμοποιώντας τη \textbf{στρατηγική '+'}.
|
||||
Δηλαδή κρατάμε τους γονείς και συμπληρώνουμε το 2ο μισό του πληθυσμού με τα παιδιά.
|
||||
\item Τέλος εκτελούμε τη διαδικασία της μετάλλαξης.
|
||||
Σε αυτή τη διαδικασία συμμετέχουν όλα τα χρωμοσώματα και είναι τυχαίο φαινόμενο.
|
||||
Με βάση μιας προκαθορισμένης πιθανότητας επιλέγουμε χρωμοσώματα από όλο τον πληθυσμό και τους αλλάζουμε την τιμή μιας τυχαίας παραμέτρου (χρόνος διέλευσης από ένα δρόμο).
|
||||
Η νέα τιμή επιλέγεται πάλι τυχαία.
|
||||
\end{itemize}
|
||||
|
||||
\section{Εκτέλεση - Συμπεριφορά}
|
||||
|
||||
Για την εκτέλεση του αλγόριθμου κινηθήκαμε σε δύο κατευθύνσεις.
|
||||
Από τη μία κρατήσαμε σταθερό τον πληθυσμό και παρατηρήσαμε τη σύγκλιση του αλγόριθμου για διαφορετικές πιθανότητες μεταλλάξεων και από την άλλη κρατήσαμε την πιθανότητα σταθερή και δοκιμάσαμε διαφορετικό αριθμό χρωμοσωμάτων.
|
||||
|
||||
\subsection{Σταθερός αριθμός χρωμοσωμάτων}
|
||||
|
||||
Παρακάτω στο σχήμα \ref{fig:constV_pop_50} φαίνεται η πορεία σύγκλισης για την πρώτη περίπτωση.
|
||||
Εδώ κρατήσαμε τον πληθυσμό στο 50 και δοκιμάσαμε πιθανότητες $0.2\%, 0.5\%, 1\%$ και $2\%$.
|
||||
\textbf{Επιλέξαμε αρκετά μικρές τιμές για πιθανότητες ώστε να φανεί καλύτερα η συμπεριφορά του αλγόριθμου}.
|
||||
Παρατηρούμε πως για μικρή πιθανότητα ο αλγόριθμος χρειάζεται πολλές γενεές για να συγκλίνει.
|
||||
Επίσης, δείχνει να κολλάει σε κάποια υπο-βέλτιστη λύση για αρκετές γενεές.
|
||||
Και τα δύο αυτά χαρακτηριστικά βέβαια ελαττώνονται με την αύξηση της πιθανότητας.
|
||||
|
||||
\par
|
||||
Να σημειώσουμε εδώ ότι η αύξηση της πιθανότητας μετάλλαξης \textbf{αυξάνει ελάχιστα} τη υπολογιστική πολυπλοκότητα του αλγόριθμου.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
% First row
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_50mut_0.002.png}
|
||||
\caption{Πιθανότητα: $0.2\%$}
|
||||
\end{subfigure}
|
||||
\hfill
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_50mut_0.005.png}
|
||||
\caption{Πιθανότητα: $0.5\%$}
|
||||
\end{subfigure}
|
||||
|
||||
% Second row
|
||||
\vspace{1em}
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering¨
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_50mut_0.01.png}
|
||||
\caption{Πιθανότητα: $1\%$}
|
||||
\end{subfigure}
|
||||
\hfill
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_50mut_0.02.png}
|
||||
\caption{Πιθανότητα: $2\%$}
|
||||
\end{subfigure}
|
||||
|
||||
\caption{Σύγκριση της μεθόδου για σταθερό πληθυσμό $50$.}
|
||||
\label{fig:constV_pop_50}
|
||||
\end{figure}
|
||||
|
||||
|
||||
\subsection{Σταθερή πιθανότητα μετάλλαξης}
|
||||
|
||||
Παρακάτω στο σχήμα \ref{fig:constV_mut_0.01} φαίνεται η πορεία σύγκλισης για την πρώτη περίπτωση.
|
||||
Εδώ κρατήσαμε την πιθανότητα στο $1\%$ και δοκιμάσαμε πληθυσμούς των $26, 50, 76$ και $100$ χρωμοσωμάτων.
|
||||
\textbf{Επιλέξαμε πάλι αρκετά μικρές τιμές για τον πληθυσμό ώστε να φανεί καλύτερα η συμπεριφορά του αλγόριθμου}.
|
||||
Ομοίως παρατηρούμε πως μικροί πληθυσμοί χρειάζονται πολλές γενεές για να συγκλίνουν και οι μεταλλάξεις παρουσιάζουν απότομες μεταβολές.
|
||||
Μεγαλύτεροι πληθυσμοί όμως φαίνεται ότι βοηθούν αρκετά στην συνολική πιθανότητα μετάλλαξης προς τη βέλτιστη λύση.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
% First row
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_26mut_0.01.png}
|
||||
\caption{Πληθυσμός: $26$}
|
||||
\end{subfigure}
|
||||
\hfill
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_50mut_0.01.png}
|
||||
\caption{Πληθυσμός: $50$}
|
||||
\end{subfigure}
|
||||
|
||||
% Second row
|
||||
\vspace{1em}
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_76mut_0.01.png}
|
||||
\caption{Πληθυσμός: $76$}
|
||||
\end{subfigure}
|
||||
\hfill
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_100mut_0.01.png}
|
||||
\caption{Πληθυσμός: $100$}
|
||||
\end{subfigure}
|
||||
|
||||
\caption{Σύγκριση της μεθόδου για σταθερή πιθανότητα μετάλλαξης $1\%$.}
|
||||
\label{fig:constV_mut_0.01}
|
||||
\end{figure}
|
||||
|
||||
\par
|
||||
Να σημειώσουμε εδώ ότι η αύξηση του πληθυσμού \textbf{αυξάνει σημαντικά} τη υπολογιστική πολυπλοκότητα του αλγόριθμου.
|
||||
Για αυτό το λόγο, όπως φαίνεται και στο παρακάτω σχήμα \ref{fig:constV_high_mut}, είναι προτιμότερο να επιλέξουμε \textbf{μεγάλη πιθανότητα μετάλλαξης με σχετικά μικρό πληθυσμό}.
|
||||
Όπου βλέπουμε πως ο αλγόριθμος συμπεριφέρεται αρκετά καλά ακόμα και με μικρό πληθυσμό.
|
||||
Αυτό θα μας δώσει γρήγορη σύγκλιση με σημαντικά μικρότερη υπολογιστική πολυπλοκότητα.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
% First row
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_50mut_0.05.png}
|
||||
\caption{Πληθυσμός: $50$, Πιθανότητα: $5\%$}
|
||||
\end{subfigure}
|
||||
\hfill
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/constV_pop_36mut_0.1.png}
|
||||
\caption{Πληθυσμός: $36$, Πιθανότητα: $10\%$}
|
||||
\end{subfigure}
|
||||
|
||||
\caption{Σύγκριση της μεθόδου για υψηλή πιθανότητα μετάλλαξης.}
|
||||
\label{fig:constV_high_mut}
|
||||
\end{figure}
|
||||
|
||||
\section{Συμπεράσματα}
|
||||
|
||||
Συνοψίζοντας, η χρήση του \textbf{γενετικού αλγορίθμου} για τη βελτιστοποίηση του χρόνου διέλευσης ενός οδικού δικτύου επέδειξε την ικανότητα των εξελικτικών τεχνικών να διαχειρίζονται σύνθετα προβλήματα χωρίς να απαιτούνται παράγωγοι ή άλλες αναλυτικές μέθοδοι.
|
||||
Από την ανάλυση των αποτελεσμάτων, παρατηρήσαμε πως η \textbf{πιθανότητα μετάλλαξης} και το \textbf{μέγεθος του πληθυσμού} επηρεάζουν άμεσα τη σύγκλιση και την απόδοση του αλγορίθμου.
|
||||
Μικρές πιθανότητες μετάλλαξης οδηγούν σε πιο αργή σύγκλιση, ενώ αυξημένος πληθυσμός παρέχει καλύτερη εξερεύνηση του χώρου λύσεων αλλά με μεγαλύτερο υπολογιστικό κόστος.
|
||||
Τα αποτελέσματα δείχνουν πως μια \textbf{ισορροπημένη επιλογή παραμέτρων} επιτρέπει τη βέλτιστη κατανομή της κυκλοφορίας, μειώνοντας σημαντικά τον συνολικό χρόνο διάσχισης.
|
||||
Επομένως, οι γενετικοί αλγόριθμοι αποτελούν μια αποτελεσματική επιλογή για παρόμοια προβλήματα βελτιστοποίησης, ειδικά όταν η διατύπωση του προβλήματος δεν επιτρέπει κλασικές μαθηματικές μεθόδους.
|
||||
|
||||
\end{document}
|
Before Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 71 KiB |
@ -1,98 +0,0 @@
|
||||
% Genetic Algorithm for Minimizing Network Traversal Time
|
||||
|
||||
clc;
|
||||
clear;
|
||||
close all;
|
||||
|
||||
% Problem Parameters
|
||||
N = 17; % Number of roads
|
||||
t = 1.5 * ones(1, N); % Fixed time for each road
|
||||
a = [1.25 * ones(1, 5), 1.5 * ones(1, 5), ones(1, 7)]; % Weighting factor
|
||||
c = [
|
||||
54.13, 21.56, 34.08, 49.19, 33.03, 21.84, 29.96, 24.87, 47.24, 33.97, ...
|
||||
26.89, 32.76, 39.98, 37.12, 53.83, 61.65, 59.73]; % Road capacities
|
||||
V = 100; % Incoming vehicle rate
|
||||
|
||||
% Travel Time Function
|
||||
travelTime = @(xi, ti, ai, ci) ti + ai * xi / (1 - xi / ci);
|
||||
% Normalization Function (Infinite norm normalized to S)
|
||||
normalizeSum = @(x, S) (x ./ sum(x)) * S; % Ensure sum of single row x equals S
|
||||
normalizeSum2 = @(x, S) (x ./ sum(x, 2)) * S; % Ensure sum of each row of 2D matrix x equals S
|
||||
|
||||
% Genetic Algorithm Parameters
|
||||
popSize = 36; % Population size
|
||||
maxGen = 2000; % Maximum number of generations
|
||||
mutationRate = 0.1; % Mutation probability
|
||||
|
||||
% Initialize Population
|
||||
pop = rand(popSize, N) .* c; % Random initial solutions (0 <= x <= c)
|
||||
pop = normalizeSum2(pop, V); % Ensure sum of each solution equals V
|
||||
|
||||
newPop = zeros(popSize, N); % Pre-allocate new population buffer
|
||||
bestFitness = zeros(maxGen, 1); % Result array
|
||||
|
||||
% Genetic Algorithm Execution
|
||||
for gen = 1:maxGen
|
||||
% Fitness Calculation
|
||||
fitness = arrayfun(@(i) fitnessFunction(pop(i, :), t, a, c, V, travelTime), 1:popSize);
|
||||
|
||||
% Selection
|
||||
[~, idx] = sort(fitness); % Sort based on fitness (ascending order)
|
||||
pop = pop(idx, :); % Retain the best solutions
|
||||
|
||||
% Keep the best chromosome
|
||||
bestFitness(gen) = fitnessFunction(pop(1, :), t, a, c, V, travelTime);
|
||||
|
||||
% Crossover
|
||||
newPop(1:popSize/2, :) = pop(1:popSize/2, :); % Retain top half
|
||||
for i = 1:popSize/2
|
||||
parent1 = newPop(randi(popSize/2), :);
|
||||
parent2 = newPop(randi(popSize/2), :);
|
||||
crossPoint = randi(N);
|
||||
child = [parent1(1:crossPoint), parent2(crossPoint+1:end)];
|
||||
child = normalizeSum(child, V);
|
||||
newPop(popSize/2 + i, :) = child;
|
||||
end
|
||||
|
||||
% Mutation
|
||||
for i = 1:popSize
|
||||
if rand < mutationRate
|
||||
mutationIdx = randi(N);
|
||||
newPop(i, mutationIdx) = rand * c(mutationIdx);
|
||||
newPop(i, :) = normalizeSum(newPop(i, :), V);
|
||||
end
|
||||
end
|
||||
|
||||
% Replacement
|
||||
pop = newPop;
|
||||
end
|
||||
|
||||
% Results
|
||||
bestSolution = pop(1, :);
|
||||
disp('Best Solution [veh/min]:');
|
||||
disp(bestSolution);
|
||||
disp(['Best Objective Value: ', num2str(bestFitness(end)), ' [min]']);
|
||||
|
||||
figure('Name', 'Time over generations', 'NumberTitle', 'off');
|
||||
set(gcf, 'Position', [100, 100, 960, 640]); % Set the figure size
|
||||
plot(1:maxGen, bestFitness, '-b', 'LineWidth', 1);
|
||||
|
||||
% Customize the plot
|
||||
title(['Population = ', num2str(popSize), ' - Mutation = ', num2str(mutationRate)], 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
|
||||
xlabel('Generations') ;
|
||||
ylabel('T_{total}');
|
||||
|
||||
% save the figure
|
||||
print(gcf, ['figures/constV_pop_', num2str(popSize), 'mut_', num2str(mutationRate), '.png'], '-dpng', '-r300');
|
||||
|
||||
|
||||
% Fitness Function
|
||||
function T_total = fitnessFunction(x, t, a, c, V, travelTime)
|
||||
if abs(sum(x) - V) > 1e-6 || any(x < 0) || any(x > c)
|
||||
T_total = inf; % Infeasible solutions
|
||||
return;
|
||||
end
|
||||
|
||||
T = arrayfun(@(xi, ti, ai, ci) travelTime(xi, ti, ai, ci), x, t, a, c); % Apply function to all elements
|
||||
T_total = sum(T .* x); % Total traversal time
|
||||
end
|
@ -1,325 +0,0 @@
|
||||
%
|
||||
% Optimization Techniques Work 3 report
|
||||
%
|
||||
% authors:
|
||||
% Χρήστος Χουτουρίδης ΑΕΜ 8997
|
||||
% cchoutou@ece.auth.gr
|
||||
|
||||
|
||||
\documentclass[a4paper, 11pt]{AUTHReport}
|
||||
|
||||
% Document configuration
|
||||
\AuthorName{Χρήστος Χουτουρίδης}
|
||||
\AuthorAEM{8997}
|
||||
\AuthorMail{cchoutou@ece.auth.gr}
|
||||
|
||||
%\CoAuthorName{CoAuthor Name}
|
||||
%\CoAuthorAEM{AEM}
|
||||
%\CoAuthorMail{CoAuthor Mail}
|
||||
|
||||
% \WorkGroup{Ομάδα Χ}
|
||||
|
||||
\DocTitle{3η Εργαστηριακή Άσκηση}
|
||||
\DocSubTitle{Μέθοδος Μέγιστης Καθόδου με Προβολή}
|
||||
|
||||
\Department{Τμήμα ΗΜΜΥ. Τομέας Ηλεκτρονικής}
|
||||
\ClassName{Τεχνικές Βελτιστοποίησης}
|
||||
|
||||
\InstructorName{Γ. Ροβιθάκης}
|
||||
\InstructorMail{rovithak@auth.gr}
|
||||
|
||||
\CoInstructorName{Θ. Αφορόζη}
|
||||
\CoInstructorMail{taforozi@ece.auth.gr}
|
||||
|
||||
\CurrentDate{\today}
|
||||
|
||||
|
||||
\usepackage{enumitem}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{array}
|
||||
\usepackage{amssymb}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{commath}
|
||||
|
||||
\usepackage{float}
|
||||
\usepackage[labelformat=empty]{subcaption}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\InsertTitle
|
||||
|
||||
%\tableofcontents
|
||||
|
||||
\section{Εισαγωγή}
|
||||
Η παρούσα εργασία αφορά το πρόβλημα της ελαχιστοποίησης μιας δοσμένης συνάρτησης πολλών μεταβλητών $f: \mathbb{R}^n \rightarrow \mathbb{R}$ με περιορισμούς χρησιμοποιώντας τη μέθοδο μέγιστης καθόδου με προβολή.
|
||||
Η μέθοδος αυτή θα εκτελεστεί σε αντιπαραβολή με την αντίστοιχη μέθοδο χωρίς περιορισμούς από την προηγούμενη εργασία.
|
||||
Για το λόγο αυτό χρησιμοποιούμε των κώδικα της προηγούμενης εργασίας με κάποιες τροποποιήσεις, όπως θα δούμε και παρακάτω.
|
||||
|
||||
\subsection{Παραδοτέα}
|
||||
Τα παραδοτέα της εργασίας αποτελούνται από:
|
||||
\begin{itemize}
|
||||
\item Την παρούσα αναφορά.
|
||||
\item Τον κατάλογο \textbf{scripts/}, που περιέχει τον κώδικα της MATLAB.
|
||||
\item Το \href{https://git.hoo2.net/hoo2/OptimizationTechniques/src/branch/master/Work%203}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα της MATLAB, της αναφοράς και τα παραδοτέα.
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Προγραμματιστική προσέγγιση}
|
||||
Για τον προγραμματισμό και εκτέλεση των μεθόδων της παρούσας εργασίας έγινε χρήση της MATLAB.
|
||||
Στον κατάλογο \textbf{scripts}, περιέχονται όλες οι μέθοδοι και οι τεχνικές υπολογισμού βημάτων με τη μορφή συναρτήσεων καθώς και scripts που τις καλούν.
|
||||
Για κάθε ένα θέμα της εργασίας, υπάρχει το αντίστοιχο script που περιέχει τους υπολογισμούς, τις κλήσεις των μεθόδων και τη δημιουργία των διαγραμμάτων.
|
||||
Για το πρώτο θέμα το αρχείο Script\_1\_SteepDesc.m για το δεύτερο το Script\_2\_SteepDesc\_Proj.m και ούτω καθεξής.
|
||||
Η μέθοδος μέγιστης καθόδου (αρχείο: \textbf{method\_SteepDesc.m}) είναι η ίδια με αυτή της προηγούμενης εργασίας με τη μόνη διαφορά ότι τροποποιήθηκε ώστε η αντικειμενική συνάρτηση να δέχεται διάνυσμα ώς όρισμα και όχι δύο διαφορετικές μεταβλητές $x, y$.
|
||||
Αυτό ακολουθήθηκε και για την έκδοση με προβολή και φυσικά είχε αντίκτυπο και στις υπόλοιπες συναρτήσεις, όπως η κλίση ή ο Εσσιανός.
|
||||
Στην παρούσα εργασία η υλοποίηση του κώδικα ακολουθεί την προσέγγιση των προηγούμενων εργασιών.
|
||||
Πιο συγκεκριμένα.
|
||||
|
||||
\subsection{Μέθοδοι επιλογής βήματος}
|
||||
Εφόσον οι υπάρχουσες μέθοδοι επιλογής βήματος είναι ανεξάρτητες από την μέθοδο υπολογισμού του ελάχιστου και εφόσον χρησιμοποιούμε τον ίδιο κώδικά και στην παρούσα εργασία, αυτός ο τρόπος σχεδίασης παρέμεινε.
|
||||
Ουσιαστικά για κάθε ένα τρόπο υπολογισμού του $\gamma_k$, υπάρχει αντίστοιχη συνάρτηση, με κοινό interface.
|
||||
Αυτό έχει τη μορφή: \textit{\textbf{gamma\_<method>(f, grad\_f, dk, xk)}}, όπου το \textbf{f} είναι η αντικειμενική συνάρτηση, \textbf{grad\_f} η συνάρτηση κλίσης της, \textbf{dk} η τιμή της συνάρτησης κλίσης στο xk και \textbf{xk} το σημείο ενδιαφέροντος.
|
||||
Έτσι οι μέθοδοι αντιγράφηκαν και εδώ για ολότητα, ακόμα και αν για την παρούσα εργασία χρησιμοποιείται μόνο το σταθερό βήμα $\gamma_k$.
|
||||
|
||||
%\subsection{Symbolic expression functions}
|
||||
%Μία ακόμη προγραμματιστική τεχνική που ακολουθήθηκε είναι η χρήση \textbf{symbolic expression} για την αναπαράσταση της αντικειμενικής συνάρτησης.
|
||||
%Η εξήγηση υπάρχει και στις προηγούμενες εργασίες αλλά την παραθέτουμε εδώ για ολότητα.
|
||||
%Ο λόγος που επιλέχθηκε είναι η \textbf{δυνατότητα εξαγωγής ενός symbolic expression που αναπαριστά την κλίση $\nabla f$ και τον Εσσιανό $\nabla^2f$ μιας συνάρτησης} από την MATLAB, κάνοντας χρήση των εντολών \textit{gradient()} και \textit{hessian()}.
|
||||
%Αν αντίθετα χρησιμοποιούσαμε απλές συναρτήσεις, πολυώνυμα ή lambdas για την αναπαράσταση των αντικειμενικών συναρτήσεων, τότε για τον υπολογισμό της κλίσης και του Εσσιανού θα έπρεπε:
|
||||
%\begin{itemize}
|
||||
% \item Είτε να υπολογίζαμε αριθμητικά τις παραγώγους gradient και hessian μέσα στις μεθόδους, κάτι που θα εισήγαγε \textit{\textbf{αχρείαστο αριθμητικό σφάλμα}}.
|
||||
% \item Είτε να κάναμε χρήση δύο επιπλέων συναρτήσεων (ή πολυωνύμων) για την αναπαράσταση τους, κάτι που ουσιαστικά θα δημιουργούσε \textit{\textbf{πλεονασμό πληροφορίας εισόδου}} και άρα μεγαλύτερη πιθανότητα να κάνουμε λάθος.
|
||||
%\end{itemize}
|
||||
%Η αναπαράσταση όμως με χρήση symbolic expression είναι πιο “βαριά” όταν χρειάζεται να υπολογίσουμε την τιμή μιας συνάρτησης σε κάποιο σημείο (subs(expr, number)).
|
||||
%Αυτό είναι κάτι που χρειάζεται εκτενώς στον κώδικά μας.
|
||||
%Για το λόγο αυτό, ενώ η συνάρτηση δίνεται ως symbolic expression, μέσω αυτής υπολογίζονται αυτόματα η κλίση, ο Εσσιανός αλλά και οι “κανονικές” συναρτήσεις MATLAB που τις υλοποιούν.
|
||||
%Έτσι έχουμε την ακριβή αναπαράσταση της κλίσης και του Εσσιανού ως συναρτήσεις χωρίς να πληρώνουμε το κόστος της subs().
|
||||
|
||||
\section{Απεικόνιση της συνάρτησης}
|
||||
Η συνάρτηση με την οποία ασχολούμαστε στην παρούσα εργασία είναι η:
|
||||
\boldmath
|
||||
\begin{equation}
|
||||
f: \mathbb{R}^2 \rightarrow \mathbb{R}, f(x) = \frac{1}{3}{x_1}^2 + 3{x_2}^2, \quad x = \begin{bmatrix} x_1 & x_2 \end{bmatrix}^T
|
||||
\end{equation}
|
||||
\label{eq:ObjectiveFunction}
|
||||
Με \textbf{σύνολο περιορισμών} $X$:
|
||||
\[
|
||||
\forall x = \begin{bmatrix} x_1 & x_2 \end{bmatrix}^T \in X \subset \mathbb{R}^2: \quad -10 \leq x_1 \leq 5, \quad -8 \leq x_2 \leq 12
|
||||
\]
|
||||
\unboldmath
|
||||
Στο σχήμα \ref{fig:plot3dFunction} φαίνεται η τρισδιάστατη απεικόνιση της συνάρτησης.
|
||||
\InsertFigure{!h}{0.8}{fig:plot3dFunction}{../scripts/figures/Plot_Function.png}{Γραφική παράσταση της f}
|
||||
|
||||
Από το σχήμα μπορούμε πολύ εύκολα να διακρίνουμε ότι η συνάρτηση είναι κυρτή στο σύνολο των περιορισμών της εκφώνησης $ -10 \leq x_1 \leq 5 $ και $ -8 \leq x_2 \leq 12 $.
|
||||
Για να πάρουμε μια καλύτερη αίσθηση για τις κλίσεις της $f$, παρακάτω παραθέτουμε ένα γράφημα με τις ισοβαρείς καμπύλες της $f$.
|
||||
\InsertFigure{H}{0.8}{fig:plotContour}{../scripts/figures/Plot_Contour.png}{Ισοβαρείς της f}
|
||||
|
||||
Από το παραπάνω σχήμα \ref{fig:plotContour} φαίνονται και γραφικά οι μικρές κλίσης που παρουσιάζει η συνάρτηση κοντά στο ελάχιστο σημείο $(0,0)$.
|
||||
Τα διαγράμματα για τη μέθοδο δημιουργούνται εκτελώντας το αρχείο \textbf{Script\_0\_Plots.m}
|
||||
|
||||
\section{Θέμα 1 - Μέθοδος Μέγιστης Καθόδου χωρίς περιορισμούς}
|
||||
Εφαρμόζοντας την μέθοδο μέγιστης καθόδου από την προηγούμενη εργασία, με ακρίβεια $\epsilon = 0.001$, για τα βήματα $\gamma_k$ της εκφώνησης, παρατηρούμε ότι η μέθοδος συγκλίνει στο ελάχιστο για μικρά $\gamma_k$ ενώ \textbf{αποκλίνει για μεγάλα} \boldmath$\gamma_k > 0.33$\unboldmath.
|
||||
Από τις δοκιμές φαίνεται ότι το σημείο εκκίνησης δεν παίζει ρόλο και για αυτό επιλέξαμε να παραθέσουμε τα ευρήματά μας από το σημείο $(5,-5)$, για αντιπαραβολή με το επόμενο βήμα της εκφώνησης.
|
||||
\InsertFigure{H}{0.8}{fig:StDes_Iter_o_gamma_2}{../scripts/figures/StDes_Iter_o_gamma_1.png}{Αριθμός επαναλήψεων για διαφορετικές τιμές $\gamma_k$ [Μέγιστη Κάθοδος].}
|
||||
Επίσης παρατηρούμε ότι για μικρό \boldmath$\gamma_k = 0.1$ η σύγκλιση είναι ομαλή, ενώ για μεγάλο $\gamma_k = 0.3$ \unboldmath παρουσιάζει ταλάντωση κατά την σύγκλιση.
|
||||
Παρακάτω στο σχήμα \ref{fig:StDes_gamma} παραθέτουμε την πορεία σύγκλισης και απόκλισης για τις διαφορετικές τιμές του $\gamma_k$.
|
||||
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
% First row
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/StDes_gamma_0.1.png}
|
||||
\caption{$\gamma_k = 0.1$}
|
||||
\label{fig:StDes_gamma_0.1}
|
||||
\end{subfigure}
|
||||
\hfill
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/StDes_gamma_0.3.png}
|
||||
\caption{$\gamma_k = 0.3$}
|
||||
\label{fig:StDes_gamma_0.3}
|
||||
\end{subfigure}
|
||||
|
||||
% Second row
|
||||
\vspace{1em}
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/StDes_gamma_3.png}
|
||||
\caption{$\gamma_k = 3$}
|
||||
\label{fig:StDes_gamma_3}
|
||||
\end{subfigure}
|
||||
\hfill
|
||||
\begin{subfigure}{0.45\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\linewidth]{../scripts/figures/StDes_gamma_5.png}
|
||||
\caption{$\gamma_k = 5$}
|
||||
\label{fig:StDes_gamma_5}
|
||||
\end{subfigure}
|
||||
|
||||
\caption{Σύγκριση της μεθόδου Steepest descent για διαφορετικά $\gamma_k$}
|
||||
\label{fig:StDes_gamma}
|
||||
\end{figure}
|
||||
|
||||
\subsection{Μαθηματική ανάλυση}
|
||||
Τα παραπάνω αποτελέσματα επιβεβαιώνονται και θεωρητικά.
|
||||
Πιο συγκεκριμένα για τη σύγκλιση της μεθόδου μέγιστης καθόδου όπου το κάθε σημείο υπολογίζεται από την σχέση:
|
||||
\boldmath \[
|
||||
x_{k+1} = x_k - \gamma_k \nabla f(x_k)
|
||||
\]\unboldmath
|
||||
Πρέπει να ισχύουν:
|
||||
\begin{enumerate}
|
||||
\item H $f$ να είναι κυρτή.
|
||||
\item Η $f$ να είναι συνεχής και διαφορίσιμη και η κλίση της υπολογίσιμη.
|
||||
\item Για το βήμα υπολογισμού να ισχύει η σχέση:
|
||||
\boldmath
|
||||
\begin{equation} 0 < \gamma_k < \frac{2}{L} \label{eq:gammaLimmit} \end{equation}
|
||||
Όπου $L$ το άνω φράγμα της Lipschitz για την κλίση $\nabla f(x)$ (αν είναι γνωστή), η οποία είναι η μέγιστη ιδιοτιμή του Εσσιανού και δίνεται από τη σχέση:
|
||||
\begin{equation}
|
||||
L = \max_{x} \{\lambda_{max} (H(x))\}
|
||||
\label{eq:Lipschitz}
|
||||
\end{equation}
|
||||
\unboldmath
|
||||
\end{enumerate}
|
||||
\par
|
||||
Έτσι για τη δική μας περίπτωση, όπου η $f$ είναι κυρτή και διαφορίσιμη, η κλίση της $f(x)$ είναι:
|
||||
\[
|
||||
\nabla f(x) = \begin{bmatrix} \frac{\partial f}{\partial x1} \\ \frac{\partial f}{\partial x2} \end{bmatrix} = \begin{bmatrix} \frac{2}{3}x_1 \\ 6x_2 \end{bmatrix}
|
||||
\]
|
||||
Ο Εσσιανός πίνακας $H(x)$ της $f(x)$ είναι:
|
||||
\[
|
||||
H(x) =
|
||||
\begin{bmatrix}
|
||||
\frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1 \partial x_2} \\
|
||||
\frac{\partial^2 f}{\partial x_2 \partial x_1} & \frac{\partial^2 f}{\partial x_2^2}
|
||||
\end{bmatrix}
|
||||
=
|
||||
\begin{bmatrix}
|
||||
\frac{2}{3} & 0 \\ 0 & 6
|
||||
\end{bmatrix}
|
||||
\]
|
||||
Και εφόσον είναι διαγώνιος οι ιδιοτιμές του είναι οι τιμές της διαγωνίου. Δηλαδή:
|
||||
\[
|
||||
\det(H - \lambda I) = 0 \Leftrightarrow
|
||||
\det(\begin{bmatrix}\frac{2}{3} - \lambda & 0 \\ 0 & 6 - \lambda \end{bmatrix}) = 0 \Leftrightarrow
|
||||
\left(\frac{2}{3} - \lambda\right)(6 - \lambda) = 0 \Leftrightarrow
|
||||
\lambda_{\min} = \frac{2}{3}, \quad \lambda_{\max} = 6.
|
||||
\]
|
||||
Έτσι από τις εξισώσεις (\ref{eq:gammaLimmit}) και (\ref{eq:Lipschitz}) προκύπτει τελικά ότι $\frac{2}{L} = \frac{2}{\lambda_{max}} = \frac{1}{3}$ και επομένως για σύγκλιση της μεθόδου πρέπει να ισχύει:
|
||||
\boldmath
|
||||
\begin{equation}
|
||||
0 < \gamma_k < \frac{1}{3}
|
||||
\label{eq:gammaConvergence}
|
||||
\end{equation}
|
||||
\unboldmath
|
||||
Βλέπουμε ότι από την ανάλυσή μας, η τιμή που βρήκαμε εμπειρικά για την απόκλιση, από την εκτέλεση του αλγορίθμου για το $\gamma > 0.33$ επιβεβαιώνεται.
|
||||
\par
|
||||
Επίσης το γεγονός ότι ο Εσσιανός είναι διαγώνιος, μας δίνει επίσης πληροφορία ότι:
|
||||
\boldmath
|
||||
\begin{itemize}
|
||||
\item Η ιδιοτιμή $\lambda_1 = \frac{2}{3}$ εφαρμοσμένη στη σχέση (\ref{eq:gammaLimmit}) μας δίνει:
|
||||
\begin{equation} 0<\gamma_{k,x_1}<3 \label{eq:gammaLimmit_x1} \end{equation}
|
||||
που είναι η τιμή για την οποία η μέθοδος συγκλίνει στη διάσταση $x_1$
|
||||
\item Η ιδιοτιμή $\lambda_2 = 6$ εφαρμοσμένη στη σχέση (\ref{eq:gammaLimmit}) μας δίνει:
|
||||
\begin{equation} 0<\gamma_{k,x_2}<\frac{1}{3}\label{eq:gammaLimmit_x2} \end{equation}
|
||||
που είναι η τιμή για την οποία η μέθοδος συγκλίνει στη διάσταση $x_2$
|
||||
\end{itemize}
|
||||
\unboldmath
|
||||
|
||||
\par
|
||||
\underline{Εναλλακτικά} \\[0.5ex]
|
||||
Αν θέλαμε να βρούμε το κριτήριο σύγκλισης για το βήμα $\gamma_k$ ξεχωριστά για την κάθε διάσταση θα μπορούσαμε να θεωρήσουμε ισοδύναμα με την παραπάνω ανάλυση, πως για να συγκλίνει η μέθοδος θα πρέπει να ισχύει:
|
||||
\[
|
||||
\abs{\frac{x_{k+1}}{x_k}} < 1
|
||||
\]
|
||||
Από την παραπάνω εξίσωση προκύπτει πάλι ένα σύστημα εξισώσεων για την κάθε διάσταση:
|
||||
\[
|
||||
\left\{
|
||||
\begin{aligned}
|
||||
\abs{\dfrac{x_{1,k} - \frac{2}{3}\gamma_k x_{1,k}}{x_{1,k}}} < 1 \\
|
||||
\abs{\dfrac{x_{2,k} - 6\gamma_k x_{2,k}}{x_{2,k}}} < 1
|
||||
\end{aligned}
|
||||
\right.
|
||||
\Leftrightarrow
|
||||
\left\{
|
||||
\begin{aligned}
|
||||
\abs{1 - \frac{2}{3}\gamma_k} < 1 \\
|
||||
\abs{1 - 6\gamma_k} < 1
|
||||
\end{aligned}
|
||||
\right.
|
||||
\Leftrightarrow
|
||||
\left\{
|
||||
\begin{aligned}
|
||||
0 < \gamma_k < 3 \\
|
||||
0 < \gamma_k < \frac{1}{3}
|
||||
\end{aligned}
|
||||
\right.
|
||||
\]
|
||||
Που επιβεβαιώνει την προηγούμενη ανάλυσή μας για τη συνολική σύγκλιση, αλλά και για την κάθε διάσταση ξεχωριστά.
|
||||
|
||||
\section{Μέθοδος Μέγιστης Καθόδου με προβολή}
|
||||
Πριν περάσουμε στις υπόλοιπες απαιτήσεις της εργασίας θα θέλαμε να παραθέσουμε κάποιες πληροφορίες για την υλοποίηση της μεθόδου μέγιστης καθόδου με προβολή (αρχείο: \textbf{method\_SteepDesc\_Proj.m}).
|
||||
Η συνάρτηση αυτή δέχεται ως είσοδο την αντικειμενική συνάρτηση και την συνάρτηση κλίσης καθώς και το σημείο εκκίνησης $x_k$ και το βήμα $s_k$.
|
||||
Με τη βοήθεια της συνάρτησης \textit{ProjectionPoint()} \textbf{παίρνει πρώτα την προβολή} του $x_k$ στο διάστημα των περιορισμών, αν αυτό χρειάζεται, \textbf{και έπειτα εφαρμόζει τον αλγόριθμο}.
|
||||
Αυτό σημαίνει ότι μπορεί να χρησιμοποιηθεί και για σημεία εκκίνησης εκτός του συνόλου των περιορισμών.
|
||||
Ο αλγόριθμος είναι παρόμοιος με αυτόν της προηγούμενης εργασίας με τη διαφορά ότι η διεύθυνση $d_k$ επιλέγεται από τη σχέση:
|
||||
\[
|
||||
d_k = Pr_X\{ x_k - s_k \nabla f(x_k)\} - x_k = \bar{x_k} - x_k
|
||||
\]
|
||||
και τελικά έχουμε:
|
||||
\[
|
||||
x_{k+1} = x_k + \gamma_k d_k
|
||||
\]
|
||||
Δηλαδή εφαρμόζουμε πρώτα τη μέθοδο μέγιστης καθόδου με βήμα $s_k$ στην κατεύθυνση $-\nabla f$ και έπειτα προβάλουμε το σημείο στο σύνολο $X$ και χρησιμοποιούμε αυτό ως διεύθυνση με βήμα $\gamma_k$.
|
||||
\par
|
||||
Αξίζει να παρατηρήσουμε πως \textbf{αν το σημείο $x_k$ είναι εντός του συνόλου περιορισμών} τότε $\bar{x_k} = x_k$, δηλαδή η προβολή του σημείου στο σύνολο, είναι το ίδιο το σημείο.
|
||||
Έτσι:
|
||||
\[
|
||||
\begin{aligned}
|
||||
x_{k+1} & = x_k + \gamma_k \left( Pr_X\{ x_k - s_k \nabla f(x_k)\} - x_k \right) \\
|
||||
& = x_k + \gamma_k \left( ( x_k - s_k \nabla f(x_k) ) - x_k \right) \\
|
||||
& = x_k - \gamma_k s_k \nabla f(x_k) \\
|
||||
& = x_k - \gamma_k' \nabla f(x_k)
|
||||
\end{aligned}
|
||||
\]
|
||||
Βλέπουμε λοιπόν ότι για σημεία εσωτερικά του Χ, έχουμε ουσιαστικά τη μέθοδο της μέγιστης καθόδου με βήμα $\gamma_k' = \gamma_k s_k$.
|
||||
Εφόσον όμως για μη εφικτά σημεία, πριν εφαρμόσουμε τη μέθοδο, τα προβάλουμε στο σύνολο των περιορισμών Χ, βλέπουμε πως η \textbf{μέθοδος τελικά προσεγγίζει τη μέγιστη κάθοδο με βήμα $\gamma_k'$, που είναι και το βήμα για το οποίο ελέγχουμε αν ισχύουν τα κριτήρια σύγκλισης}.
|
||||
|
||||
\section{Θέμα 2 - Σημείο (5, -5), $s_k = 5, \gamma_k = 0.5$}
|
||||
Εφαρμόζοντας τη μέθοδο για ακρίβεια $\epsilon = 0.01$, $s_k = 5$ και $\gamma_k = 0.5$ έχουμε $\gamma_k' = 2.5 > \frac{1}{3}$, άρα το κριτήριο σύγκλισης δεν πληρείται.
|
||||
\InsertFigure{H}{0.8}{fig:StDesProj_sk_5_gamma_0.5}{../scripts/figures/StDesProj_sk_5_gamma_0.5.png}{Μέθοδος μέγιστης καθόδου με προβολή για $s_k = 5, \gamma_k = 0.5$.}
|
||||
|
||||
Παρατηρούμε πως ενώ η μέθοδος ταλαντώνει και δεν συγκλίνει στο ελάχιστο \textbf{όπως και η αντίστοιχη εκτέλεση της μέγιστης καθόδου χωρίς περιορισμούς με το ίδιο} \boldmath$\gamma_k$\unboldmath.
|
||||
Παρόλα αυτά όμως, η ταλάντωση λαμβάνει χώρα \textbf{εντός του συνόλου των περιορισμών} της εκφώνησης.
|
||||
|
||||
\section{Θέμα 3 - Σημείο (-5, 10), $s_k = 15, \gamma_k = 0.1$}
|
||||
Εφαρμόζοντας τη μέθοδο για ακρίβεια $\epsilon = 0.01$, $s_k = 15$ και $\gamma_k = 0.1$ έχουμε $\gamma_k' = 1.5 > \frac{1}{3}$, άρα το κριτήριο σύγκλισης δεν πληρείται και πάλι.
|
||||
\InsertFigure{H}{0.8}{fig:StDesProj_sk_15_gamma_0.1}{../scripts/figures/StDesProj_sk_15_gamma_0.1.png}{Μέθοδος μέγιστης καθόδου με προβολή για $s_k = 15, \gamma_k = 0.1$.}
|
||||
|
||||
Και εδώ παρατηρούμε πως ενώ το $\gamma_k$ έχει επιλεγεί θεωρητικά στο εύρος που οδηγεί σε σύγκλιση, το αντίστοιχο βήμα $s_k$ είναι πολύ μεγάλο, με αποτέλεσμα το γινόμενό τους $\gamma_k' = 15 * 0.1 = 1.5$ συνολικά να μην πληροί το κριτήριο $\gamma_k' < \frac{1}{3}$ και η μέθοδος να ταλαντώνει και πάλι.
|
||||
Αυτή τη φορά μόνο στον άξονα $x_2$.
|
||||
Αυτό βέβαια εξηγείται από την παραπάνω ανάλυσή καθώς βλέπουμε πως ενώ το γινόμενο 1.5 δεν πληροί τις προϋποθέσεις για σύγκλιση, πληροί όμως τις προϋποθέσεις της εξίσωσης (\ref{eq:gammaLimmit_x1}) με αποτέλεσμα να ταλαντώνει μόνο στον άξονα $x_2$.
|
||||
\par
|
||||
Αυτό φυσικά είναι αληθές και για την προηγούμενη περίπτωση όπου το $\gamma_k' = 5 * 0.5 = 2.5$ και όπου πάλι η σύγκλιση ήταν μερική, μόνο για την διάσταση $x_1$.
|
||||
|
||||
\section{Θέμα 4 - Σημείο (8, -10), $s_k = 0.1, \gamma_k = 0.2$}
|
||||
Αρχικά παρατηρούμε πως το σημείο \textbf{δεν είναι εφικτό}, καθώς είναι εκτός του συνόλου των περιορισμών της εκφώνησης.
|
||||
Αυτό βέβαια δεν μας αποτρέπει από την εφαρμογή της μεθόδου, καθώς αρχικά μπορούμε να προβάλουμε το σημείο στο σύνολο και να εφαρμόσουμε τη μέθοδο έπειτα.
|
||||
H προβολή του (8, -10) είναι $Pr_X\{(8, -10)\} = (5, -8)$, που είναι και το σημείο εκκίνησης του αλγορίθμου όπως φαίνεται και στο σχήμα \ref{fig:StDesProj_sk_0.1_gamma_0.2} παρακάτω.
|
||||
\par
|
||||
Ακόμα, αυτή τη φορά οι τιμές των βημάτων $s_k, \gamma_k$, έχουν επιλεγεί μέσα στο εύρος για το οποίο έχουμε σύγκλιση, καθώς: $\gamma_k' = 0.1 * 0.2 = 0.02 < \frac{1}{3}$, επομένως αναμένουμε η μέθοδος να συγκλίνει στο ελάχιστο.
|
||||
Εφαρμόζοντας τη μέθοδο για ακρίβεια $\epsilon = 0.01$ έχουμε:
|
||||
\InsertFigure{H}{0.8}{fig:StDesProj_sk_0.1_gamma_0.2}{../scripts/figures/StDesProj_sk_0.1_gamma_0.2.png}{Μέθοδος μέγιστης καθόδου με προβολή για $s_k = 0.1, \gamma_k = 0.2$.}
|
||||
Όπου βλέπουμε πως η μέθοδος συγκλίνει επιβεβαιώνοντας την παραπάνω ανάλυση.
|
||||
|
||||
\section{Συμπεράσματα}
|
||||
|
||||
Η μέθοδος μέγιστης καθόδου, με και χωρίς προβολή, παρουσιάζει τις αναμενόμενες συμπεριφορές σύγκλισης ανάλογα με την επιλογή του βήματος $\gamma_k$.
|
||||
Για την περίπτωση χωρίς προβολή, επιβεβαιώθηκε θεωρητικά και εμπειρικά ότι η μέθοδος συγκλίνει μόνο όταν το $\gamma_k$ βρίσκεται εντός του εύρους που ορίζεται από την ανάλυση της Lipschitz σταθεράς, δηλαδή $0 < \gamma_k < \frac{1}{3}$.
|
||||
Επιπλέον, παρατηρήθηκε πως για μεγαλύτερες τιμές$\gamma_k$ η μέθοδος αποκλίνει, όπως προβλέπεται από την μαθηματική ανάλυση.
|
||||
|
||||
Αντίστοιχα, για τη μέθοδο με προβολή, αποδεικνύεται πως το κριτήριο σύγκλισης εξαρτάται από τον συνδυασμό του $s_k$ (βήμα αντίθετο στην κατεύθυνση της κλίσης) και του $\gamma_k$ (βήμα κατά την προβολή).
|
||||
Η ανάλυση επιβεβαίωσε ότι η μέθοδος προσεγγίζει τη μέθοδο χωρίς προβολή για εφικτά σημεία, ενώ για μη εφικτά σημεία εξασφαλίζει ότι οι διαδοχικές προσεγγίσεις παραμένουν εντός των περιορισμών.
|
||||
|
||||
Τέλος, μέσα από τα παραδείγματα, αναδείχθηκε η σημασία της σωστής επιλογής των παραμέτρων $\gamma_k$ και $s_k$ για τη συνολική σταθερότητα και σύγκλιση της μεθόδου, καθώς και ο τρόπος με τον οποίο η ανάλυση των ιδιοτιμών του Εσσιανού επιτρέπει την καλύτερη κατανόηση της συμπεριφοράς της μεθόδου.
|
||||
|
||||
\end{document}
|
@ -1,19 +0,0 @@
|
||||
function [flag] = BelongsTo(x, SetLimmits)
|
||||
%Checks if the x vector belongs to Set
|
||||
%
|
||||
% x: A vector to project
|
||||
% SetLimmits: The set to project. Each line/dimension off the set has to contain the limits
|
||||
% of the set to that particular dimension
|
||||
% flag: True if belongs
|
||||
%
|
||||
flag = true; % Have faith
|
||||
|
||||
for i = 1:size(SetLimmits, 2)
|
||||
if x(i) < SetLimmits(i,1)
|
||||
flag = false;
|
||||
elseif x(i) > SetLimmits(i,2)
|
||||
flag = false;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -1,36 +0,0 @@
|
||||
% Given environment
|
||||
|
||||
clear;
|
||||
% Setup the function under test
|
||||
syms x [2 1] real;
|
||||
fexpr = (1/3)*x(1)^2 +3*x(2)^2;
|
||||
title_fun = "$f(x) = \frac{1}{3}{x_1}^2 + 3{x_2}^2$";
|
||||
|
||||
XSetLimmits = [-10, 5 ; -8, 12];
|
||||
|
||||
% Calculate the gradient and Hessian
|
||||
grad_fexpr = gradient(fexpr, x); % Gradient of f
|
||||
hessian_fexpr = hessian(fexpr, x); % Hessian of f
|
||||
|
||||
% Convert symbolic expressions to MATLAB functions
|
||||
fun = matlabFunction(fexpr, 'Vars', {x}); % Function
|
||||
grad_fun = matlabFunction(grad_fexpr, 'Vars', {x}); % Gradient
|
||||
hessian_fun = matlabFunction(hessian_fexpr, 'Vars', {x}); % Hessian
|
||||
|
||||
% Minimum reference
|
||||
[Xmin, Fmin] = fminsearch(fun, [-1, -1]');
|
||||
Xmin = round(Xmin, 3);
|
||||
Fmin = round(Fmin, 3);
|
||||
|
||||
% Amijo globals
|
||||
global amijo_beta; % Step reduction factor in [0.1, 0.5] (typical range: [0.1, 0.8])
|
||||
global amijo_sigma; % Sufficient decrease constant in [1e-5, 0.1] (typical range: [0.01, 0.3])
|
||||
|
||||
%fixed step size globals
|
||||
global gamma_fixed_step
|
||||
|
||||
global image_width,
|
||||
global image_height;
|
||||
|
||||
image_width = 960;
|
||||
image_height = 640;
|
@ -1,18 +0,0 @@
|
||||
function [x_p] = ProjectionPoint(x, SetLimmits)
|
||||
%Project the x vector to Set, returns a point of Set close(st) to x
|
||||
%
|
||||
% x: A vector to project
|
||||
% SetLimmits: The set to project. Each line/dimension off the set has to contain the limits
|
||||
% of the set to that particular dimension
|
||||
%x_p: The projected point
|
||||
%
|
||||
x_p = x;
|
||||
for i = 1:size(SetLimmits, 2)
|
||||
if x(i) < SetLimmits(i,1)
|
||||
x_p(i) = SetLimmits(i,1);
|
||||
elseif x(i) > SetLimmits(i,2)
|
||||
x_p(i) = SetLimmits(i,2);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -1,14 +0,0 @@
|
||||
% Define environment (functions, gradients etc...)
|
||||
GivenEnv
|
||||
|
||||
%
|
||||
% We plot the function in the domain of x,y in [-3, 3].
|
||||
% We also plot the contour in order to get a sense of the min and maximum
|
||||
% points in the x-y plane
|
||||
%
|
||||
|
||||
% 3d plot the function
|
||||
plot3dFun(fun, XSetLimmits(1, :), XSetLimmits(2, :), 100, title_fun, "figures/Plot_Function.png");
|
||||
|
||||
% Plot isobaric lines
|
||||
plotContour(fun, XSetLimmits(1, :), XSetLimmits(2, :), 100, title_fun, "figures/Plot_Contour.png");
|
@ -1,40 +0,0 @@
|
||||
% Define environment (functions, gradients etc...)
|
||||
GivenEnv
|
||||
|
||||
% Define parameters
|
||||
max_iter = 1000; % Maximum iterations
|
||||
tol = 0.001; % Tolerance
|
||||
|
||||
% Point x0 = (1, 1)
|
||||
% =========================================================================
|
||||
point = 1;
|
||||
x0 = [5, -5]';
|
||||
point_str = "[" + x0(1) + ", " + x0(2) + "]";
|
||||
f = fun(x0);
|
||||
gf = grad_fun(x0);
|
||||
hf = hessian_fun(x0);
|
||||
fprintf('Initial point (%d, %d), f = %f, grad = [%f;%f], hessian = [%f %f ; %f %f]=> Method applicable\n', x0, f, gf, hf);
|
||||
|
||||
|
||||
k = zeros(100, 1);
|
||||
j = 1;
|
||||
n = linspace(0.1, 1.5, 100);
|
||||
for g = n
|
||||
gamma_fixed_step = g;
|
||||
[~, ~, k(j)] = method_SteepDesc(fun, grad_fun, x0, tol, max_iter, 'fixed');
|
||||
j = j + 1;
|
||||
end
|
||||
plotItersOverGamma(n, k, "Iteration for different $\gamma$ values", "figures/StDes_Iter_o_gamma_" + point + ".png");
|
||||
|
||||
for g=[0.1, 0.3, 3, 5]
|
||||
gamma_fixed_step = g;
|
||||
|
||||
[x_fixed, f_fixed, kk] = method_SteepDesc(fun, grad_fun, x0, tol, max_iter, 'fixed');
|
||||
fprintf('Fixed step g=%f: Initial point (%f, %f), steps:%d, Final (x1,x2)=(%f, %f), f(x1,x2)=%f\n', g, x0, kk, x_fixed(:, end), f_fixed(end));
|
||||
if g <= 1
|
||||
plotPointsOverContour(x_fixed, fun, XSetLimmits(1, :), XSetLimmits(2, :), 100, point_str + ": Steepest descent $\gamma$ = " + gamma_fixed_step, "figures/StDes_gamma_" + g + ".png");
|
||||
else
|
||||
plotPointsOverContour(x_fixed, fun, [-500, 500], [-500, 500], 100, point_str + ": Steepest descent $\gamma$ = " + gamma_fixed_step, "figures/StDes_gamma_" + g + ".png");
|
||||
end
|
||||
end
|
||||
|
@ -1,32 +0,0 @@
|
||||
% Define environment (functions, gradients etc...)
|
||||
GivenEnv
|
||||
|
||||
% Settings
|
||||
max_iter = 1000; % Maximum iterations
|
||||
|
||||
% Define parameters
|
||||
% =========================================================================
|
||||
x0 = [5, -5]';
|
||||
gamma = 0.5;
|
||||
sk_step = 5;
|
||||
tol = 0.01; % Tolerance
|
||||
|
||||
|
||||
|
||||
point_str = "[" + x0(1) + ", " + x0(2) + "]";
|
||||
f = fun(x0);
|
||||
gf = grad_fun(x0);
|
||||
hf = hessian_fun(x0);
|
||||
fprintf('Initial point (%d, %d), f = %f, grad = [%f;%f], hessian = [%f %f ; %f %f]=> Method applicable\n', x0, f, gf, hf);
|
||||
|
||||
|
||||
gamma_fixed_step = gamma;
|
||||
[x_fixed, f_fixed, kk] = method_SteepDesc_Proj(fun, grad_fun, x0, sk_step, XSetLimmits, tol, max_iter, 'fixed');
|
||||
fprintf('Fixed step g=%f: Initial point (%f, %f), steps:%d, Final (x1,x2)=(%f, %f), f(x1,x2)=%f\n', gamma_fixed_step, x0, kk, x_fixed(:, end), f_fixed(end));
|
||||
plotPointsOverContour(x_fixed, fun, XSetLimmits(1, :), XSetLimmits(2, :), 100, point_str + ": Steepest descent proj $s_k$ = " + sk_step + ", $\gamma$ = " + gamma_fixed_step, "figures/StDesProj_sk_" + sk_step + "_gamma_" + gamma + ".png");
|
||||
|
||||
%[x_minimized, f_minimized, kk] = method_SteepDesc_Proj(fun, grad_fun, x0, sk_step, XSetLimmits, tol, max_iter, 'minimized');
|
||||
%fprintf('Minimized f: Initial point (%f, %f), steps:%d, Final (x1,x2)=(%f, %f), f(x1,x2)=%f\n', x0, kk, x_fixed(:, end), f_fixed(end));
|
||||
%plotPointsOverContour(x_fixed, fun, XSetLimmits(1, :), XSetLimmits(2, :), 100, point_str + ": Steepest descent minimized", "");
|
||||
|
||||
|
@ -1,27 +0,0 @@
|
||||
% Define environment (functions, gradients etc...)
|
||||
GivenEnv
|
||||
|
||||
% Settings
|
||||
max_iter = 1000; % Maximum iterations
|
||||
|
||||
% Define parameters
|
||||
% =========================================================================
|
||||
x0 = [-5, 10]';
|
||||
gamma = 0.1;
|
||||
sk_step = 15;
|
||||
tol = 0.01; % Tolerance
|
||||
|
||||
|
||||
|
||||
point_str = "[" + x0(1) + ", " + x0(2) + "]";
|
||||
f = fun(x0);
|
||||
gf = grad_fun(x0);
|
||||
hf = hessian_fun(x0);
|
||||
fprintf('Initial point (%d, %d), f = %f, grad = [%f;%f], hessian = [%f %f ; %f %f]=> Method applicable\n', x0, f, gf, hf);
|
||||
|
||||
|
||||
gamma_fixed_step = gamma;
|
||||
[x_fixed, f_fixed, kk] = method_SteepDesc_Proj(fun, grad_fun, x0, sk_step, XSetLimmits, tol, max_iter, 'fixed');
|
||||
fprintf('Fixed step g=%f: Initial point (%f, %f), steps:%d, Final (x1,x2)=(%f, %f), f(x1,x2)=%f\n', gamma_fixed_step, x0, kk, x_fixed(:, end), f_fixed(end));
|
||||
plotPointsOverContour(x_fixed, fun, XSetLimmits(1, :), XSetLimmits(2, :), 100, point_str + ": Steepest descent proj $s_k$ = " + sk_step + ", $\gamma$ = " + gamma_fixed_step, "figures/StDesProj_sk_" + sk_step + "_gamma_" + gamma + ".png");
|
||||
|
@ -1,27 +0,0 @@
|
||||
% Define environment (functions, gradients etc...)
|
||||
GivenEnv
|
||||
|
||||
% Settings
|
||||
max_iter = 1000; % Maximum iterations
|
||||
|
||||
% Define parameters
|
||||
% =========================================================================
|
||||
x0 = [8, -10]';
|
||||
gamma = 0.2;
|
||||
sk_step = 0.1;
|
||||
tol = 0.01; % Tolerance
|
||||
|
||||
|
||||
|
||||
point_str = "[" + x0(1) + ", " + x0(2) + "]";
|
||||
f = fun(x0);
|
||||
gf = grad_fun(x0);
|
||||
hf = hessian_fun(x0);
|
||||
fprintf('Initial point (%d, %d), f = %f, grad = [%f;%f], hessian = [%f %f ; %f %f]=> Method applicable\n', x0, f, gf, hf);
|
||||
|
||||
|
||||
gamma_fixed_step = gamma;
|
||||
[x_fixed, f_fixed, kk] = method_SteepDesc_Proj(fun, grad_fun, x0, sk_step, XSetLimmits, tol, max_iter, 'fixed');
|
||||
fprintf('Fixed step g=%f: Initial point (%f, %f), steps:%d, Final (x1,x2)=(%f, %f), f(x1,x2)=%f\n', gamma_fixed_step, x0, kk, x_fixed(:, end), f_fixed(end));
|
||||
plotPointsOverContour(x_fixed, fun, XSetLimmits(1, :), XSetLimmits(2, :), 100, point_str + ": Steepest descent proj $s_k$ = " + sk_step + ", $\gamma$ = " + gamma_fixed_step, "figures/StDesProj_sk_" + sk_step + "_gamma_" + gamma + ".png");
|
||||
|
Before Width: | Height: | Size: 91 KiB |
Before Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 131 KiB |
Before Width: | Height: | Size: 124 KiB |
Before Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 135 KiB |
Before Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 125 KiB |
Before Width: | Height: | Size: 130 KiB |
Before Width: | Height: | Size: 132 KiB |
@ -1,49 +0,0 @@
|
||||
function [a, b, k, n] = fmin_bisection(fun, alpha, beta, epsilon, lambda)
|
||||
% Bisection method for finding the local minimum of a function.
|
||||
%
|
||||
% fun: The objective function
|
||||
% alpha: (number) The starting point of the interval in which we seek
|
||||
% for minimum
|
||||
% beta: (number) The ending point of the interval in which we seek
|
||||
% for minimum
|
||||
% epsilon: (number) The epsilon value (distance from midpoint)
|
||||
% lambda: (number) The lambda value (accuracy)
|
||||
%
|
||||
% return:
|
||||
% a: (vector) Starting points of the interval for each iteration
|
||||
% b: (vector) Ending points of the interval for each iteration
|
||||
% k: (number) The number of iterations
|
||||
% n: (number) The calls of objective function fun_expr
|
||||
%
|
||||
|
||||
|
||||
|
||||
% Error checking
|
||||
if alpha > beta || 2*epsilon >= lambda || lambda <= 0
|
||||
error ('Input criteria not met')
|
||||
end
|
||||
|
||||
% Init
|
||||
a = alpha;
|
||||
b = beta;
|
||||
n = 0;
|
||||
|
||||
k=1;
|
||||
while b(k) - a(k) > lambda
|
||||
% bisect [a,b]
|
||||
mid = (a(k) + b(k)) / 2;
|
||||
x_1 = mid - epsilon;
|
||||
x_2 = mid + epsilon;
|
||||
|
||||
% set new search interval
|
||||
k = k + 1;
|
||||
if fun(x_1) < fun(x_2)
|
||||
a(k) = a(k-1);
|
||||
b(k) = x_2;
|
||||
else
|
||||
a(k) = x_1;
|
||||
b(k) = b(k-1);
|
||||
end
|
||||
end
|
||||
|
||||
end
|
@ -1,32 +0,0 @@
|
||||
function [gamma] = gamma_armijo(f, grad_f, dk, xk)
|
||||
% Calculates the best step based on amijo method
|
||||
%
|
||||
% f(xk+ γk*dk) ≤ f(xk) + σ * γk * dk^T * ∇f(xk)
|
||||
% γk = β*γk_0
|
||||
%
|
||||
% f: Objective function
|
||||
% grad_fun: Gradient function of f
|
||||
% dk: Current value of selected direction -∇f or -inv{H}*∇f or -inv{H + lI}*∇f
|
||||
% xk: Current point (x,y)
|
||||
|
||||
|
||||
% beta: beta factor in [0.1, 0.5]
|
||||
% signam: sigma factor in (0, 0.1]
|
||||
global amijo_beta
|
||||
global amijo_sigma
|
||||
|
||||
gf = grad_f(xk);
|
||||
gamma = 1; % Start with a step size of 1
|
||||
|
||||
% Perform Armijo line search
|
||||
while f(xk + gamma * dk) > f(xk) + amijo_sigma * gamma * dk * gf
|
||||
%while f(xk(1) + gamma * dk(1), xk(2) + gamma * dk(2)) > ...
|
||||
% f(xk(1), xk(2)) + amijo_sigma * gamma * norm(dk)^2
|
||||
gamma = amijo_beta * gamma; % Reduce step size
|
||||
if gamma < 1e-12 % Safeguard to prevent infinite reduction
|
||||
warning('Armijo step size became too small.');
|
||||
break;
|
||||
end
|
||||
end
|
||||
|
||||
end
|
@ -1,12 +0,0 @@
|
||||
function [gamma] = gamma_fixed(~, ~, ~, ~)
|
||||
% Return a fixed step
|
||||
%
|
||||
% This is for completion and code symmetry.
|
||||
%
|
||||
|
||||
global gamma_fixed_step
|
||||
|
||||
% Perform line search
|
||||
gamma = gamma_fixed_step;
|
||||
|
||||
end
|
@ -1,24 +0,0 @@
|
||||
function [gamma] = gamma_minimized(f, ~, dk, xk)
|
||||
% Calculates the step based on minimizing f(xk− γk*dk)
|
||||
%
|
||||
%
|
||||
% f: Objective function
|
||||
% ~: Gradient function of f - Not used
|
||||
% dk: Current value of selected direction -∇f or -inv{H}*∇f or -inv{H + lI}*∇f
|
||||
% xk: Current point (x,y)
|
||||
|
||||
% Define the line search function fmin(g) = f(xk - g * dk)
|
||||
fmin = @(g) f(xk) + g * dk;
|
||||
|
||||
% find g that minimizes fmin
|
||||
e = 0.0001;
|
||||
l = 0.001;
|
||||
[a,b,k,~] = fmin_bisection(fmin, 0.0001, 1, e, l); % g in (0, 1]
|
||||
gamma = 0.5*(a(k) + b(k));
|
||||
|
||||
% Define the line search function fmin(g) = f(xk - g * dk)
|
||||
%fmin = @(g) f(xk(1) - gamma * dk(1), xk(2) - gamma * dk(2));
|
||||
|
||||
% find g that minimizes fmin
|
||||
%gamma = fminbnd(g, 0, 1);
|
||||
end
|
@ -1,39 +0,0 @@
|
||||
function [x_vals, f_vals, k] = method_SteepDesc(f, grad_f, xk, tol, max_iter, mode)
|
||||
% f: Objective function
|
||||
% grad_f: Gradient of the function
|
||||
% xk: Initial point [x0; y0]
|
||||
% tol: Tolerance for stopping criterion
|
||||
% max_iter: Maximum number of iterations
|
||||
|
||||
% x_vals: Vector with the (x,y) values until minimum
|
||||
% f_vals: Vector with f(x,y) values until minimum
|
||||
% k: Number of iterations
|
||||
|
||||
if strcmp(mode, 'armijo') == 1
|
||||
gamma_f = @(f, grad_f, dk, xk) gamma_armijo(f, grad_f, dk, xk);
|
||||
elseif strcmp(mode, 'minimized') == 1
|
||||
gamma_f = @(f, grad_f, dk, xk) gamma_minimized(f, grad_f, dk, xk);
|
||||
else % mode == 'fixed'
|
||||
gamma_f = @(f, grad_f, dk, xk) gamma_fixed(f, grad_f, dk, xk);
|
||||
end
|
||||
|
||||
% Storage for iterations, begin with the first point
|
||||
x_vals = xk;
|
||||
f_vals = f(xk);
|
||||
for k = 1:max_iter
|
||||
% Check for convergence
|
||||
if norm(grad_f(xk)) < tol
|
||||
break;
|
||||
end
|
||||
dk = - grad_f(xk); % Steepset descent direction
|
||||
|
||||
gk = gamma_f(f, grad_f, dk, xk); % Calculate gamma
|
||||
|
||||
x_next = xk + gk * dk; % Update step
|
||||
f_next = f(x_next);
|
||||
|
||||
xk = x_next; % Update point
|
||||
x_vals = [x_vals, x_next]; % Store values
|
||||
f_vals = [f_vals, f_next]; % Store function values
|
||||
end
|
||||
end
|
@ -1,50 +0,0 @@
|
||||
function [x_vals, f_vals, k] = method_SteepDesc_Proj(f, grad_f, xk, sk, limmits, tol, max_iter, mode)
|
||||
% f: Objective function
|
||||
% grad_f: Gradient of the function
|
||||
% xk: Initial point [x0; y0]
|
||||
% sk: Step size (fixed positive scalar)
|
||||
% limits: Bounds of the feasible set for each dimension
|
||||
% tol: Tolerance for stopping criterion
|
||||
% max_iter: Maximum number of iterations
|
||||
|
||||
% x_vals: Vector with the (x,y) values until minimum
|
||||
% f_vals: Vector with f(x,y) values until minimum
|
||||
% k: Number of iterations
|
||||
|
||||
if strcmp(mode, 'armijo') == 1
|
||||
gamma_f = @(f, grad_f, dk, xk) gamma_armijo(f, grad_f, dk, xk);
|
||||
elseif strcmp(mode, 'minimized') == 1
|
||||
gamma_f = @(f, grad_f, dk, xk) gamma_minimized(f, grad_f, dk, xk);
|
||||
else % mode == 'fixed'
|
||||
gamma_f = @(f, grad_f, dk, xk) gamma_fixed(f, grad_f, dk, xk);
|
||||
end
|
||||
|
||||
% Project the first point if needed
|
||||
xk = ProjectionPoint(xk, limmits);
|
||||
|
||||
% Storage for iterations, begin with the first point
|
||||
x_vals = xk;
|
||||
f_vals = f(xk);
|
||||
for k = 1:max_iter
|
||||
% Check for convergence
|
||||
if norm(grad_f(xk)) < tol
|
||||
break;
|
||||
end
|
||||
dk = - grad_f(xk); % Steepset descent direction
|
||||
|
||||
% First calculate xk-bar and project it if nessesary
|
||||
xkbar = xk + sk * dk;
|
||||
xkbar = ProjectionPoint(xkbar, limmits);
|
||||
|
||||
dk = (xkbar - xk); % Steepest descent projection direction
|
||||
|
||||
gk = gamma_f(f, grad_f, dk, xk); % Calculate gamma
|
||||
|
||||
x_next = xk + gk * dk; % Update step
|
||||
f_next = f(x_next);
|
||||
|
||||
xk = x_next; % Update point
|
||||
x_vals = [x_vals, x_next]; % Store values
|
||||
f_vals = [f_vals, f_next]; % Store function values
|
||||
end
|
||||
end
|
@ -1,42 +0,0 @@
|
||||
function plot3dFun(fun, x_lim, y_lim, size, plot_title, filename)
|
||||
% 3D plots a function
|
||||
% fun: The function to plot
|
||||
% x_lim: The range for x axis. ex: [-2, 2]
|
||||
% y_lim: The range for y axis. ex: [0, 2]
|
||||
% size: The number of points for each axis
|
||||
% plot_title: The latex title for the plot
|
||||
%
|
||||
|
||||
global image_width,
|
||||
global image_height;
|
||||
|
||||
% Generate a grid for x and y
|
||||
x_space = linspace(x_lim(1), x_lim(2), size);
|
||||
y_space = linspace(y_lim(1), y_lim(2), size);
|
||||
[X, Y] = meshgrid(x_space, y_space);
|
||||
|
||||
% Evaluate the function on the grid
|
||||
for i = 1:size
|
||||
for j = 1:size
|
||||
% Pass each [x1; x2] as input to fun
|
||||
Z(i, j) = fun([X(i, j); Y(i, j)]);
|
||||
end
|
||||
end
|
||||
|
||||
% 3D plot
|
||||
figure('Name', 'f(x,y)', 'NumberTitle', 'off');
|
||||
set(gcf, 'Position', [100, 100, image_width, image_height]); % Set the figure size
|
||||
surf(X, Y, Z);
|
||||
|
||||
% Customize the plot
|
||||
xlabel('x1'); % Label for x-axis
|
||||
ylabel('x2'); % Label for y-axis
|
||||
zlabel('f(x, y)'); % Label for z-axis
|
||||
title(plot_title, 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
|
||||
colorbar;
|
||||
|
||||
% save the figure
|
||||
if strcmp(filename, '') == 0
|
||||
print(gcf, filename, '-dpng', '-r300');
|
||||
end
|
||||
end
|
@ -1,41 +0,0 @@
|
||||
function plotContour(fun, x_lim, y_lim, size, plot_title, filename)
|
||||
% plot the contour of a function
|
||||
% fun: The function to plot
|
||||
% x_lim: The range for x axis. ex: [-2, 2]
|
||||
% y_lim: The range for y axis. ex: [0, 2]
|
||||
% size: The number of points for each axis
|
||||
% plot_title: The latex title for the plot
|
||||
%
|
||||
|
||||
global image_width,
|
||||
global image_height;
|
||||
|
||||
% Generate a grid for x and y
|
||||
x_space = linspace(x_lim(1), x_lim(2), size);
|
||||
y_space = linspace(y_lim(1), y_lim(2), size);
|
||||
[X, Y] = meshgrid(x_space, y_space);
|
||||
|
||||
% Evaluate the function on the grid
|
||||
for i = 1:size
|
||||
for j = 1:size
|
||||
% Pass each [x1; x2] as input to fun
|
||||
Z(i, j) = fun([X(i, j); Y(i, j)]);
|
||||
end
|
||||
end
|
||||
|
||||
% Contour
|
||||
figure('Name', 'Contours of f(x1,x2)', 'NumberTitle', 'off');
|
||||
set(gcf, 'Position', [100, 100, image_width, image_height]); % Set the figure size
|
||||
contour(X, Y, Z);
|
||||
|
||||
% Customize the plot
|
||||
xlabel('x1'); % Label for x-axis
|
||||
ylabel('x2'); % Label for y-axis
|
||||
title(plot_title, 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
|
||||
colorbar;
|
||||
|
||||
% save the figure
|
||||
if strcmp(filename, '') == 0
|
||||
print(gcf, filename, '-dpng', '-r300');
|
||||
end
|
||||
end
|
@ -1,54 +0,0 @@
|
||||
function plotConvCompare(points_1, title_1, points_2, title_2, points_3, title_3, Min_point, plot_title, filename)
|
||||
% 3D plots a function
|
||||
% points: The points to plot
|
||||
% contur_fun: The function for contour plot
|
||||
% x_lim: The range for x axis. ex: [-2, 2]
|
||||
% y_lim: The range for y axis. ex: [0, 2]
|
||||
% size: The number of points for each axis
|
||||
% plot_title: The latex title for the plot
|
||||
% filename: The filename to save the plot (if exists)
|
||||
%
|
||||
|
||||
global image_width,
|
||||
global image_height;
|
||||
|
||||
distances_1 = sqrt((points_1(1, :) - Min_point(1)).^2 + (points_1(2, :) - Min_point(2)).^2);
|
||||
distances_2 = sqrt((points_2(1, :) - Min_point(1)).^2 + (points_2(2, :) - Min_point(2)).^2);
|
||||
distances_3 = sqrt((points_3(1, :) - Min_point(1)).^2 + (points_3(2, :) - Min_point(2)).^2);
|
||||
|
||||
|
||||
% 2D plot
|
||||
figure('Name', 'Convergence compare', 'NumberTitle', 'off');
|
||||
set(gcf, 'Position', [100, 100, image_width, image_height]); % Set the figure size
|
||||
title(plot_title, 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
|
||||
|
||||
% One
|
||||
subplot(3, 1, 1);
|
||||
plot(distances_1, '-o');
|
||||
% Customize the plot
|
||||
ylabel(title_1, 'Interpreter', 'none');
|
||||
xlabel('Step');
|
||||
grid on
|
||||
|
||||
% One
|
||||
subplot(3, 1, 2);
|
||||
plot(distances_2, '-o');
|
||||
% Customize the plot
|
||||
ylabel(title_2, 'Interpreter', 'none');
|
||||
xlabel('Step');
|
||||
grid on
|
||||
|
||||
% One
|
||||
subplot(3, 1, 3);
|
||||
plot(distances_3, '-o');
|
||||
% Customize the plot
|
||||
ylabel(title_3, 'Interpreter', 'none');
|
||||
xlabel('Step');
|
||||
grid on
|
||||
|
||||
|
||||
% save the figure
|
||||
if strcmp(filename, '') == 0
|
||||
print(gcf, filename, '-dpng', '-r300');
|
||||
end
|
||||
end
|
@ -1,28 +0,0 @@
|
||||
function plotItersOverGamma(gamma, iterations, plot_title, filename)
|
||||
% 3D plots a function
|
||||
% fun: The points to plot
|
||||
% contur_fun: The function for contour plot
|
||||
% x_lim: The range for x axis. ex: [-2, 2]
|
||||
% y_lim: The range for y axis. ex: [0, 2]
|
||||
% size: The number of points for each axis
|
||||
% plot_title: The latex title for the plot
|
||||
% filename: The filename to save the plot (if exists)
|
||||
%
|
||||
|
||||
global image_width,
|
||||
global image_height;
|
||||
|
||||
figure('Name', 'Iterations_over_gamma', 'NumberTitle', 'off');
|
||||
set(gcf, 'Position', [100, 100, image_width, image_height]); % Set the figure size
|
||||
plot(gamma, iterations, '*r', 'LineWidth', 2);
|
||||
|
||||
% Customize the plot
|
||||
title(plot_title, 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
|
||||
xlabel('\gamma') ;
|
||||
ylabel('Iterations');
|
||||
|
||||
% save the figure
|
||||
if strcmp(filename, '') == 0
|
||||
print(gcf, filename, '-dpng', '-r300');
|
||||
end
|
||||
end
|
@ -1,48 +0,0 @@
|
||||
function plotPointsOverContour(points, contour_fun, x_lim, y_lim, size, plot_title, filename)
|
||||
% 3D plots a function
|
||||
% points: The points to plot
|
||||
% contur_fun: The function for contour plot
|
||||
% x_lim: The range for x axis. ex: [-2, 2]
|
||||
% y_lim: The range for y axis. ex: [0, 2]
|
||||
% size: The number of points for each axis
|
||||
% plot_title: The latex title for the plot
|
||||
% filename: The filename to save the plot (if exists)
|
||||
%
|
||||
|
||||
global image_width,
|
||||
global image_height;
|
||||
|
||||
% Generate a grid for x and y
|
||||
x_space = linspace(x_lim(1), x_lim(2), size);
|
||||
y_space = linspace(y_lim(1), y_lim(2), size);
|
||||
[X, Y] = meshgrid(x_space, y_space);
|
||||
|
||||
% Evaluate the function on the grid
|
||||
for i = 1:size
|
||||
for j = 1:size
|
||||
% Pass each [x1; x2] as input to fun
|
||||
Z(i, j) = contour_fun([X(i, j); Y(i, j)]);
|
||||
end
|
||||
end
|
||||
|
||||
% 2D plot
|
||||
figure('Name', '(x1,x2) convergence', 'NumberTitle', 'off');
|
||||
set(gcf, 'Position', [100, 100, image_width, image_height]); % Set the figure size
|
||||
plot(points(1, :), points(2, :), '-or');
|
||||
hold on
|
||||
contour(X, Y, Z);
|
||||
% Customize the plot
|
||||
xlim(x_lim);
|
||||
ylim(y_lim);
|
||||
xlabel('x1'); % Label for x-axis
|
||||
ylabel('x2'); % Label for y-axis
|
||||
grid on
|
||||
|
||||
title(plot_title, 'Interpreter', 'latex', 'FontSize', 16); % Title of the plot
|
||||
colorbar;
|
||||
|
||||
% save the figure
|
||||
if strcmp(filename, '') == 0
|
||||
print(gcf, filename, '-dpng', '-r300');
|
||||
end
|
||||
end
|
@ -1,6 +1,3 @@
|
||||
% !TEX TS-program = xelatex
|
||||
% !TEX encoding = UTF-8 Unicode
|
||||
% !TEX spellcheck = el-GR
|
||||
%
|
||||
% Optimization Techniques Work 2 report
|
||||
%
|
||||
@ -9,7 +6,7 @@
|
||||
% cchoutou@ece.auth.gr
|
||||
|
||||
|
||||
\documentclass[a4paper, 11pt, mainlang=greek, english]{AUThReport}
|
||||
\documentclass[a4paper, 11pt]{AUTHReport}
|
||||
|
||||
% Document configuration
|
||||
\AuthorName{Χρήστος Χουτουρίδης}
|
||||
@ -30,10 +27,6 @@
|
||||
|
||||
\InstructorName{Γ. Ροβιθάκης}
|
||||
\InstructorMail{rovithak@auth.gr}
|
||||
|
||||
\CoInstructorName{Θ. Αφορόζη}
|
||||
\CoInstructorMail{taforozi@ece.auth.gr}
|
||||
|
||||
\CurrentDate{\today}
|
||||
|
||||
\usepackage{capt-of}
|
||||
@ -75,7 +68,7 @@
|
||||
\begin{itemize}
|
||||
\item Την παρούσα αναφορά.
|
||||
\item Τον κατάλογο \textbf{scripts/}, που περιέχει τον κώδικα της MATLAB.
|
||||
\item Το \href{https://git.hoo2.net/hoo2/OptimizationTechniques/src/branch/master/Work%202}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα της MATLAB, της αναφοράς και τα παραδοτέα.
|
||||
\item Το \href{https://git.hoo2.net/hoo2/OptimizationTechniques/src/branch/master/Work2}{σύνδεσμο} με το αποθετήριο που περιέχει όλο το project με τον κώδικα της MATLAB, της αναφοράς και τα παραδοτέα.
|
||||
\end{itemize}
|
||||
|
||||
\section{Προγραμματιστική προσέγγιση}
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB |