RodrigoToroIcarte / IIC2113-2023-1

6 stars 0 forks source link

Test C Vehicle Routing #219

Open ebenstom opened 1 year ago

ebenstom commented 1 year ago

Hola, con respecto a este problema, me pasan perfectamente los test A y B, lo que me llevó a pensar en que mi código estaba efectivamente bien. Esto se contradice con que en los test C me pasan todos excepto 3. De esta forma me he dado cuenta revisando el código base que so nos ha entregado que existen errores en su implementación. Para hacer un ejemplo concreto, en el último test definido en el 'Theory' de "PartC_AddSubscriber_SubscribersShouldReceiveTheRightUpdate" se muestra lo siguiente:

--> [InlineData( new []{0, 1, 0, 2, 0, 3, 4, 0, 5, 6, 0}, "There are too many tours.")]

Efectivamente hay muchos tours, pero luego revisé el archivo TestProblems.cs y en la función "GetAllTheConstraints()" se define al final de la lista la validación de precedencias, lo que hace que en la lista de handlers esta sea la primera en validarse:

image

Luego, los test como el del ejemplo debe fallar ya que, además de no cumplir con el límite de tours, tampoco cumple con la restricción de precedencia de pasar por el depot entre medio de pickup y delivery location. Mi propuesta es cambiar el orden de esta función al siguiente, cambiar Constraint.Precedence al comienzo de la lista:

image

Haciendo este cambio sencillo, todos los test me aparecen correctos, por lo que me parece que tengo razón en la observación hecha. Por favor coméntenme si mi razonamiento es correcto y si puedo hacer este cambio para aprobar la tarea.

Saludos, Tomás Eduardo Ebensperger Buschmann

RodrigoToroIcarte commented 1 year ago

El código base está bien. Creo que el problema es que implementaste mal la cadena de responsabilidades en la parte a.

En concreto, creo que implementaste la cadena al revés. En el orden original, primero se debe chequear el número de tours y luego las precedencias (eso es lo que indica el GetAllTheConstraints()). Por eso cuando se cae por tours se notifica al usuario que "There are too many tours." y el programa termina (sin chequear si se cumplen las precedencias).

En tu caso, como implementaste la cadena al revés, primero chequeas precedencias. Notificas al usuario que no se cumplen las precedencia, y tu programa termina.

La solución no es modificar el GetAllTheCosntraints()... es crear bien la cadena en la parte a :)