BookmarkSubscribeRSS Feed
Choose Language Hide Translation Bar
AlotaibiA

Occasional Contributor

Joined:

Dec 12, 2018

How to assign seats with limit

Hello 

 

I have already started a discussion in wrong part here https://community.jmp.com/t5/Community-Matters/Loop-with-conditions/m-p/86408

Mr. Craige Hales has solved half of my question and I am looking for more range of answers.  

 

Basically,

 

I am looking to assign student to limited seats for 15 programs.  The students have to only choose five preferences.  My conditions are:

  • Higher GPA student has more chance to be assigned to there first choice 
    • If first wish doesnt have available seats then they should be assigned to their second choice
    • .....etc
  • If no seats available at all of the 5 preferences, then they should be assigned to ranked preference list

 

My script is:

 

dtPrefs = Data Table( "Sample.jmp" ) << Subset(
	Selected Rows( 0 ),
	Rows(
		[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
		22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
		41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
		60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
		79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
		98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
		114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
		129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
		144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
		159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173,
		174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
		189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
		204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
		219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
		234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248,
		249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263,
		264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
		279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293,
		294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
		309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323,
		324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338,
		339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353,
		354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368,
		369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383,
		384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398,
		399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413,
		414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428,
		429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443,
		444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458,
		459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473,
		474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488,
		489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503,
		504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518,
		519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533,
		534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548,
		549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563,
		564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578,
		579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593,
		594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608,
		609, 610, 611, 613]
	),
	Selected columns only( 0 )
);

