@@ -566,5 +566,107 @@ void ASP::inter_move(Solution &solution) {
566566 solution.objective += delta;
567567 }
568568
569+ assert (solution.test_feasibility (m_instance));
570+ }
571+
572+ void ASP::chain (Solution &solution) {
573+ for (size_t i = 0 ; i < m_instance.get_num_runways (); ++i){
574+ size_t best_runway_i = i;
575+ size_t best_runway_j = (i + 1 ) % m_instance.get_num_runways ();
576+
577+ size_t best_flight_i = 0 ;
578+ size_t best_flight_j = 0 ;
579+
580+ best_flight_i = rand () % solution.runways [best_runway_i].sequence .size ();
581+ best_flight_j = rand () % (solution.runways [best_runway_j].sequence .size () + 1 );
582+
583+ uint32_t original_penalty_i = solution.runways [best_runway_i].penalty ;
584+ uint32_t original_penalty_j = solution.runways [best_runway_j].penalty ;
585+
586+ solution.runways [best_runway_i].sequence [best_flight_i].get ().position = best_flight_j;
587+ solution.runways [best_runway_i].sequence [best_flight_i].get ().runway = best_runway_j;
588+ solution.runways [best_runway_i].prefix_penalty .pop_back ();
589+ solution.runways [best_runway_j].prefix_penalty .push_back (0 );
590+
591+ // Add to best_runway_j
592+ if (best_flight_j == solution.runways [best_runway_j].sequence .size ()) {
593+ solution.runways [best_runway_j].sequence .push_back (solution.runways [best_runway_i].sequence [best_flight_i]);
594+ } else {
595+ solution.runways [best_runway_j].sequence .push_back (m_dummy_flight);
596+
597+ for (size_t k = solution.runways [best_runway_j].sequence .size () - 1 ; k > best_flight_j; k--) {
598+ solution.runways [best_runway_j].sequence [k] = solution.runways [best_runway_j].sequence [k - 1 ];
599+ solution.runways [best_runway_j].sequence [k].get ().position = k;
600+ }
601+
602+ solution.runways [best_runway_j].sequence [best_flight_j] = solution.runways [best_runway_i].sequence [best_flight_i];
603+ }
604+
605+ // Remove from best_runway_i
606+ for (size_t k = best_flight_i; k + 1 < solution.runways [best_runway_i].sequence .size (); k++) {
607+ solution.runways [best_runway_i].sequence [k] = solution.runways [best_runway_i].sequence [k + 1 ];
608+ solution.runways [best_runway_i].sequence [k].get ().position = k;
609+ }
610+ solution.runways [best_runway_i].sequence .pop_back ();
611+
612+ // Update prefix best_runway_i
613+ if (best_flight_i == 0 ) {
614+ Flight ¤t_flight = solution.runways [best_runway_i].sequence [0 ].get ();
615+ current_flight.start_time = current_flight.get_release_time ();
616+ solution.runways [best_runway_i].prefix_penalty [1 ] = 0 ;
617+ best_flight_i++;
618+ }
619+
620+ for (size_t i = best_flight_i; i < solution.runways [best_runway_i].sequence .size (); i++) {
621+ Flight ¤t_flight = solution.runways [best_runway_i].sequence [i].get ();
622+ Flight &prev_flight = solution.runways [best_runway_i].sequence [i - 1 ].get ();
623+
624+ current_flight.start_time =
625+ std::max (current_flight.get_release_time (),
626+ prev_flight.start_time + prev_flight.get_runway_occupancy_time () +
627+ m_instance.get_separation_time (prev_flight.get_id (), current_flight.get_id ()));
628+
629+ solution.runways [best_runway_i].prefix_penalty [i + 1 ] =
630+ solution.runways [best_runway_i].prefix_penalty [i] +
631+ (current_flight.start_time - current_flight.get_release_time ()) * current_flight.get_delay_penalty ();
632+ }
633+
634+ // Update prefix best_runway_j
635+ if (best_flight_j == 0 ) {
636+ Flight ¤t_flight = solution.runways [best_runway_j].sequence [0 ].get ();
637+ current_flight.start_time = current_flight.get_release_time ();
638+ solution.runways [best_runway_j].prefix_penalty [1 ] = 0 ;
639+ best_flight_j++;
640+ }
641+
642+ for (size_t j = best_flight_j; j < solution.runways [best_runway_j].sequence .size (); j++) {
643+ Flight ¤t_flight = solution.runways [best_runway_j].sequence [j].get ();
644+ Flight &prev_flight = solution.runways [best_runway_j].sequence [j - 1 ].get ();
645+
646+ current_flight.start_time =
647+ std::max (current_flight.get_release_time (),
648+ prev_flight.start_time + prev_flight.get_runway_occupancy_time () +
649+ m_instance.get_separation_time (prev_flight.get_id (), current_flight.get_id ()));
650+
651+ solution.runways [best_runway_j].prefix_penalty [j + 1 ] =
652+ solution.runways [best_runway_j].prefix_penalty [j] +
653+ (current_flight.start_time - current_flight.get_release_time ()) * current_flight.get_delay_penalty ();
654+ }
655+
656+ // Update penaltys
657+ solution.runways [best_runway_i].penalty = solution.runways [best_runway_i].prefix_penalty .back ();
658+ solution.runways [best_runway_j].penalty = solution.runways [best_runway_j].prefix_penalty .back ();
659+
660+ uint32_t delta = 0 ;
661+
662+ if (solution.runways [best_runway_i].penalty + solution.runways [best_runway_j].penalty < original_penalty_i + original_penalty_j) {
663+ delta = original_penalty_i + original_penalty_j - (solution.runways [best_runway_i].penalty + solution.runways [best_runway_j].penalty );
664+ solution.objective -= delta;
665+ } else {
666+ delta = (solution.runways [best_runway_i].penalty + solution.runways [best_runway_j].penalty ) - (original_penalty_i + original_penalty_j);
667+ solution.objective += delta;
668+ }
669+ }
670+
569671 assert (solution.test_feasibility (m_instance));
570672}
0 commit comments