with text_io,integer_io; use text_io,integer_io; with Standard_Floating_Numbers; use Standard_Floating_Numbers; with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io; with Standard_Integer_Vectors; with Standard_Floating_Vectors; use Standard_Floating_Vectors; with Standard_Floating_Matrices; use Standard_Floating_Matrices; with Dictionaries,Linear_Programming; use Dictionaries,Linear_Programming; procedure ts_diclp is -- DESCRIPTION : -- This procedure can be used for solving the primal problem: -- -- max -- <= 0 -- -- where x = (1,x1,x2,..,xn) -- -- and for solving the dual problem : -- -- min -- >= 0 -- -- where x = (1,x1,x2,..,xn). n,m : natural; ans : character; eps : constant double_float := 10.0**(-12); -- OUTPUT ROUTINES : procedure Write ( file : in file_type; dic : in Matrix; in_bas,out_bas : in Standard_Integer_Vectors.Vector; fo,af,ex : in natural ) is -- DESCRIPTION : -- This procedure writes the dictionary on standard output or on file. -- ON ENTRY : -- dic matrix for the dictionary; -- in_bas unknowns in the basis; -- out_bas unknowns out the basis; -- fo the number of decimal literals before the dot; -- af the number of decimal literals after the dot; -- ex the number of decimal literals in the exponent. begin new_line(file); put_line(file,"***** THE DICTIONARY *****"); new_line(file); put_line(file,"The elements in the basis : "); for i in in_bas'range loop put(file," "); put(file,in_bas(i),1); end loop; new_line(file); put_line(file,"The dictionary : "); for i in dic'range(1) loop for j in dic'range(2) loop put(file,dic(i,j), fore => fo, aft => af, exp => ex ); end loop; new_line(file); end loop; end Write; procedure Report ( dic : in Matrix; in_bas,out_bas : in Standard_Integer_Vectors.Vector ) is begin Write(Standard_Output,dic,in_bas,out_bas,3,3,3); end Report; procedure plp is new Generic_Primal_Simplex(Report); procedure dlp is new Generic_Dual_Simplex(Report); begin -- INPUT OF THE DATA : put("Give the number of unknowns : "); get(n); put("Give the number of constraints : "); get(m); declare c : Standard_Floating_Vectors.vector(0..n); a : matrix(1..m,0..n); dic : matrix(0..m,0..n); inbas : Standard_Integer_Vectors.Vector(1..m) := (1..m => 0); outbas : Standard_Integer_Vectors.Vector(1..n) := (1..n => 0); primsol : Standard_Floating_Vectors.Vector(1..n); dualsol : Standard_Floating_Vectors.Vector(1..m); nit : natural := 0; ok : boolean := false; feasibound : boolean; begin put_line("Give the coefficients of the target :"); for i in c'range loop get(c(i)); end loop; put_line("Give the coefficients of the constraints :"); for i in a'range(1) loop for j in a'range(2) loop get(a(i,j)); end loop; end loop; loop put("Primal of Dual simplex problem ? (p/d) "); get(ans); if ans = 'p' then Dictionaries.Primal_Init(c,a,dic,inbas,outbas); ok := true; elsif ans = 'd' then Dictionaries.Dual_Init(c,a,dic,inbas,outbas); ok := true; else put_line("try again ..."); ok := false; end if; exit when ok; end loop; if ans = 'p' then plp(dic,eps,inbas,outbas,nit,feasibound); else dlp(dic,eps,inbas,outbas,nit,feasibound); end if; primsol := Dictionaries.Primal_Solution(dic,inbas,outbas); new_line; put_line("THE PRIMAL SOLUTION :"); for i in primsol'range loop put(" x"); put(i,1); put(" : "); put(primsol(i),3,3,3); new_line; end loop; if ans = 'd' then dualsol := -Dictionaries.Dual_Solution(dic,inbas,outbas); else dualsol := Dictionaries.Dual_Solution(dic,inbas,outbas); end if; new_line; put_line("THE DUAL SOLUTION :"); for i in dualsol'range loop put(" x"); put(i,1); put(" : "); put(dualsol(i),3,3,3); new_line; end loop; new_line; put("OPTIMUM : "); put(Optimum(dic)); new_line; put("NUMBER OF ITERATIONS : "); put(nit,1); new_line; if ans = 'd' then if feasibound then put_line("THE PROBLEM IS FEASIBLE"); else put_line("THE PROBLEM IS NOT FEASIBLE"); end if; else if feasibound then put_line("THE PROBLEM IS UNBOUNDED"); else put_line("THE PROBLEM IS NOT UNBOUNDED"); end if; end if; end; end ts_diclp;