dtSeats = New Table( "Seats Available",
	Add Rows( 15 ),
	New Column( "Program",character,Set Values({"Medicine", "Dentistry", "Pharmacy", "HRS - Rehab - Occupational Therapy", "HRS - MT - Nuclear Medicine",  "HRS - Rehab - Physiotherapy", "HRS - CS - Hearing and Balance", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - HS - Clinical Nutrition",  "HRS - MT - Ultrasound Techniques", "HRS - MT - Diagnostic Radiology", "HRS - HS - Epi", "HRS - HS - Clinical Physcology", "HRS - HS - HA", "Nursing"})	),
	New Column( "seats", Set Values( [71, 40, 126, 30, 0, 31, 19, 0, 0, 18, 18, 36, 32, 45, 146] ) ),
	New Column( "alt1", character,Set Values({"Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine"})),
	New Column( "alt2", character,Set Values({"Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry"})),
	New Column( "alt3", character,Set Values({"Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy"})),
	New Column( "alt4", character,Set Values({"HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy"})),
	New Column( "alt5", character,Set Values({"HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine"})),
	New Column( "alt6", character,Set Values({"HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy"})),
	New Column( "alt7", character,Set Values({"HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance"})),
	New Column( "alt8", character,Set Values({"HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases"})),
	New Column( "alt9", character,Set Values({"HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition"})),
	New Column( "alt10", character,Set Values({"HRS - MT - Ultrasound Techniques", "HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques"})),
	New Column( "alt11", character,Set Values({"HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology"})),
	New Column( "alt12", character,Set Values({"HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi"})),
	New Column( "alt13", character,Set Values({"HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology"})),
	New Column( "alt14", character,Set Values({"HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA"})),
	New Column( "alt15", character,Set Values({"Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing"}))
	
);

// sort the prefs, do the high GPAs first
dtPrefs << sort( by( Predicted PrepGPA By Year ), order( descending ), ReplaceTable );

// build a lookup table for the Program-to-Rownumber in the seats table
lookup = Associative Array();
For( iSeat = 1, iSeat <= N Rows( dtSeats ), iSeat += 1, 
	// use uppercase lookups, just in case 
	lookup[Uppercase( dtSeats:Program[iSeat] )] = iSeat
);

// assign the seats
For( iStudent = 1, iStudent <= N Rows( dtPrefs ), iStudent += 1, 
	// get the list of prefs for this student
	preflist = dtPrefs[iStudent, {Wish 1, Wish 2, Wish 3, Wish 4, Wish 5}];
	answer = "";
	While( answer == "" & N Items( preflist ) > 0,
		pref = Remove From( preflist, 1 );
		pref = pref[1]; // get first item from list of one item
		pref = Uppercase( pref );
		seatrow = Try( lookup[pref], -1 ); // handle unknown preference?
		If( dtSeats:seats[seatrow] > 0,
			dtPrefs:Predicted Allotment[iStudent] = answer = pref;
			dtSeats:seats[seatrow] -= 1;
		);
	);
);

StudentsFirstChoice = dtPrefs:Wish1[iStudent];
for(ialternative=1,iAlternative<=11, iAlternitive+=1,
    alt = alternative[lookup(StudentsFirstChoice), ialternative]; // try the ranked alternatives in order
    if (dtSeats:seats[ lookup(alt) ] > 0, seatrow=ialternative; break();
		dtPrefs:Predicted Allotment[iStudent] = answer = pref;
		dtSeats:seats[seatrow] -= 1;
	);
);

The script works without the last condition.  I have added the following, but couldn't get it to work.  

	New Column( "alt1", character,Set Values({"Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine", "Medicine"})),
	New Column( "alt2", character,Set Values({"Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry", "Dentistry"})),
	New Column( "alt3", character,Set Values({"Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy", "Pharmacy"})),
	New Column( "alt4", character,Set Values({"HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy", "HRS - Rehab - Occupational Therapy"})),
	New Column( "alt5", character,Set Values({"HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine", "HRS - MT - Nuclear Medicine"})),
	New Column( "alt6", character,Set Values({"HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy", "HRS - Rehab - Physiotherapy"})),
	New Column( "alt7", character,Set Values({"HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance", "HRS - CS - Hearing and Balance"})),
	New Column( "alt8", character,Set Values({"HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases", "HRS - CS - Speech, Swallowing, and Language Diseases"})),
	New Column( "alt9", character,Set Values({"HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition", "HRS - HS - Clinical Nutrition"})),
	New Column( "alt10", character,Set Values({"HRS - MT - Ultrasound Techniques", "HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques","HRS - MT - Ultrasound Techniques"})),
	New Column( "alt11", character,Set Values({"HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology", "HRS - MT - Diagnostic Radiology"})),
	New Column( "alt12", character,Set Values({"HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi", "HRS - HS - Epi"})),
	New Column( "alt13", character,Set Values({"HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology", "HRS - HS - Clinical Physcology"})),
	New Column( "alt14", character,Set Values({"HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA", "HRS - HS - HA"})),
	New Column( "alt15", character,Set Values({"Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing", "Nursing"}))


StudentsFirstChoice = dtPrefs:Wish1[iStudent];
for(ialternative=1,iAlternative<=11, iAlternitive+=1,
    alt = alternative[lookup(StudentsFirstChoice), ialternative]; // try the ranked alternatives in order
    if (dtSeats:seats[ lookup(alt) ] > 0, seatrow=ialternative; break();
		dtPrefs:Predicted Allotment[iStudent] = answer = pref;
		dtSeats:seats[seatrow] -= 1;
	);
);
7 REPLIES 7
gzmorgan0

Super User

Joined:

Jul 25, 2016

Re: How to assign seats with limit

Interesting problem. I read this blog and the link to the other forum.  I started down a side path to the one suggested by Craige Hales.  I stacked the wishes to get find the most requested (desired) program. My thoughts were to maximize desirability (6 - wish rank), and start assigments by most popular ( programs with the highest desirability). I have limited time today to pursue, but thought, hey this should be a common problem. I googled for algorithm to assign limited resources based upon ranked desirability and found several interesting links.

 

This paper below describes a similar problem but it uses a totally random (fair) assignment vs. GPA criteria.  I am posting this link as an FYI. It might provide a few leads (TBD).

https://peer.asee.org/an-algorithm-for-project-assignment-in-capstone-design.pdf

 

I will check-in to see further suggestions.

AlotaibiA

Occasional Contributor

Joined:

Dec 12, 2018

Re: How to assign seats with limit

I have tried this script based on Craige_Hale comment but the assignment stopped at the 11th student.  

 

// assign the seats
For( iStudent = 1, iStudent <= N Rows( dtPrefs ), iStudent += 1, 
	// get the list of prefs for this student
	preflist = dtPrefs[iStudent, {Wish 1, Wish 2, Wish 3, Wish 4, Wish 5}];
	answer = "";
	While( answer == "" & N Items( preflist ) > 0,
		pref = Remove From( preflist, 1 );
		pref = pref[1]; // get first item from list of one item
		pref = Uppercase( pref );
		seatrow = Try( lookup[pref], -1 ); // handle unknown preference?
		If( dtSeats:seats[seatrow] > 0,
			dtPrefs:Predicted Allotment[iStudent] = answer = pref;
			dtSeats:seats[seatrow] -= 1,
			if( dtSeats:seats[lookup("medicine")] > 0, seatrow=lookup("medicine"), // first choice
				dtSeats:seats[lookup("dentistry")] > 0, seatrow=lookup("dentistry"), // second
				dtSeats:seats[lookup("Pharmacy")] > 0, seatrow=lookup("Pharmacy"), 		
				dtSeats:seats[lookup("HRS - Rehab - Occupational Therapy")] > 0, seatrow=lookup("HRS - Rehab - Occupational Therapy"), 
				dtSeats:seats[lookup("HRS - MT - Nuclear Medicine")] > 0, seatrow=lookup("HRS - MT - Nuclear Medicine"), 
				dtSeats:seats[lookup("HRS - Rehab - Physiotherapy")] > 0, seatrow=lookup("HRS - Rehab - Physiotherapy"), 
				dtSeats:seats[lookup("HRS - CS - Hearing and Balance")] > 0, seatrow=lookup("HRS - CS - Hearing and Balance"),
				dtSeats:seats[lookup("HRS - CS - Speech, Swallowing, and Language Diseases")] > 0, seatrow=lookup("HRS - CS - Speech, Swallowing, and Language Diseases"), 
				dtSeats:seats[lookup("HRS - HS - Clinical Nutrition")] > 0, seatrow=lookup("HRS - HS - Clinical Nutrition"), 
				dtSeats:seats[lookup("HRS - MT - Ultrasound Techniques")] > 0, seatrow=lookup("HRS - MT - Ultrasound Techniques"), 
				dtSeats:seats[lookup("HRS - MT - Diagnostic Radiology")] > 0, seatrow=lookup("HRS - MT - Diagnostic Radiology"), 
				dtSeats:seats[lookup("HRS - HS - Epi", "HRS - HS - Epi")] > 0, seatrow=lookup("HRS - HS - Epi", "HRS - HS - Epi"), 
				dtSeats:seats[lookup("HRS - HS - Clinical Physcology")] > 0, seatrow=lookup("HRS - HS - Clinical Physcology"), 
				dtSeats:seats[lookup("HRS - HS - HA", "HRS - HS - HA")] > 0, seatrow=lookup("HRS - HS - HA", "HRS - HS - HA"), 		
				dtSeats:seats[lookup("nursing")] > 0, seatrow=lookup("nursing"), // last choice
				seatrow = -999  // no seats left, anywhere!
			);
		);
	);
	
);

help?

 

BTW, I have limited knowledge on scripting in general. 

Craige_Hales

Staff

Joined:

Mar 21, 2013

Re: How to assign seats with limit

Was there a message in the log window? (View->Log)

I think a good starting point is to understand how the JSL if statement works. If Secrets. (This should make the 12-part if statement make sense too.) 

If( dtSeats:seats[seatrow] > 0,
			dtPrefs:Predicted Allotment[iStudent] = answer = pref;
			dtSeats:seats[seatrow] -= 1, <<< this comma

Notice the comma in your code. The two statements just before the comma are part of the then clause. "if seatrow has a seat left, then give one of those seats to the student and take it away from the available seats."

What comes after the comma is the else clause:

if( dtSeats:seats[lookup("medicine")] > 0, seatrow=lookup("medicine"), // first choice
	dtSeats:seats[lookup("dentistry")] > 0, seatrow=lookup("dentistry"), // second
	dtSeats:seats[lookup("Pharmacy")] > 0, seatrow=lookup("Pharmacy"), 		
... dtSeats:seats[lookup("nursing")] > 0, seatrow=lookup("nursing"), // last choice seatrow = -999 // no seats left, anywhere! );

"else find a program with a seat."  Notice the seat is not given to a student, and not taken away from the available seats. That might be why nothing happened after 11 students. To get more info...

 

A big debugging aid: add show(...); statements in the JSL and read the log to understand what is happening:

If( dtSeats:seats[seatrow] > 0,
show("got wish",iStudent,seatrow);
... grant wish by assigning it to student and decrement the seat count
, // else
show("sorry",iStudent);
... pick alternate program and assign it to the student and decrement the seat count
show("you get",seatrow);
);    

 

Craige
AlotaibiA

Occasional Contributor

Joined:

Dec 12, 2018

Re: How to assign seats with limit

this error shows up

 

Check script for using an assignment with single = where a test for equality with double == is normally expected. Expression is

"seatrow = lookup( "Medicine" )"

 

and i have tried to fix by making it double == but then the student didn't get assigned to the ranked programs if their prefrence's seats ran out.

 

in the log it says 

 

"sorry";

iStudent = 613;

"you get";

seatrow = 4;

Craige_Hales

Staff

Joined:

Mar 21, 2013

Re: How to assign seats with limit

I don't think the == error is in the JSL you posted. The comparison operators are <, <=, >, >=, == and are used to compare two values. The comparison operators happen in the 1st, 3rd, 5th, 7th, etc parts of the if statement. The assignment operator is = and happens in the 2nd, 4th, 6th, etc parts of the if. You need to study the structure of the if statement (the commas are really important!) and fix that, not just change an = to ==. JMP is reporting an error that you have used an = where an == was more likely correct. JMP is not telling you to change the = to ==, it is telling you there is something wrong near the =.

 

There are also several errors with the lookup function being called with two arguments ("HRS - HS - Epi", "HRS - HS - Epi") for example.

Craige
Highlighted
Craige_Hales

Staff

Joined:

Mar 21, 2013

Re: How to assign seats with limit

Also: lookup is probably not a function, but an associative array. You need to use square brackets for the subscript, not round parenthesis for the argument. (I'm pretty sure I made the paren mistake a few posts back.)

 

use: lookup["something"] 

Craige
gzmorgan0

Super User

Joined:

Jul 25, 2016

Re: How to assign seats with limit

Below is a snippet from the script posted by @AlotaibiA . Note by definintion, the keys must be uppercase, i.e. MEDICINE.   

 

// build a lookup table for the Program-to-Rownumber in the seats table
lookup = Associative Array();
For( iSeat = 1, iSeat <= N Rows( dtSeats ), iSeat += 1, 
	// use uppercase lookups, just in case 
	lookup[Uppercase( dtSeats:Program[iSeat] )] = iSeat
);