From f3e817d9591666d69c21008b8f9e5703899451ff Mon Sep 17 00:00:00 2001
From: arzba <arzba>
Date: Sat, 26 Oct 2024 00:17:49 +0200
Subject: [PATCH] Taboo Search

---
 .vscode/launch.json  |  22 +++++++
 README.md            |  10 +++-
 bin/Algorithms.class | Bin 6166 -> 8613 bytes
 bin/Instance.class   | Bin 3608 -> 3814 bytes
 bin/Solution.class   | Bin 2504 -> 2953 bytes
 bin/cvrp_ls.class    | Bin 2000 -> 3268 bytes
 src/Algorithms.class | Bin 4195 -> 5088 bytes
 src/Algorithms.java  | 139 ++++++++++++++++++++++++++++++++++++++++---
 src/Instance.class   | Bin 2757 -> 3243 bytes
 src/Instance.java    |  14 ++---
 src/Solution.java    |  18 +++++-
 src/cvrp_ls.class    | Bin 1371 -> 2593 bytes
 src/cvrp_ls.java     |  41 +++++++++----
 13 files changed, 218 insertions(+), 26 deletions(-)
 create mode 100644 .vscode/launch.json

diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..19b9e6e
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,22 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "type": "java",
+            "name": "Current File",
+            "request": "launch",
+            "mainClass": "${file}"
+        },
+        {
+            "type": "java",
+            "name": "cvrp_ls",
+            "request": "launch",
+            "mainClass": "cvrp_ls",
+            "projectName": "optialgos_92db6011",
+            "args": ["C:\\Users\\Jule Behrens\\Documents\\JonahAlgos\\optialgos\\src\\instances\\Loggi-n401-k23.vrp", "taboo_search", "3600", "50"]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 4869a8f..c78d38a 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
 # Optimierungsalgorithmen für schwere Systeme WiSe 24/25
 ### Author: Jonah Schierding
 ## Problem Set 1 Aufgabe 4
+## Problem Set 2 Aufgabe 1
 
 
 
@@ -10,4 +11,11 @@ Im src-Ordner liegen die Quelldateien und kompilierten Dateien. Aufruf erfolgt d
 (TYPE : CVRP,
 EDGE_WEIGHT_TYPE : EXPLICIT,
 EDGE_WEIGHT_FORMAT : LOWER_ROW)
-zeigen muss.
\ No newline at end of file
+zeigen muss. 
+
+Das Programm gibt die Kosten für die Initial ermittelte Lösung mit einem Greedy-Approach und die mit basic local search ohne Zeitlimit optimierte Lösung und anschließend die Lösungen selbst im .sol Format aus.
+
+Alternativ kann ein Algorithmus spezifiziert werden mit "java cvrp_ls *absolutePath* *algorithm*". Dabei sind die Optionen für *algorithm* "basic_local_serach", "taboo_search" und "ant_colony".
+Für "taboo_search" und "ant_colony" muss zudem eine maximale Laufzeit für die Optimierung in vollen Sekunden angegeben werden ("java cvrp_ls *absolutePath* *algorithm* *maxTimeInSeconds*"). Für "basic_local_serach" ist das optional. 
+
+"taboo_search" kann optional ein weiterer Parameter mitgegeben werden: Die Anzahl der Taboos. Der Standardwert liegt bei *Anzahl der Knoten/3* abgerundet. Ein möglicher Aufruf wäre: "java cvrp_ls *absolutePath* taboo_search *maxTimeInSeconds* *numberOfTaboos*".
\ No newline at end of file
diff --git a/bin/Algorithms.class b/bin/Algorithms.class
index 8a02c8326f7828299319a119a016f9ad4dec6227..b6ae11b222029b818ae7893b44664a06c8973154 100644
GIT binary patch
literal 8613
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
G43YqT7AU3w

literal 6166
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
E0O(D{TL1t6

diff --git a/bin/Instance.class b/bin/Instance.class
index 8845f4076d27d4ca304ae85e83cfcec3ebd35e7e..bafb11695094f5ed66efed0095c51e5103634fca 100644
GIT binary patch
literal 3814
zcmX^0Z`VEs1_oP(ee4WOj0_x}dBr7(dC95l3@nTc0$GV=iTXK-dFlH8Nm;4MC5#Nb
zB}Jvl+0KatiOHEIm5dCGo{S8fDVe#cdBvIed5jD!d5O8Hj0{3P2(7^-MVWc&){G3?
zsVV8H;i;MF870Mx49wBdo{S8vdHE@+#f%K>(LR3pDXG?s46G@s1^Fe63~Vp~?)-w1
z%-qBr=lo)juuW!OW{Djm1G9!^7$XCVbAC!H7XvecC=Y`mgAgMFzfWdfs$XetQfg61
zVp0y+E&0ibIbn%KnIJw?kfkIevzU>A%LnFRYeoi94NO;q?BH^(NKP#%$;{6yW@nIP
zWDrL94KBmZAkWCa1D43l*LTazN#$aYV^9P+N{XF9nUO&dELU2RnWG<^oS2uFTExYm
z#GndNpvK4`2(=oj*IF|SB&)&0pvj=c$iR`8T2TV>7bAm+h9;&XIT&;p8Cd)reO<X2
z^cW1-8T3)&4iW)842BFwj0_yf`FSOYnR&&G4AM|b!4d47kysR*T3DKzmz-*?8O6b1
z!pOi5GE%`xfrG(}k%0kZwgnG^C4&_s1A9?wK~7?FDkFmnPD7B~iE22K1jK39oD7T%
zHarX*44fPcc8m<1E}p)we!-spejE%Aj0`+*u7Z^U7lRXn3p;}|EJVSM_slCvO;0W2
zVQ^(|V`N}2OUx-v^-p7DP)Bwg)Gp-kgX*&e8S25q;K|^{$iR`AR}uy?0Gz};K~D4G
zVPI!q<6!V(WZ-ai3~+Sz42k4m2w-I3hVc}v6hI1tco<kg3PTtfgk4?SUE{-DJ>5M*
z;)7kCLp=Tc*crG%s=|2~xEQ!O7$O-N7!^RF8qLEH!w}2Jz*=08lUahp+0mH6#=#KJ
z$ROnB@8TNo?C&4s0<#BXW+D$m5<@a016yigX<|+>TIz;mXKT$Uc7{|?(#cOr1-UGp
zhk=KImy02VArq7^vltm{kV6m_Tu3g#BcvI|!H~nqz~|!X>*$B%wiJdu9)^5|0!9YT
z;?xqC)ZE0p6h;OyY!-pCfgVE<4?{618?clVW#)1)lrl2#y0`}T!-Ey%-f|v>3Q+dv
z02^75Ujp(@6%PX+13w2t4I=}St|2H#)$uUYGc+(VaAzbI`@u66vxa6ANVbWGp&4Wd
zYjRG0aVjT6D?>XwLmO&dsw^%^&E;X}VCZCIU`{P6Vq_471V?7Ren3%XUP*9CQEFnY
zH3vgCBSW!co<eF-QGSs^esXeYQBi7&LSl(RW^O@#QHhR1K~8F7ajHUcMrv}lLS~vm
zWqxUqf?iosfkIklPO3s$X--;ZPEN5xNk*zdQEFmJZmMo_eqKr@xFk|Y%u4~w6eN~p
zC}b8ZB<B|ur6!l?aWV8V^s_Vc!OAIAckwVxV31;DU@rhUH7AdYL54w;gJCiw0}IGv
z4u+{9R&jm~2g7u5;aUt1$eBD00t{@R0GZ9hFbC}Q{L&H*hIxz(8h-f-dd2xUP&en7
z=A|g4fjkT;v=xf;b4o!D)?;T_z{nsAE(M{boL_#48%RC85M^ZG0r}h~KRFSkg^_^;
z#ARgQgNHDvV6|psU@wLgp^OZ|5Gmwx)tZrkB_**Wk&!_FRN<6^DjZ1OFJ@#A#*&Q~
z85lDe8Mr_-k#l~2QA#l*16v-r27#N8T*_E8GBBpXqa7>*_klGdgFM7Vxcq3%$iN$1
zl9-(Bn^*v@i`W@fFfy>Gr<VAEYfirO)DnM4*g+~hp7hib7eoaske*r+f?5ZIw74Qy
zt*jcF;L4Q)WGbY7<<!uG*RUXA7f2<`p`qymt#`SC^Gl18Q$Zoj$iNG$7WF_8#-PZ+
z$iU3Nz`)MH1S;Sd7#Ns9B_f#SVBiGPTnyY`numcGO!G1DgJ}T<HU<U;P<9k#5Mp3t
z5N2Rt&}U#|U}RumVAa~rAhHpxOpJknfekDuz#z`Rz`z4$voc69NHQ=mFfs@-NHH)m
zNHZ`nurM$($bgJtDQ4hcU}s=pvI7~jn?Wv8dpm=I?`{UANS*BrDt^lu*XwR$P`6@{
zWD(Nd#-KZsL0C(YMaWplbQ^>DRtD?kjQx@<LbhNTNsx>^SY`)<<2DBOtqk7F8S^Ds
zgnSY5{wVT+%NhM8S%iW?@{Fz!o3ymHFnF^hK**yEp-fvD!j?1GO0oz=Y-5PBVr4dC
zTh5@MwS^%}l64<Tf{`d2OM)b;D4P+)QvVh<Mo~6N)_n{A--8$^$s!cDjUi#?|NRg?
z)PlVXDO(xRmNVGEO_pS31{q?-rnQA3O_FUJgZplVlt@W7Nmdq+xFjnph}zDO5ezX%
zl0_&RZ14dHe>sCW9<z*~#%yEAg(>H-VqMN4Ajz_gp-`v<Y|<f^lpa`g2ZN&(E7&!x
z+Zf!9wlS1}9G@l$=51xDgs7He5vm63KBv2lp?2240Nrg2jmsHCd^a()2z6~^=-JI6
z6S<vX;(l=a3QZE4vW>wUHJTYT;YLjZMFs;nGN*wfYa2r$BxtuX%m7>P{~E*s9^Xw2
zvxMeuW9Zq)z|82zSj1S$Aj81Ic!BXU!+gdkOomJ*4D%V789?ds8G|JQ1A`y~3xfy)
zFM}w97=svtB!f7EJc9&-C4(eGB!d(~C4)3WGlL96Cxa}*Tn0IY1q|{GD;X3R)-xzF
zoMcd7xWb^!aEn2X;R%B(!z%_ghVKmO48IsO7?~L~8F?7A7<C!68I2j#8EqMK8J!vQ
z7~L2Q8T}cI7$X>r8FLs+7>gK88Os^W7^@ic7~2`F7<(D487DB<G0tMJXI#$Uz_^vc
zk#RSJHRDkRF~&0tu8bEL+!(JgxHH~i@L+tx;LZ4j!H4lLgD(>UgC7$cgFllRgD;aV
zLm-nOLlBcGLokyqLnt`kZDSAu<tS*rV_>plSP0I%yo`q#7BMVlU}6ws+{LhjVJQPM
zgFNFhhGh(#3@i*Q84MYgGpt}>Wmv<Y!LX8nje(7knZbZz6-bPche4fTHNzSPHb#F2
zWvEyLgA`P(oPn8PEyFqnR>oNjieNET#w!d03~L$IGcYlJVX%eR%lMbU1Y$1}8-oJG
zUM5op4v0F24Gatn$qeHE86+84*clkv8T8m0<k%UM7#RLA$g?x($;+$#W#D6H*vKgJ
zlYv*>LMV@&L578gL+cj<=YIxX1}2Cmkk0u6e;K49x>eDoI2afiHZf>nlw(^MtU)ed
z0;d;9ITis9PxNwZGlLfv%`?`Z6@t-NHE+SH*&AJR99GR+v1$%P*PMt|^EQU<SezY(
m?&lP&ns+el#G*M3U2{5C&AS+OW6@lRt~m><<~`tG-3tIcK2ie!

delta 2331
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

diff --git a/bin/Solution.class b/bin/Solution.class
index d942cbee86cf073aaa077abb18516db858c50190..2cf9957a6dd60cf27a03de8ecc06e93c2f4377c3 100644
GIT binary patch
delta 714
zcmX>h+$qj=>ff$?3=9mm46Pfv<}w?wmgEQL=WsB@F)}a+F|aV$2r;mN2sQ=>E(S)1
zWF7`_1_>bsb_N?p2IivFg2_vnjo7jna@ZNNC*Nh(X3J${n4#e_S)NsHvJOi%OC|?H
z!Q|B}G7&|L49tvN(HsmVAO@oj2SXVn0~2E`2SWuT0~cdZerZXnf-<8O2SXJ|fdV53
zLk&m)7Y9QfBLh35bAEA&0wW^>k7r(9YLRnJVsUY5F*`%!<c};`jLnl}SbZ5;H)pYC
zGjhr?Y-HeP*vX)<`5v1qqoOi{AcG2nDuXJ64ucwl1A{t)4}%&*7=tE5EQ1O|8iV#^
z7mio51`Iq5h72MMMhvnH#tcdfCJYt~#tbeDW(=MT=99fSUFsPbVi?RB7#VmO7#OV?
zm>D=27#LE7Vttrxmos>3%djNuVu)v8@X^}BAT47QX~nkBjFs7pWjTY4B%3IUk)O8i
z76#>A3<(SjKFb+ct=L;w7)4n`Sr`6)ti6jNk%7Udg^5uHq<P=M|68=RwlO5_Vn|_N
z@X_ADz{sG*U|P>$!Jxyy%plCbz@W##&A`9_a)b>72ZJqx5Q80q7J~zWDT5<}6@wjv
z3xg|zH-imBID<Pw5`zbW2m=Fy76S{&!3?4dVhjun%nXSPsSN%Mj0~&{K@8ChTntPM
zS_}dVMhu1w%nZg13=EMBY=0Rz*cm(-|1(H4u(Q`QFoHM?jEw9IrVI@K8H5?w*&$-=
z3@Q*&Ms^0B{|t<937BH0{|o{Q%uv-}+tU~r7?>E+88R3c7>pP=81fhx8S=qoA($)%
glciv?98Ahqf~jgSS<6t*z`y`Xj|~h>3@r?j0P7EMHUIzs

delta 261
zcmeAaKOxL@>ff$?3=9mm48<F{<}y#d$!x%uz>vhwkT{v2MVm2svNg**mUs?^w8?i_
zWVA9E8JHQlqB$6{KnzA54u%{?1}4T>Mg|_wyu8#R=bXgi;?!bxhWyEatXeFEj0|#<
z9a!Wh&t=tNWZ8U*HJg!Bo?#;cKf_K2#m#o?u8fK*41x@*45|!j3_1+z3=Rw$3_c9%
z3}Fmf46zKV3~3BHlb3M3k~L)DVK8D4VK8QpWiVk-VlZW}U@&2DVK8U#WU!dLn$yLS
znIVROfq{u3mLZOTfkBFag&~E3ks%dKrh~~$FqzGe%fP_E#lXmr$56mf#2^U(&DJmf

diff --git a/bin/cvrp_ls.class b/bin/cvrp_ls.class
index 4daff393d4b3346ed63729baf9cae5c3fe3ce26c..b881a47e3112097351bffd1753ab79d4097b2e25 100644
GIT binary patch
literal 3268
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
Q;9_88Sjw=RVI_kk08Tqgi2wiq

delta 1046
zcmX>id4Zqn)W2Q(7#J9A8Hy%yoz&xE5Mz*FXAoy(5X?#}OVrOv%uCnz%qvMvPc7nM
zkYtczWMD5#%qdOvPh(_IpX|sgJb4`pj~!HnHAuS*4}&a&93ulqW?o4cNGT%&vxcT8
zJA(ov1BYi`aY<rcaw->tJcAMs11p0vBZDZ&7+uXUb_P{O1}?{(^!%dCl8oG94hD5b
z2DbE~)YOzpE(R3_B@m&-!=TNeGx-*ijshox9)kfpgFYjJ0K%=omBl5gxjYPp3`Uc~
z7!^`Y7#X<T!A2;g<maVwF_<w}urru5G6;k9WajG!6lLa>1eX-0Cg$=mSb`kHUH}rx
z$phJE4YJRMkwHwuCpbT+v?Mb>&sr0~<Y2I4WC)+k!Qr5&rr?}kT%wR)P?DLOn4?e(
zRSoi~0}q2EgVW?UEXuAf3~uZUu8a&EFw=M#+(Dtmo}O9)(hpMZ$;03U65~rxE%ApK
z2a*zEU|{g!Ven<}n|y;=hEa2}Bddt0r>CY5*eBqa3N9(i%uBbPyq8taQV3I=k%2Q2
z7QBoM!nuhRL8W;mnYpQ+dBLg4`FSbDj0}vPla<&?!~@tF5>NvcZ1m*mY=&&94C(9)
zX_L>fX>#~7WH2(!(D0e8z$rIbmc3dtg@YlRk%5;{K}`XU85wvy^YT)QoO2S3i&Kl)
z8S)qzRG~W9nb{c%Cd+bm)-y&kurhEmFfcR-3Ht~M`!d;SF&p`4u^9Pku^R1Q5Z%Tg
zZMU3()rw^|gM6g+b_PWdOC?fBZ99X86{{qxB+E7iO)Iud47x(b+ZarDGpI!BfTY+Z
z*(KSwF<4n~fTV1<F_>;*&;=>B2MIe%a%^L8mSovh&)~6(!JC0$8-wXa21W)B1}O$v
z20;d91}+8$1}6pq1_lOJ24)5}1~vwE1`Y;J1|9}31_1_c1}O$!26+Zi22BQW1``Ge
z23rP623H0d27d-wh6n})h6DyhhI$4i25trhh8Tzk8T=Un7#J9s8EP2<8G;xX8Q2)A
z>KTF=f*6<>I2bAzLKs3Bm>Dz~!WqIC!Wmc?Oc;C^)EOceSQ%^?oEah+q8Qj1{22@x
zq8TC>*cl=iG#FwSq8K<BVi_11#2J|WGsrTqurtK5GsLqq#4|E5vNH%WGB7hFGB7YO
mF(ff0GcYi4FfcM?GB7e^G2}2XFmN$2axmmF<TDg9NCE)-vDY2|

diff --git a/src/Algorithms.class b/src/Algorithms.class
index 9e57c751a76bf2586fe1ab06ef7e25d2b8d58588..fb297dc91aaf997c811fb976fbe8cf4dc18fc6f2 100644
GIT binary patch
literal 5088
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

delta 2707
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

diff --git a/src/Algorithms.java b/src/Algorithms.java
index 4e77456..590b7d1 100644
--- a/src/Algorithms.java
+++ b/src/Algorithms.java
@@ -4,27 +4,142 @@ import java.util.Arrays;
 public class Algorithms {
 
     String algorithmType;
-
-    public Algorithms(String algorithmType){
+    int maxRuntimeInSeconds = -1;
+    int numberOfTaboos = -1;
+    public Algorithms(){}
+    public Algorithms(String algorithmType, String[] optionalParams) throws Exception{
         this.algorithmType = algorithmType;
-        if(algorithmType == null || algorithmType.equals("")){
-            this.algorithmType = "primitive_local_search";
+        try {
+            this.maxRuntimeInSeconds = Integer.valueOf(optionalParams[0]);
+        } catch (Exception e) {
+            
+        }
+        //checks if algorithm specific parameters are feasible and assigns them
+        switch (algorithmType) {
+            case "none":
+                this.algorithmType = "basic_local_search";
+                break;
+            case "ant_colony":
+                if(maxRuntimeInSeconds <= 0)
+                    throw new Exception();
+                break;
+            case "taboo_search":
+                try {
+                    this.numberOfTaboos = Integer.valueOf(optionalParams[1]);
+                } catch (Exception e) {
+                    
+                }
+                if(maxRuntimeInSeconds <= 0)
+                    throw new Exception();
+                if(this.numberOfTaboos <= 0)
+                    System.out.println("Using standard value for number of Taboos."
+                );
+                break;
+            default:
+                break;
         }
     }
 
     public Solution generateSolution(Instance instance){
-        return generateInitialSolutionGreedy(instance); 
+            switch (this.algorithmType) {
+                case "greedy":
+                    return generateInitialSolutionGreedy(instance);
+                case "ant_colony":
+                    return generateInitialSolutionAnt(instance);
+                default:
+                    return null;
+            }
     }
 
     public Solution generateSolution(Solution solution){
         switch (this.algorithmType) {
-            case "primitive_local_search":
+            case "basic_local_search":
                 return localSearch(solution);
+            case "greedy":
+                return generateInitialSolutionGreedy(solution.instance);
+            case "taboo_search":
+                if(this.numberOfTaboos <= 0)
+                    numberOfTaboos = solution.instance.getDimension()/3;
+                return tabooSearch(solution);
+            case "ant_colony":
+                return generateInitialSolutionAnt(solution.instance);
             default:
                 return null;
         }
     }
 
+    private Solution tabooSearch(Solution solution) {
+        int[] state = {2,0,0,0};
+        int newBestCount = 0;
+
+        Solution currentSolution = solution;
+        Solution bestSolutionSeen = solution;
+        
+        long start = System.currentTimeMillis();
+        long end = start + this.maxRuntimeInSeconds * 1000;
+        Solution possibleBetterNeighbor = getOtherNeighbor(state, bestSolutionSeen);
+        Solution currentBestNeighbor = possibleBetterNeighbor;
+
+        int currentBestNeighborNodeChanged = 2;
+        
+        ArrayList<Integer> taboos = new ArrayList<>();
+    
+        
+        while(maxRuntimeInSeconds > 0 && System.currentTimeMillis()<end){
+            if(possibleBetterNeighbor.getCost() < currentBestNeighbor.getCost()){
+                currentBestNeighbor = possibleBetterNeighbor;
+                currentBestNeighborNodeChanged = state[0];
+            }
+            //permutate state to get another neighbor which is not taboo
+            state[0]++;
+            while(taboos.contains(state[0])){
+                state[0]++;
+            }
+            if(state[0] > bestSolutionSeen.instance.getDimension()){
+                //System.out.println("reset extracted node");
+                state[0] = 2;
+                state[2]++;
+                if(state[2] > bestSolutionSeen.tours[state[1]].length-1){
+                    //System.out.println("reset position");
+                    state[2] = 0;
+                    state[1]++;
+                    if(state[1] > bestSolutionSeen.tours.length-1){
+                        //System.out.println("reset tours");
+                        state[1] = 0;
+                        state[3]++;
+                        //choose minimal after all neighbors are seen, update taboos, best solution see so far and current solution
+                        if(state[3] == 2){
+                            currentSolution = currentBestNeighbor;
+                            //System.out.println("Made a step, taboos: "+taboos.size());
+                            if(currentSolution.getCost() < bestSolutionSeen.getCost()){
+                                bestSolutionSeen = currentSolution;
+                                
+                                System.out.println("Found new best solution "+(++newBestCount) + ": All "+taboos.size()+" taboos dropped");
+                                taboos.clear();
+                            } else {
+                                taboos.add(currentBestNeighborNodeChanged);
+                                if(taboos.size() > numberOfTaboos){
+                                    taboos.remove(0);
+                                }
+                            }
+                            int[] help = {2,0,0,0};
+                            state = help;
+                            currentBestNeighbor = getOtherNeighbor(state, currentSolution);
+                        }
+                    }
+                }
+            }
+            possibleBetterNeighbor = getOtherNeighbor(state, currentSolution);
+        }
+        System.out.println("terminated by time limit");
+        return bestSolutionSeen;
+    }
+
+    private Solution generateInitialSolutionAnt(Instance instance) {
+        // TODO Auto-generated method stub
+        throw new UnsupportedOperationException("Unimplemented method 'generateInitialSolutionAnt'");
+    }
+
     //primitive greedy Approach
     private Solution generateInitialSolutionGreedy(Instance instance){
         Solution solution = new Solution(instance);
@@ -95,9 +210,17 @@ public class Algorithms {
         int[] state = {2,0,0,0};
         Solution possibleBetterSolution = getOtherNeighbor(state, currentBestSolution);
         int newBestCount = 0;
+        long start = System.currentTimeMillis();
+        long end = start + this.maxRuntimeInSeconds * 1000;
         //tries all neighbors as possibleBetterSolution, if better solution found, change currentBestSolution and search from there 
         //terminates when it cannot find a better solution in its neighbarhood
         while (possibleBetterSolution != null) {
+           
+            //stop if max execution time has exceeded
+            if(maxRuntimeInSeconds > 0 && System.currentTimeMillis()>end){
+                System.out.println("terminated by time limit");
+                break;
+            }
             if(possibleBetterSolution.getCost() < currentBestSolution.getCost()){
                 currentBestSolution = possibleBetterSolution;
                 int[] help = {2,0,0,0};
@@ -105,7 +228,6 @@ public class Algorithms {
                 possibleBetterSolution = getOtherNeighbor(state, currentBestSolution);
                 System.out.println("found new best solution "+(++newBestCount));
             }else{
-
                 //permutate state to get another neighbor
                 state[0]++;
                 if(state[0] > currentBestSolution.instance.getDimension()){
@@ -120,7 +242,9 @@ public class Algorithms {
                             //System.out.println("reset tours");
                             state[1] = 0;
                             state[3]++;
+                            //stop if all neighbors are worse/local optimum is reached
                             if(state[3] == 2){
+                                System.out.println("terminated by local optimum");
                                 break;
                             }
                         }
@@ -128,6 +252,7 @@ public class Algorithms {
                 } 
                 possibleBetterSolution = getOtherNeighbor(state, currentBestSolution);
             }
+            
         }
        
         
diff --git a/src/Instance.class b/src/Instance.class
index a7624a488152f0e44889372417d520df2ea64979..e4611d38b6f7a38653ccd053cf29daf15aa610b4 100644
GIT binary patch
delta 1365
zcmX>qx>}O!)W2Q(7#J8F8P;y(`p2xt#UR6w&cl$wAi>DMQc{$e%fXPv$iVC38sHxi
zAMENJ;_2_l#SqPq!^4ovkT+SCMV+x=vM-ASTM;7zldj?98kP?B)S@Cr22r2Mfvm!l
z<yhJ3iyiY6Qj3c6ixl#clS_+=Qd1NXOB6D53-XIfbQB75QWJ|)6_PVjld}~v(-bQ6
zON$ir%8CjU(lT>W71By`(lT>$iWN#SQWc6)6H{_ib(8b+QZh?2^Ye-o67y2PG6jhx
z848)j3d#9JMXAXpdRz=044v!@T|5lklYLlK>hl?xIT-pF8CXCjb1+N*v5NC^I2a}|
zGO#%37ng7{XfaITVVKI`z{tRzUr>^no0tO;Z(x|t!!U!Pg^__dzqEvdVHP8UhF`vd
zUU7a7)QS0}c_|8MApb%1DHP}Dl!Dx+2R1w<m2vVUR%QG7j10ojK3R!niTXK-dFlGW
zB}JKe>DG)4T&@+#sRbYn#f%K>>8T}tiMgqa41DRSCH@c-K`xnmjkS-FeR3+Bp%)X#
zoeT^NoD7T%tPE@nj103G7#L(37#SED7#LW!wlgqpWME)mWSGOi0G4K85CALXW?%v-
zWj?^b!NAVIz+^pnEt?GE`pKu*<QaP=zhaYT%$dx^F3;^F$s**jjX`=Qqtj#)_Cu`O
z7}A6?C;wpAR>{`g#vp3Nvi$#XE7s)<%n+U=i%{V<hQL`2hLSAX7}6%Yb7<EG=x$@E
zTFxNiyNRJ*sC64d`)-E($n6Y0`*$<2M`{c83iWSeP~FbJ>ARbOCsJoS1D~JnHU`0&
z3_5TlCxRTnAgLwEA~aD*c^iZ3Hionv4943SEVnXDUjF|w!~!1QO$^h7W^Q9>-^jqs
z7{b`V*vyd6z*5h6mhl2ZE#pHbJtjkjS_UR?SiEDfW?*0tWME+sVc=yDWe{T!V~}MK
zXHaI4V6bJ7WQb*uVyI=1W@u-SVd!O$Wmw1{$FQ0~o?#1v0>gd=MTVOU3Jmudlo_5f
zs4%=>P-S?>pvLf<L7kD6L4%QxL6cFOL5tCXL7UNzp<aj4kwKTyok5Q=gu#$8mcfWI
zjlr0)iot}jfx(=ynZcB?mBEa$gTacikHMO827?{rA_jZL^$ZS-dl?)V4>LG19%FD}
zJjvk7c$UGF@dASz<3$E{#+wWtj1L*S89y@kF#cljWnyITV`69UXHsVfVA5g;WYS{@
zVKQV0Vlv`m2xhWk2xXYdz`&5sAU?T(Q?Y&?<1YsFUkn^VzZqOvtJxXySy+EDm^1xn
zU}IonXV7A2kYQkCXQ&nU%OJtdz|PLVqk|#G!LWdVfq{jAks+UfkzpZ&1V-B1!l1bU
zE$u}xFfuG+u+hh&cJdlDwb2ZW42v0TKuRaS;}pwAq~JIPMusI28I;7ng~1iwkVFPX
zhNTS4K!%_x^+9)A3Iij<a)uQkrIYiy#2gUzr86)xtYlaPl0h@14Be0{21bU}3=9lR
G3~K-w-6&uH

