param supp_cnt, integer, > 0;
param art_cnt, integer, > 0;
set Supp := 1..supp_cnt;
set Art  := 1..art_cnt;
param Prices{a in Art, s in Supp} >=-1;
param MaxSuppValue{s in Supp}, >= 0;
param ArtNeeds{a in Art}, > 0;
param ArtPackQty{a in Art}, > 0;
param DeliveryCost{a in Art, s in Supp} >= 0;

var OrdQty{a in Art, s in Supp}, >= 0;

s.t. SuppValue{s in Supp}: sum{a in Art} OrdQty[a,s] * Prices[a,s] <= MaxSuppValue[s];
s.t. Quantity{a in Art} : sum{s in Supp} OrdQty[a,s] = ArtNeeds[a];
s.t. CorrectSupplier{s in Supp, a in Art} : OrdQty[a,s] * Prices[a,s] >= 0;

/* minimize goal: sum{a in Art,s in Supp} OrdQty[a,s] * Prices[a,s]; */
minimize goal: sum{a in Art,s in Supp} ((OrdQty[a,s] * Prices[a,s]) + (ceil(OrdQty[a,s]/ArtPackQty[a])*DeliveryCost[a,s]);

solve;

for {a in Art}
{  for {s in Supp} printf "\t%0.1f", OrdQty[a,s];
   printf("\n");
}


data;
param supp_cnt := 5;
param art_cnt := 6;
param MaxSuppValue := 
1	150
2	150
3	150
4	150
5	10000;

param ArtNeeds := 
1	50
2	30
3	10
4	80
5	30
6	90
;

param ArtPackQty := 
1	20
2	10
3	10
4	20
5	10
6	10
;

param Prices : 
		1	2	3	4	5	:=
	1	2.100000	3.600000	-1.000000	-1.000000	9	
	2	4.400000	4.360000	-1.000000	-1.000000	9	
	3	-1.000000	-1.000000	0.900000	1.800000	9	
	4	-1.000000	-1.000000	0.800000	1.500000	9	
	5	-1.000000	-1.000000	1.900000	0.900000	9	
	6	-1.000000	-1.000000	0.900000	1.900000	9	
;

param DeliveryCost : 
	1	2	3	4	5	:=
1	30	9	0	0	99	
2	42	20	0	0	99	
3	0	0	80	12	99	
4	0	0	80	30	99	
5	0	0	90	16	99
6	0	0	60	20	99	
;
