!@encoding CP1250 model VRP uses "mmxprs"; !gain access to the Xpress-Optimizer solver !sample declarations section declarations ! ... pracd=8!pracovní doba řidiče v hodinách (včetně pauzy) obs=0.70!maximální využití kapacity vozidla (v procentech) klec=1.2!objem jedne klece (metr krychlový) barel=0.3!objem jednoho barelu (metr krychlový) rohoz=0.12!objem jedne rohoze (metr krychlový) pradlo=100!počet kusů prádla v kleci M=10000!prohibitivní konstanta n=16!počet obsluhovaných vrcholů v=3!počet vozidel vrch=1..n depo=0..n voz=1..v N:array(vrch)of real!množina obsluhovaných vrcholů N0:array(depo)of real!množina obsluhovaných vrcholů včetne depa V:array(voz)of real!množina vozidel d:array(depo,depo)of real!distancni matice (km) t:array(depo,depo)of real!distancni matice (min) s:array(depo)of real!doba obsluhy vrcholu (min) a:array(vrch)of real!požadavky vrcholu (prádlo ks) b:array(vrch)of real!požadavky vrcholu (kontejnery na utěrky ks) c:array(vrch)of real!požadavky vrcholu (rohože ks) q:array(voz)of real!kapacity vozidel (metr krychlový) f:array(vrch)of real!zacatek provozni doby (min) h:array(vrch)of real!konec provozní doby (min) l:array(voz)of mpvar!proměnná - počet klecí na prádlo x:array(depo,depo,voz)of mpvar!proměnná y:array(vrch,voz)of mpvar!proměnná z:array(depo,voz)of mpvar!proměnná end-declarations N::[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] N0::[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] V::[1,2,3] d::[0,17,12,20,37,29,28,38,27,24,22,32,35,28,28,30,23, 17,0,4,5,34,16,15,25,22,12,12,19,30,22,16,24,11, 12,5,0,5,37,19,18,28,25,15,15,22,33,24,19,27,13, 19,5,5,0,36,18,17,27,24,13,14,20,32,23,15,26,10, 37,36,38,38,0,13,14,15,14,17,25,16,15,7,26,6,24, 26,15,17,16,13,0,3,12,3,4,7,9,10,8,14,10,11, 27,15,18,16,13,2,0,10,3,4,7,6,10,9,13,10,11, 37,25,28,27,16,12,9,0,9,13,14,6,6,18,18,18,20, 27,22,25,24,14,3,3,9,0,7,11,8,8,6,16,8,14, 24,12,14,13,17,6,5,14,7,0,3,10,14,12,12,14,7, 22,12,14,14,23,9,8,19,11,4,0,10,19,14,10,16,5, 33,21,23,21,17,8,6,6,8,10,11,0,8,14,14,16,15, 35,32,35,34,15,10,10,8,8,13,19,8,0,14,21,14,20, 28,22,25,24,7,8,9,17,6,12,14,14,14,0,21,3,18, 28,16,18,15,26,15,13,18,15,12,10,13,21,22,0,23,9, 28,24,27,26,6,10,11,17,8,13,17,16,14,3,23,0,21, 19,7,9,6,24,13,12,21,14,8,6,16,21,19,10,21,0] t::[0,16,14,18,42,36,32,35,31,25,21,35,43,39,30,41,23, 18,0,7,7,36,27,23,27,24,16,13,26,36,31,21,33,15, 17,8,0,7,41,30,27,32,28,20,18,29,40,33,24,35,18, 19,7,8,0,38,28,25,28,25,18,15,27,37,30,22,33,15, 42,38,41,39,0,23,22,16,16,27,29,19,21,12,34,11,29, 33,23,26,7,25,0,11,19,10,9,15,18,20,17,27,21,17, 30,20,23,21,24,8,0,11,9,7,7,9,20,18,24,22,13, 35,26,30,27,19,17,10,0,12,17,23,6,13,24,19,24,20, 33,24,28,25,16,12,10,11,0,15,15,13,16,6,28,16,16, 26,16,19,15,28,15,11,20,15,0,7,19,26,21,20,24,9, 23,14,18,15,28,19,15,23,16,8,0,22,28,20,18,22,7, 40,29,31,29,19,16,8,6,12,15,20,0,14,22,20,23,21, 43,35,38,35,20,20,19,12,14,25,27,13,0,25,28,26,27, 41,30,33,31,12,17,21,18,10,21,21,19,22,0,34,7,23, 31,21,23,21,31,30,22,19,25,20,17,17,27,34,0,36,13, 41,34,37,34,10,20,24,21,14,25,25,22,25,5,37,0,26, 18,8,11,8,31,23,19,23,18,12,9,21,29,25,16,27,0] s::[0,5,5,5,10,5,10,35,50,30,10,20,20,5,5,10,5] a::[10,0,30,17,0,0,4,25,22,11,0,17,0,0,7,0] b::[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0] c::[0,4,1,2,2,2,22,13,8,2,7,3,1,1,3,1] q::[13.2,14.3,26.4] f::[120,180,0,60,150,240,300,300,120,60,300,180,120,180,60,0] h::[600,600,480,600,600,600,600,570,540,570,600,600,600,600,570,600] forall(j in vrch)sum(i in depo,k in voz)x(i,j,k)=1 forall(j in vrch,k in voz) sum(i in depo| i<>j) x(i,j,k)=sum(i in depo| i<>j) x(j,i,k) forall (k in voz) sum (j in vrch) x(0,j,k)<=1 forall (k in voz) sum (i in vrch) x(i,0,k)<=1 forall (k in voz) sum(i in vrch,j in depo) ((a(i)*x(i,j,k))/pradlo) <=l(k) forall (k in voz) sum (i in vrch, j in depo) ((a(i)*x(i,j,k))/pradlo) >= l(k)-0.999 forall (k in voz) (l(k)*klec) + sum (i in vrch, j in depo) (b(i)*x(i,j,k)*barel + c(i)*x(i,j,k)*rohoz)<=q(k)*obs forall (i in vrch,j in vrch, k in voz) y(i,k)-y(j,k)+n*x(i,j,k)<=n-1 forall(j in vrch,k in voz) z(j,k)>=f(j)*sum(i in depo| i<>j) x(i,j,k) forall(j in vrch, k in voz) z(j,k) + s(j)*sum(i in depo| i<>j)x(i,j,k)<=h(j)*sum(i in depo| i<>j)x(i,j,k) forall (i in vrch,j in vrch, k in voz) z(i,k)+(s(i)+t(i,j))*x(i,j,k)<=z(j,k)+M*(1-x(i,j,k)) forall(k in voz) sum(i in depo,j in depo| i<>j) t(i,j)*x(i,j,k)+sum(i in depo, j in depo| i<>j)s(j)*x(i,j,k)<=pracd*60 forall (i in depo,j in depo, k in voz) x(i,j,k)is_binary forall(i in vrch,k in voz) y(i,k)>=0 forall(k in voz) l(k) is_integer forall(i in depo,k in voz) z(i,k)>=0 forall(k in voz) z(0,k)=0 ujeta_vzdalenost:=sum(i in depo, j in depo, k in voz| i<>j) d(i,j)*x(i,j,k) minimize (ujeta_vzdalenost) writeln("Minimalni ujeta vzdalenost je: ", getobjval," km") forall(k in voz) do writeln("Vozidlo ",k," obsluhuje vrcholy:") forall(i in vrch) do if(getsol(x(0,i,k))>0) then pr:=a(i) ut:=b(i) ro:=c(i) writeln(0, " -> ", i) p:=i repeat w:=n+1 repeat w-=1 if(getsol (x(p,w,k))>0)then if (w<>0) then writeln(p, " -> ", w) pr+=a(w) ut+=b(w) ro+=c(w) p:=w w:=n+1 else writeln(p, " -> ", w) writeln("Vozidlo převáží: ", pr," kusů prádla") writeln("Vozidlo převáží: ", ut," kontejner(ů) s utěrkami") writeln("Vozidlo převáží: ", ro," kusů rohoží") end-if end-if until w=0 until w=0 end-if end-do end-do end-model