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