Originally posted by: SystemAdmin
[cwinter said:]
It is LP. Here is the code.
{string} Cursos = ...; //total de cursos a programar
{string} Dias = ...; //total de dias
int cruces[Cursos][Cursos] =...; //numero de alumnos que toman par de cursos
//int cruces1[Cursos][Cursos] =...;
int creditos[Cursos][Cursos]=...;
range Semestres = 1..12;
int CurT[Cursos][Semestres] = ...;//1 si el curso pertenece al semestre
tuple structCursosCursos {string c1; string c2;};
//tuple cursoDiaType {string Cursos; string Dias;};
float duals[Cursos] ;
int SiVariable[Cursos][Cursos] = ...;//parametro auxiliar para contruir las tuplas cursos cursos para las cuales existira la variable y que indica si tienen examen el mismo dia
int SiDia[Cursos][Dias] = ...; //binaria que indica si curso puede ser dictado en un dia por disponibilidad de profesor
float horashoras[Cursos][Dias]=...;
//int SiSa2[Cursos] = ...; //binario si profesor puede tomar examen sabado2
{structCursosCursos} CursosCursos = {<c1,c2> | c1,c2 in Cursos: SiVariable[c1][c2] == 1};
{structCursosCursos} CursosCursosSemestre = {<c1,c2> | c1 in Cursos,c2 in Cursos, t in Semestres: (CurT[c1][t]*CurT[c2][t] == 1) && ord(Cursos, c1) < ord(Cursos,c2) };<br />
{structCursosCursos} CursosCursosSemestreB[t in Semestres] = {<c1,c2> | c1 in Cursos,c2 in Cursos: (CurT[c1][t]*CurT[c2][t] == 1) && ord(Cursos, c1) < ord(Cursos,c2) };<br />
dvar float x[Cursos][Dias] in 0..1; //si curso se dicta en dia
//dvar boolean y[CursosCursos]; //si pares de cursos tienen examen el mismo dia
dvar boolean l[CursosCursos]; //si dos pares de cursos tiene examen en dias consecutivos
dvar float+ g[CursosCursos]; //nuemro de horas diff entre par de cursos
dvar float+ h; //total de horas entre cursos para un solucion especifica
dvar float+ horastotales;
dvar int d[Semestres]; //Cuenta de Alumnos de un mismo semestre con exámenes en dÃÂas sucesivos
dvar int m; //Cuenta de Alumnos con exámenes en dÃÂas sucesivos
dvar int c;
dvar int horas[CursosCursos];
dvar boolean w[CursosCursosSemestre]; //si dos pares de curos de un mismo semestre tiene examen en dias consecutivos
dvar int a[Semestres] in 0..1; //una posibilidad de cursos de un mismo semestre consecutivos muy penalisada
//{cursoDiaType} CursosDiasCombinations = {<i,d> | t in Semestres, d in Dias, i in Cursos: x[i][d] > 0 && CurT[i][t] == 1};
minimize ( m //+c/64
+sum (t in Semestres) a[t]
//+sum (t in Semestres) d[t]
//+h
);
subject to{
//todos los cursoso tienen un solo examen
forall (i in Cursos)
CT:
sum(d in Dias) x[i][d] == 1;
//Cursos que no se pueden dar un sabdo
sum(i in Cursos, d in Dias) x[i][d]*(1-SiDia[i][d]) == 0;
//Cursos con cruces no pueden tener examen un mismo dia
forall (i in CursosCursos, d in Dias: cruces[i.c1][i.c2]> 0)
CT2:
x[i.c1][d] + x[i.c2][d] <= 1;<br /> //CT2[x].dual;
//No mas de una pareja de cursos de un mismo semestre con Pruebas en dias consecutivos
forall (i in CursosCursosSemestre, d in Dias: ord(Dias, d) < 19)<br />CT3:
x[i.c1][d] + x[i.c1][next(Dias, d)] + x[i.c2][d]+ x[i.c2][next(Dias, d)]<=1 + w[i]; <br /> forall (t in Semestres)
CT4:
sum (i in CursosCursosSemestreB[t]: cruces[i.c1][i.c2]> 0) w[i]<= a[t];<br /> forall (t in Semestres)
sum (i in CursosCursosSemestreB[t]: cruces[i.c1][i.c2]> 0) w[i]*cruces[i.c1][i.c2]<= d[t];<br />
//Nueva: Cuenta Alumnos con pruebas en dias consecutivos
forall (i in CursosCursos, d in Dias: ord(Dias, d) < 19)<br /> x[i.c1][d] + x[i.c1][next(Dias, d)] + x[i.c2][d]+ x[i.c2][next(Dias, d)]<=1 + l[i]; <br />
sum (i in CursosCursos) l[i]*cruces[i.c1][i.c2]<= m;<br /> sum (i in CursosCursos) l[i]*cruces[i.c1][i.c2]*creditos[i.c1][i.c2]<=c;<br />
//Suma de diff de horas entre pares de pruebas/ forall (i in CursosCursos, d in Dias: ord(Dias, d) < 19 && cruces[i.c1][i.c2]> 0)
Ct5:
((x[i.c1][d]/(-horashoras[i.c1][d]+24+horashoras[i.c2][next(Dias,d)])) + x[i.c2][next(Dias,d)]/(-horashoras[i.c1][d]+24+horashoras[i.c2][next(Dias,d)])) <= g[i] +(1-l[i])*999999; <br />
sum (i in CursosCursos) 6*(g[i])*cruces[i.c1][i.c2]<= h;<br />
forall (i in CursosCursos, d in Dias: ord(Dias, d) < 19 && cruces[i.c1][i.c2]> 0)
(-horashoras[i.c1][d]+24+horashoras[i.c2][next(Dias,d)]) <= horas[i] +(1-l[i])*999999;<br /> sum (i in CursosCursos) horas[i]<=horastotales;<br />
forall(i in CursosCursos)
g[i]>=0;
forall(i in CursosCursos)
horas[i]>=0;
};
I saw somewhere that when namignt eh constraints i would need to name it like CT[x]; and then CT[x].duals or something like that, but i keep getting so many problems.
Please help me out..
Thank you very much
#ConstraintProgramming-General#DecisionOptimization