You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							67 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							67 lines
						
					
					
						
							1.5 KiB
						
					
					
				
								/* sorting.mod - how to sort arrays in MathProg */
							 | 
						|
								
							 | 
						|
								/* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */
							 | 
						|
								
							 | 
						|
								#  Sometimes it is necessary to print parameters or variables in the
							 | 
						|
								#  order of ascending or descending their values. Suppose, for example,
							 | 
						|
								#  that we have the following subscripted parameter:
							 | 
						|
								
							 | 
						|
								set I := 1..12;
							 | 
						|
								
							 | 
						|
								param a{i in I} := Uniform(2, 7);
							 | 
						|
								
							 | 
						|
								#  If we print all its members:
							 | 
						|
								
							 | 
						|
								printf{i in I} "a[%d] = %g\n", i, a[i];
							 | 
						|
								
							 | 
						|
								#  the output may look like follows:
							 | 
						|
								#
							 | 
						|
								#  a[1]  = 2.64156
							 | 
						|
								#  a[2]  = 2.04798
							 | 
						|
								#  a[3]  = 2.14843
							 | 
						|
								#  a[4]  = 4.76896
							 | 
						|
								#  a[5]  = 6.09132
							 | 
						|
								#  a[6]  = 3.27780
							 | 
						|
								#  a[7]  = 4.06113
							 | 
						|
								#  a[8]  = 4.05898
							 | 
						|
								#  a[9]  = 6.63120
							 | 
						|
								#  a[10] = 6.50318
							 | 
						|
								#  a[11] = 3.46065
							 | 
						|
								#  a[12] = 4.69845
							 | 
						|
								#
							 | 
						|
								#  However, we would like the parameter members to appear in the order
							 | 
						|
								#  of ascending their values.
							 | 
						|
								#
							 | 
						|
								#  Introduce the following auxiliary parameter:
							 | 
						|
								
							 | 
						|
								param pos{i in I} :=
							 | 
						|
								      1 + card({j in I: a[j] < a[i] or a[j] = a[i] and j < i});
							 | 
						|
								
							 | 
						|
								#  where pos[i] = k means that in the sorted list member a[i] would
							 | 
						|
								#  have k-th position, 1 <= k <= |I|. Then introduce another auxiliary
							 | 
						|
								#  parameter:
							 | 
						|
								
							 | 
						|
								param ind{k in 1..card(I)} := sum{i in I: pos[i] = k} i;
							 | 
						|
								
							 | 
						|
								#  where ind[k] = i iff pos[k] = i.
							 | 
						|
								#
							 | 
						|
								#  Now, the following statement:
							 | 
						|
								
							 | 
						|
								printf{k in 1..card(I)} "a[%d] = %g\n", ind[k], a[ind[k]];
							 | 
						|
								
							 | 
						|
								#  prints the parameter members in the desired order:
							 | 
						|
								#
							 | 
						|
								#  a[2]  = 2.04798
							 | 
						|
								#  a[3]  = 2.14843
							 | 
						|
								#  a[1]  = 2.64156
							 | 
						|
								#  a[6]  = 3.27780
							 | 
						|
								#  a[11] = 3.46065
							 | 
						|
								#  a[8]  = 4.05898
							 | 
						|
								#  a[7]  = 4.06113
							 | 
						|
								#  a[12] = 4.69845
							 | 
						|
								#  a[4]  = 4.76896
							 | 
						|
								#  a[5]  = 6.09132
							 | 
						|
								#  a[10] = 6.50318
							 | 
						|
								#  a[9]  = 6.63120
							 | 
						|
								
							 | 
						|
								end;
							 |