From f673fa86140be2ffe26c8a041dc9ee589f309851 Mon Sep 17 00:00:00 2001 From: tomcarr <tomas.carretero@estudiantes.uva.es> Date: Sat, 29 Mar 2025 09:03:31 +0000 Subject: [PATCH] Upload New File --- .../VarepsilonConstraintMaxMCLP.mos | 282 ++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 Codigos Xpress/VarepsilonConstraintMaxMCLP.mos diff --git a/Codigos Xpress/VarepsilonConstraintMaxMCLP.mos b/Codigos Xpress/VarepsilonConstraintMaxMCLP.mos new file mode 100644 index 0000000..9500cf3 --- /dev/null +++ b/Codigos Xpress/VarepsilonConstraintMaxMCLP.mos @@ -0,0 +1,282 @@ +model VCMaxMCLP +uses "mmxprs"; +uses "mmsystem" +uses "mmive" + +(! + Declaraciones necesarias para la lectura del fichero +!) +declarations + m,n, p, r:integer + archivo_datos = "instancesMOFLP/instances/large1.txt" ! formato_datos = 3 + !archivo_datos = "municipios/archivo_salida.txt" + !archivo_datos = "municipios/archivo_cyl.txt" + !archivo_datos = "municipios/archivo_esp.txt" ! algo más de 800 segundos la primera (es la más importante) + formato_datos = 3 +end-declarations + +fopen(archivo_datos,F_INPUT) +if(formato_datos = 1)then + read(n) + m:=n +elif(formato_datos =2)then + read(m) + read(n) +elif(formato_datos = 3)then + readln(m,n, p, r) +elif(formato_datos = 4)then + readln(n) + m:=n +end-if + +(! + Declaraciones necesarias para la lectura del fichero y el propio modelo Varepsilon-Constraint +!) +declarations + pdemanda= 1..n + pservicio = 1..m + cxS, cyS:array(pservicio)of real + cx, cy: array(pdemanda) of real + dist:array(pdemanda,pservicio)of real + !nc:array(pdemanda)of integer + dem:array(pdemanda)of real + a:array(pdemanda,pservicio)of integer + dc=r + tam = 1000 + Pn : array(1..tam, 1..2) of real + y: array(pdemanda) of mpvar + u: array(pdemanda) of mpvar + x: array(pservicio) of mpvar + psAbiertos : array(1..tam, 1..p) of integer + !p=3 +end-declarations + + +(! + Terminamos de leer el fichero de datos y calculamos que puntos de servicio pueden dar servicio a que puntos demanda +!) +if(formato_datos = 1)then + forall(j in pservicio)read(j,cx(j),cy(j)) + forall(i in pdemanda,j in pservicio)dist(i,j):=sqrt((cx(i)-cx(j))^2+(cy(i)-cy(j))^2) + forall(i in pdemanda,j in pservicio)do + if(dist(i,j)<=dc)then + a(i,j):=1 + else + a(i,j):=0 + end-if + end-do + forall(j in pservicio)costo(j):=1 +elif(formato_datos=2)then + forall(i in pdemanda)read(dem(i)) + forall(i in pdemanda,j in pservicio)read(dist(i,j)) + forall(i in pdemanda,j in pservicio)do + if(dist(i,j)<=dc)then + a(i,j):=1 + else + a(i,j):=0 + end-if + end-do + forall(j in pservicio)costo(j):=1 +elif(formato_datos = 3)then + forall(j in pservicio)readln(cxS(j),cyS(j)) + + forall(i in pdemanda)readln(cx(i),cy(i),dem(i)) + + forall(i in pdemanda,j in pservicio)dist(i,j):=sqrt((cx(i)-cxS(j))^2+(cy(i)-cyS(j))^2) + + forall(i in pdemanda,j in pservicio)do + if(dist(i,j)<=r)then a(i,j):=1 + else a(i,j):=0 + end-if + end-do + + elif(formato_datos = 4)then + forall(i in pdemanda)readln(cx(i),cy(i),dem(i)) + forall(i in pdemanda,j in pservicio)do + dist(i,j):=round(sqrt((cx(i)-cx(j))^2+(cy(i)-cy(j))^2)) + if(dist(i,j)<=dc)then a(i,j):=1 + else a(i,j):=0 + end-if + end-do +end-if +fclose(F_INPUT) + +(! + Comienzo maximizando el primer criterio (MCLPR) +!) +!setparam("XPRS_MAXTIME",-100) +obj := sum(j in pdemanda) u(j) +!obj := sum(j in pdemanda) dem(j)*u(j) + +forall(i in pdemanda) res1(i):= sum(j in pservicio)x(j)*a(i,j) >= 2*u(i) +forall(i in pdemanda) res2(i):= sum(j in pservicio)x(j)*a(i,j)>= y(i) +res3 := sum(j in pservicio) x(j) = p + +forall(i in pdemanda) u(i) is_binary +forall(j in pservicio) x(j) is_binary +forall(i in pdemanda) y(i) is_binary +maximize(obj) + +varep := getobjval +writeln("La solucion optima es\t", varep) + + +n := 1 + +! Busco para el otro criterio (MCLP) la solucion optima, si pongo como restriccion que el MCLPR sea el maximo anteiror +obj2 := sum(i in pdemanda) y(i) + +res4 := sum(i in pdemanda) u(i) >= varep + +maximize(obj2) + +Pn(n,2) := getobjval +Pn(n,1) := varep + +writeln("La solucion del MCLP = ", Pn(n,1), "\t corresponde a maximizar MCLPR a ", Pn(n,2)) +! guardo los puntos abiertos para esta solcuion de la frontera de pareto +indR := 1 +forall(indiceRellenar in pservicio | x(indiceRellenar).sol = 1) do + psAbiertos(1, indR) := indiceRellenar + indR := indR +1 +end-do +(! + Fin maximizar el primer criterio (MCLPR) +!) + + +(! + Busquemos el comienzo de varepIter para no hacer calculo redundante: + Esto lo hacemos sacando el maximo para MCLP y su correspondiente optimo de Pareto en MCLPR +!) + +res4 := 0 ! nos aseguramos de no arrastrar una restriccion previa +maximize(obj2) + +res4:= sum(i in pdemanda) y(i) >= getobjval + +maximize(obj) + +varepIter := getobjval +(! + Fin Busquemos el comienzo de varepIter +!) + + +(! + Recorremos todo el espectro de entre varepIter y varep para obtener todas las soluciones de la frontera de pareto +!) +while(varepIter <= varep)do + n := n+1 + + ! Encontrar la solucion optima para MCLP imponiendo como restriccion que el MCLPR sea varepIter + obj := sum(j in pdemanda) y(j) + !obj := sum(j in pdemanda) dem(j)*y(j) + + res4 := sum(i in pdemanda) u(i) >= varepIter + + forall(i in pdemanda) y(i) is_binary + forall(j in pservicio) x(j) is_binary + forall(i in pdemanda) u(i) is_binary + maximize(obj) + + + ! no queremos quedarnos con los puntos dominados + if( getobjval >= Pn(n-1,1)-0.1 ) then ! el menos una decima es necesario por culpa de que getobjval puede que sea un numero mal menos 10 a la menos el limite de XPRESS + n := n - 1 + writeln("los datos del de anterior corresponden a un dominado") + end-if + !writeln("") + !writeln("MCLP = ", getobjval, "\tMCLPR = ", varepIter, "-") + + ! COMIENZO de una cosa nueva para quitar iteraciones de dominados (que no se hagan) + maxIterMCLP := getobjval + res4 := sum(i in pdemanda) y(i) >= maxIterMCLP + obj := sum(j in pdemanda) u(j) + + maximize(obj) + + ! FIN de una cosa nueva para quitar iteraciones de dominados (que no se hagan) + + + Pn(n,2) := getobjval + Pn(n,1) := maxIterMCLP + + varepIter := getobjval + writeln("MCLP = ", maxIterMCLP, "\tMCLPR = ", varepIter) + indR := 1 + forall(indiceRellenar in pservicio | x(indiceRellenar).sol = 1) do + psAbiertos(n, indR) := indiceRellenar + indR := indR +1 + end-do + ! incrementamos el valor de varepIter + varepIter := varepIter + 1 + +end-do + + +! Dibujar los pintos de servicio y las asignaciones +id1:=IVEaddplot("puntos", IVE_RED) +id2:=IVEaddplot("lineas", IVE_BLACK) +id3:= IVEaddplot("mejores", IVE_BLUE) +!forall(i in pdemanda) IVEdrawpoint(id1, cx(i), cy(i))! Dibujamos los puntos +!forall(i in pdemanda, j in pservicio | y(i).sol > 0.999 and x(j).sol > 0.999 and a(i,j) = 1 ) IVEdrawline(id2, cx(i), cy(i), cx(j), cy(j)) ! Dibujamos las lineas + + +forall(i in 1..n)do + IVEdrawpoint(id3, Pn(i,1), Pn(i,2)) +end-do +!IVEdrawpoint(id3, Pn(1,1), Pn(1,2)) +!IVEdrawpoint(id3, Pn(2,1), Pn(2,2)) +IVEdrawpoint(id1, 0, 0) + +writeln("\n\n") + +writeln("El conjunto de soluciones factibles es \n") + +forall( ind2 in 1..n) writeln(Pn(ind2, 1),", ", Pn(ind2, 2)) + + +writeln("\n\nLos puntoes de servicio que se habren son: \n") + +forall( indImprimir in 1..n)do + forall( ind2 in 1..p) do + write( psAbiertos(indImprimir,ind2), ", ") + end-do + writeln(" ") +end-do + + + + +!fichero de escritura de las soluciones: +!fopen("solucionVarepMCLP_large1.txt", F_OUTPUT) ! Abre el archivo en modo escritura +!fopen("solucionVarepMCLP_cyl.txt", F_OUTPUT) ! Abre el archivo en modo escritura +!fopen("solucionVarepMCLP_esp4.txt", F_OUTPUT) ! Abre el archivo en modo escritura +!fopen("solucionVarepMCLP_cyl_v2.txt", F_OUTPUT) ! Abre el archivo en modo escritura +fopen("solucionVarepMCLP_Borrar.txt", F_OUTPUT) ! Abre el archivo en modo escritura +writeln(cx) +writeln(cy) +writeln(cxS) +writeln(cyS) +writeln(n) +writeln(r) +writeln(p) + +forall( ind2 in 1..n)do + writeln(Pn(ind2, 1),", ", Pn(ind2, 2)) +end-do + + +forall( indImprimir in 1..n)do + forall( ind2 in 1..p) do + write( psAbiertos(indImprimir,ind2), " ") + end-do + writeln(" ") +end-do + +fclose(F_OUTPUT) ! Cierra el archivo para guardar los cambios + + + +end-model \ No newline at end of file -- GitLab