# tsp3.run model tsp.mod; #data germany_part.dat; data ger_part.dat; # szimetrikussá tesszük a távolságmátrixot for {i in V, j in V : i > j} { let d[i,j] := d[j,i]; } option solver cplex; # ne írjon ki semmit a CPLEX option solver_msg 0; option cplex_options "primalopt"; # szükséges adatszerkezetek param kov_csucs{V} >= 0, integer; param csucs >= 0, integer; param kcs >= 0, integer; param hanykor default 0; set T default V; param vege binary; let vege := 0; repeat while (vege = 0) { solve; # minden csucshoz a következő for {i in V} { let kov_csucs[i] := sum{j in V : j != i} j * x[i,j]; } # keressük meg az összes kiskört let T:=V; let hanykor := 0; repeat until card(T)=0 { for {i in T} { let kcs:=i; break;} let kiskorok := kiskorok + 1; let S[kiskorok] := {}; let csucs := kcs; repeat { let S[kiskorok] := S[kiskorok] union {csucs}; let csucs := kov_csucs[csucs]; } until (csucs = kcs); let T:=T diff S[kiskorok]; let hanykor := hanykor +1; } if (card(S[kiskorok]) >= n) then { # Hamilton kör, vége let vege := 1; printf "Hamilton kör: " } else { # kiírjuk a kisköröket amiket találtunk printf "Kiskörök: "; } for {j in 1..hanykor} { printf"%d. kör: ",j; for {i in S[kiskorok-j+1]} { printf "%d -> ", i ; } printf "..\n"; } } printf "A Hamilton körben megtett távolság: %f\n", distance;