R Перейти к следующей итерации (два цикла для цикла перед текущей) в цикле, используя следующую - PullRequest
0 голосов
/ 28 апреля 2018

Я работаю над оптимизацией заказов на работу с матрицей приоритетов. Например; задание 8 не может быть выполнено до завершения задания 6. Если это так, моя матрица приоритетов на позиции [8,6] показывает единицу. Если нет отношения предшествования, например, для позиции [1,2], то оно показывает ноль.

В моем текущем коде я использую команду «next», чтобы перейти к следующей итерации, если матрица приоритетов показывает 1. Однако, как это запрограммировано сейчас, она просто переходит к следующему j, а я хочу, чтобы перейти к следующему «я» (следующая работа для рассмотрения). Тем не менее, i - это один цикл перед циклом if, где используется «next». Есть ли способ заставить его перейти в цикл for (i in n: jobs) вместо следующего for (j in n: jobs)?

Ниже моего текущего кода

# Initialisatie
nJobs = 10
jobDone = rep(FALSE, nJobs) 

currentJob = 1;
jobDone[currentJob] = TRUE;
totalFine = 0; 
finishingTime = durations[currentProject]

jobOrder = c(currentJob);
jobFines = c(totalFine);
jobIndFines = c(totalFine)
jobTimes = c(finishingTime)
jobIndTimes = c(durations[currentJob])

for(iter in 1:(nJobs-1))
{
  bestFine = -1;
  bestOrder = -1;

    for(i in 1:nJobs)
    {
      for(j in 1:nJobs){
      if(precedences[i,j] == 1){ next } #hoe kom ik nu naar de volgende i ipv de volgende j?
        else{

    if( ! jobDone[i]  )
    {
      # If this is the first option or the cheapest option, we update the best option
      if(bestOrder == -1 || ((finishingTime+durations[i])-deadlines[i])*fines[i] > bestFine) 
      {
        bestFine = ((finishingTime+durations[i])-deadlines[i])*fines[i];
        bestOrder = i;
      }
        }
      }


    }
  }
  # Add the best job to the order of jobs
  jobDone[bestOrder] = TRUE;
  jobOrder[iter+1] = bestOrder;
  # Update the current order of projects
  fine = ((finishingTime+durations[bestOrder])-deadlines[bestOrder])*fines[bestOrder]
  jobIndFines[iter+1] = fine
  if (fine>0){
    totalFine = totalFine + fine;
  }
  jobFines[iter+1] = totalFine;
  #jobIndFines[iter+1] = totalFine - jobFines[iter];
  finishingTime = finishingTime + durations[bestOrder];
  jobTimes[iter+1] = finishingTime
  jobIndTimes[iter+1] = durations[bestOrder]
}
totalFine
finishingTime
jobOrder
jobFines
jobTimes
jobIndTimes
jobDone
jobIndFines

Большое спасибо !!

1 Ответ

0 голосов
/ 28 апреля 2018

Попробуйте break.

Эти фрагменты кода иллюстрируют разницу между next и break.

next перезапускает цикл current со значения next index:

for (i in 1:2) {
  for (j in 1:2) {
    print(paste("j =", j))
    next
    print("Python is better than R at everything.") # Never prints, obviously.
  }
  print(paste("i =", i))
}
#> [1] "j = 1"
#> [1] "j = 2"
#> [1] "i = 1"
#> [1] "j = 1"
#> [1] "j = 2"
#> [1] "i = 2"

break полностью выводит вас из текущего цикла и передает управление следующему оператору вне цикла:

for (i in 1:2) {
  for (j in 1:2) {
    print(paste("j =", j))
    break
    print("Python is better than R at everything.") # Never prints, obviously.
  }
  print(paste("i =", i))
}
#> [1] "j = 1"
#> [1] "i = 1"
#> [1] "j = 1"
#> [1] "i = 2"
...