A0={500,400,600,400};
A1={8,6.4,7.9,7.5};
A2={0.004,0.0048,0.005,0.0055};
B0=A1;
B1=2*A2;
Pmin={100,100,75,75};
Pmax={625,625,600,500};
Con={3000,3000,3000,3000};
Coff={1500,1500,1500,1500};
PL={1100,1400,1600,1800,1400,1100};
TD={4,4,4,4,4,4};
Sqr=Transpose[(({{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 0, 0}, {1, 0, 1, 0}}))];

(*počet časových úseků*)
Nt=Length@PL;
(*Počet grup*)
Ngr=Length@Sqr;
(*počet generátorů*)
Ngen=Length@A0;

(*požadovaný výkon, použitá grupa, čas trvání*)
ekDisp[t_,gr_]:=Module[{b,P},
b=((PL[[t]]+(Sqr[[gr]]*((B0/B1))/.List->Plus))/((Sqr[[gr]]*((1/B1))/.List->Plus)));
{P=((b-B0)/B1),(Sqr[[gr]]*A2*(P^2)+Sqr[[gr]]*A1*P+Sqr[[gr]]*A0/.List->Plus)*TD[[t]]}
]

(*Ceny přechodu z grupy i do grupy j*)
Tij[i_,j_]:=((Sqr[[i]]-Sqr[[j]])*Sqr[[i]]*Coff+(Sqr[[j]]-Sqr[[i]])*Sqr[[j]]*Con)/.List->Plus

Table[Tij[ii,jj],{ii,1,4},{jj,1,4}]//MatrixForm

Jopt=Uopt=ConstantArray[0,{Nt,Ngr}];
Grkon=(**);

(*podmíněná optimalizace*)
t=Nt
Uopt[[t]]=ConstantArray[Grkon,Ngr];
j=Grkon;
Table[
Jopt[[t,i]]=ekDisp[t,i][[2]]+Tij[i,j],
{i,1,Ngr}
]

Table[
Table[
minimum=(10^8);
Table[
cena=ekDisp[t,i][[2]]+Tij[i,j]+Jopt[[t+1,j]];
If[cena<minimum,
Jopt[[t,i]]=cena;
Uopt[[t,i]]=j;
minimum=cena;
]
,{j,1,Ngr}]
,{i,1,Ngr}]
,{t,Nt-1,1,-1}];

Jopt//MatrixForm

Uopt//MatrixForm

(*a) Za předpokladu zadaného počátečního a koncového stavu Grzac=4 a Grkon=4*)
(*nepodmíněná optimalizace*)
Grzac=(**);
Str=ConstantArray[0,Nt];
Str[[1]]=Grzac;
Table[
Str[[t]]=Uopt[[t-1,Str[[t-1]]]],
{t,2,Nt(*-1*)}
];
Str

(*b) Jak se změní optimální strategie, bude-li navíc zadána Grzac=2 v 2. kroku*)

(*c) Jako a) za předpokladu pouze zadaného počátečního stavu Grzac=2*)

(*podotázka - kolik vyrábí druhý generátor v čase t=5 ve třetí grupě?*)