delta 852
zcmZ22c~q3^)W2Q(7#J8F8Rl=~`o}EG!H~|#!0X}~;2#nn?CKoi>F>wI5Y3Ru!;r<0
zJ=u&!oiTTE9E*f_J|hE@t|1qL3_~FgLlJ`nBLhoGQD*Ms8kP>`{L+%i?5wiVGLCr)
zsYONkMGE=J$)!a_sVNGHB?_6j1^Gpjr?DDJ)iU(*F!V97F*5KM6lLa>1eYWxXNMFe
zCZ|reW7Afg%*Y@d?UR*QmZ+bTn3t{}TvC*omu}6-z@DC3;+L44I(Y?KA0yjjb9O@$
zb_PZURt9bcMuvU{24)ck4hD7x2FBZ3+Zh;lGq6W$Z)f22-Oa!gsk5Dd&rf$7gWycY
zHIvV?%QJRPe$Ot?m^qoBL!R4Hl10d48-w&rM*GQ@9EX^M(k5|gt7PbIV-U4sS^oc&
z73*>aW(ZG`MJR6@L*Oh1LrIox3<Z<@IkoG9b+<88EoTt$-NaBY)VhtKU1u9Z&qf9&
z#z4ke#s-EQ1{TIsjAt2Y8JHL*FfcG2V=!c3VBlw9VGv^AWe{c%V-R7GWe{ahW)Ner
zWe{hGWsqQ~WsqcOXOLp(WsqiA$RNY8nn9Lf3xgcPeg=7ln+$Rc_Zbu!o-!ygykJmf
zsDH<x!tk3xm64S}jggN*ol%@YgVBOPlhKYri_wumo6(&?hcS>rpD~KTfH9fDkg=S>
zh_RNzl(B)qn6Zh$gt3*ug0Y*yl5r}74dZ+UTgEjEc8t3i>=_R*I4~Y&aAG{h;LLc6
z!JY9egA3z123N*w3~r3K7(5szGB7ZBGYCy)<yJJB#Q2Lr{TBm=&~FA;)(Uop92VAJ
z4CYM#8Q2(@*cr6g8Dtn3*%@ki7#JC*Fi3!+YjPd8m;)$0*cceW1~D>BWv~IsFfcI4
zGBAQgS+%w>*sft<U|<9X9Ym=g10%yUh|<abxy7;(h6FM&GE8TffyEG?4QPghFfcOA
oWSE6TX)L<Za0W((*$i_)N+&n)h>0TXi(+78n9IPxz{D^Q0BcRGo&W#<

diff --git a/src/Instance.java b/src/Instance.java
index 784d940..4a1557c 100644
--- a/src/Instance.java
+++ b/src/Instance.java
@@ -13,8 +13,9 @@ public class Instance {
     private Node depot;
     private int optimalCost;
 
-    public  Instance(String fileLocation){
-        //import instance of cvrp from file at fileLocation, lower Marix of distances
+    public  Instance(){}
+    public  Instance(String fileLocation) throws Exception{
+        //import instance of cvrp from file at fileLocation and optimal solutioncost from sol file in same folder, lower Marix of distances
         try {
             File file = new File(fileLocation);
             Scanner scanner = new Scanner(file);
@@ -67,20 +68,19 @@ public class Instance {
               }
               scanner.close();
         } catch (FileNotFoundException e) {
-            System.out.println("An error occurred at import.");
-            e.printStackTrace();
+            System.err.println("An error occurred at import, please check if your .vrp file fulfills the readme-conditions and the path is correct.");
+            throw new Exception();
         }
         try {
             File file = new File(fileLocation.replace(".vrp", ".sol"));
             Scanner scanner = new Scanner(file);
             while (scanner.hasNextLine()) {
                 String data = scanner.nextLine();
-                if(data.contains("COST")) this.optimalCost = Integer.valueOf(data.replace("COST", "").trim());
+                if(data.contains("Cost")) this.optimalCost = Integer.valueOf(data.replace("Cost", "").trim());
               }
               scanner.close();
         } catch (FileNotFoundException e) {
-            System.out.println("An error occurred at import.");
-            e.printStackTrace();
+            System.out.println("No .sol file found for optimal solution.");
         }
     }
 
diff --git a/src/Solution.java b/src/Solution.java
index cdf5823..9d53c54 100644
--- a/src/Solution.java
+++ b/src/Solution.java
@@ -23,7 +23,6 @@ public class Solution {
                     }
                     lastNode = node;
                 } catch (Exception e) {
-                    // TODO: handle exception
                    
                 }
                 
@@ -55,4 +54,21 @@ public class Solution {
         copy.tours = toursCopy;
         return copy;
     }
+
+    public String toSol(){
+        String rep = "";
+        for (int i = 0; i < tours.length; i++) {
+           rep += "Route #"+(i+1)+":"; 
+           for (Node node : tours[i]) {
+            try {
+                rep += " "+node.number;
+            } catch (Exception e) {
+                
+            }              
+           } 
+           rep += "\n";
+        }
+        rep += "Cost " + this.getCost();
+        return rep;
+    }
 }
\ No newline at end of file
diff --git a/src/cvrp_ls.class b/src/cvrp_ls.class
index aac62dc9d75652f282e88028984eb0c6e8dacd02..98308e98a6a7e534721ee16364b6e19e9714c6e5 100644
GIT binary patch
literal 2593
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

delta 665
zcmZ1|a+{0m)W2Q(7#J8F8G<KrnVPUOa4|9nXC;;;>gOcprR%#^B&QaXWaj6wGw?7n
zaCqhwmn7yTr*biHGw|^+urly7GKfyxDB=*t&LGIhz~z{eo?nz%l95}?#UQ}I3?f8$
z7(^Mw7#U>KQ}a@b5=&A&^D;{^6LW&|b4o!5yBDRVrc_Rz%_OP7$soZX$<83f!ywHd
z!^j|ja7J)taY<_KWHCks897D<ZipU*l>EF@E(Qe#MRo=y9tLFw{>e3r3KAeoRe2cH
z7}OaVxO4K86LW%76N{2FCZA`L<N`TdlZQczL3{FEW@Q6i20eBLeI5n_217;$4w#b|
z8Q9ZPOPuqIOBflLH8eei7#J9gc^FI>OeZTc%P?w8+$cObmPMS=d~zvED61VKgK+fZ
z1QroShsjS^0;Sy;8Q2)rK#-q}!GnvzlfjFf!5gIAXL1nRWfp%%2Gz-RY^u!c41tpa
z*>#1@7?>D9fQf;Tft7)cfsw&t@<evAdP@cdFpq(OnSqnRiou$JiNS(_fngm33j-Si
z1B0&+yN?#Lk<W4l7T?_r+>zSb8F+nnGYCX(XAtt!)!D`%Y{jyPL0m|78-u*AB+E7i
z6)V<F4B|T57&JgU9ZA-03_80Qj2IZUG01OZU}RusU}xZB;ACK809jq7$H2|Nz`zO?
z21#%+a4>K)@H2=o2r|ep2r(!#2s3Cih%p#5NHX{^NHN$jFfa%+F#TuXVqjutuw`ek
zXJBM!-~^>D1_l-eMg~p>W(Fq)1_mYuX9gDr1_llWMh15VMg~^~Uj_ySE(S&hKZXE?
HAO=YQ>Lzm%

diff --git a/src/cvrp_ls.java b/src/cvrp_ls.java
index 0a12a27..481c199 100644
--- a/src/cvrp_ls.java
+++ b/src/cvrp_ls.java
@@ -3,33 +3,54 @@
 public class cvrp_ls {
     public static void main(String[] args) throws Exception {
         String fileLocation = "";
-        String algorithm ="";
-        int maxRuntimeInSeconds = -1;
+        String algorithm ="none";
+        String[] optionalParams = new String[args.length-2];
+        System.arraycopy(args, 2, optionalParams, 0, args.length-2);
+
         try {
             fileLocation = args[0];
             algorithm = args[1];
-            maxRuntimeInSeconds = Integer.valueOf(args[2]);
-
         } catch (Exception e) {
-            
+            System.out.println("Something seems to be wrong with the given parameters");
+           
         }
 
 
             
   
         //create new instance from file
-        Instance instance = new Instance(fileLocation);
+        Instance instance = new Instance();
+        try {
+            instance = new Instance(fileLocation);
+        } catch (Exception e) {
+            System.err.println("Import of instance failed critically");
+            e.printStackTrace();
+            System.exit(1);
+        }
+        
         //create initial Greedy Solution
-        Algorithms greedy = new Algorithms("greedy");
+        Algorithms greedy = new Algorithms("greedy", optionalParams);
         Solution greedySolution = greedy.generateSolution(instance);
         System.out.println("Greedy done");
 
         //optimize with chosen algorithm
-        Algorithms chosen = new Algorithms(algorithm);
+        Algorithms chosen = new Algorithms();
+        try {
+            chosen = new Algorithms(algorithm, optionalParams);
+        } catch (Exception e) {
+            System.err.println("Not all parameters for this algorithm seem to be right");
+        }
+        
         Solution optimizedSolution = chosen.generateSolution(greedySolution);
 
         //print results
-        System.out.println("Instance name"+" & "+"Cost initial Solution"+" & "+"Cost optimized solution"+" & " + "Cost optimal solution");
-        System.out.println(instance.getName()+" & "+greedySolution.getCost()+" & "+optimizedSolution.getCost()+" & "+instance.getOptimalCost());
+        System.out.println(("\nAfter initial greedy Approach, optimized with "+chosen.algorithmType+" with a maximum runtime of approximately "+chosen.maxRuntimeInSeconds+" seconds!").replace("-1", "unlimited"));
+        System.out.println("Instance name"+" & "+"Cost initial Solution"+" & "+"Cost optimized solution ("+chosen.algorithmType+")"+" & " + "Cost optimal solution (100%)"+ "   \\\\");
+        if(instance.getOptimalCost() > 0)
+            System.out.println(instance.getName()+" & "+greedySolution.getCost()+" ("+(float)greedySolution.getCost()/(float)instance.getOptimalCost()*100+"%) & "+optimizedSolution.getCost()+" ("+(float)optimizedSolution.getCost()/(float)instance.getOptimalCost()*100+"%) & "+instance.getOptimalCost() + "   \\\\");
+        else
+            System.out.println(instance.getName()+" & "+greedySolution.getCost()+" & "+optimizedSolution.getCost()+" & "+ "   \\\\");
+        System.out.println("\n Initial solution:\n"+greedySolution.toSol());
+        System.out.println("\n Optimized solution:\n"+optimizedSolution.toSol());
     }
 }
-- 
GitLab