⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 machine.cpp

📁 data structures, algorithms and Application书的源代码
💻 CPP
字号:
// machine shop simulation

#include <iostream.h>
#include "lqueue.h"
#include "xcept.h"
#include "job.h"
#include "machine.h"
#include "eventl.h"

// globals
long Now = 0;           // current time
int m;                  // number of machines
long n;                 // number of jobs
long LargeTime = 10000; // finish before this time
EventList *EL;          // pointer to event list
Machine *M;             // array of machines

bool MoveToNextMachine(Job *J)
{// Move J to machine for next task.
 // Return false if no next machine for this job.
  if (J->TaskQ.IsEmpty()) {// no next task
     cout << "Job " << J->ID << " has completed at "
          << Now << " Total wait was "
          << (Now-J->Length) << endl;
     return false;}
  else {// job has a next task
        // get machine for next task
        int p = J->TaskQ.First().machine;
        // put on p's wait queue
        M[p].AddJob(J);
        J->ArriveTime = Now;
        // if p idle, schedule immediately
        if (EL->NextEvent(p) == LargeTime) {
           // machine is idle
           ChangeState(p);}
        return true;}
}

Job* ChangeState(int p)
{// Task on machine p has finished, schedule next one.
 // Return last job.
   Job* LastJob;
   if (!M[p].Active) {// in idle or change-over state
      LastJob = 0;
      // wait over, ready for new job
      if (M[p].JobQ.IsEmpty()) // no waiting job
            EL->SetFinishTime(p,LargeTime);
      else {// take job off Q and work on it
         M[p].JobQ.Delete(M[p].Active);
         M[p].TotalWait +=
              Now - M[p].Active->ArriveTime;
         M[p].NumTasks++;
         long t = M[p].Active->DeleteTask();
         EL->SetFinishTime(p, Now + t);}
      }
   else {// task has just finished on M[p]
         // schedule change-over time
         LastJob = M[p].Active;
         M[p].Active = 0;
         EL->SetFinishTime(p, Now + M[p].ChangeTime);}
   return LastJob;
}

void InputData()
{// Input machine shop data.
   cout << "Enter number of machines and jobs" << endl;
   cin >> m >> n;
   if (m < 1 || n < 1) throw BadInput();

   // create event and machine queues
   EL = new EventList(m,LargeTime);
   M = new Machine [m+1];
   
   // input the machine wait times
   cout << "Enter change-over times for machines"
        << endl;
   for (int j = 1; j <= m; j++) {
      long ct;  // change-over time
      cin >> ct;
      if (ct < 0) throw BadInput();
      M[j].SetChange(ct);
      }
   // input the n jobs
   Job *J;
   for (int i = 1; i <= n; i++) {
      cout << "Enter number of tasks for job " << i
           << endl;
      int tasks;  // number of tasks
      int first;  // machine for first task of job
      cin >> tasks;
      if (tasks < 1) throw BadInput();
      J = new Job(i);
      cout << "Enter the tasks (machine, time)"
           << " in process order" << endl;
      for (int j = 1; j <= tasks; j++) {// get tasks
         int p;    // machine number
         long tt;  // task time
         cin >> p >> tt;
         if (p < 1 || p > m || tt < 1) throw BadInput();
         if (j == 1) first = p; // job's first machine
         J->AddTask(p,tt);  // add task to task queue
         }
      M[first].AddJob(J);   // add job to machine for
      }                     // first task
}

void StartShop()
{// Load first jobs onto each machine.
   for (int p = 1; p <= m; p++)
      ChangeState(p);
}

void Simulate()
{// Process all n jobs to completion.
   int p;
   long t;
   while (n) {// at least one job left
      EL->NextEvent(p,t); // next machine to finish
      Now = t; // present time
      // change job on machine p
      Job *J = ChangeState(p);
      // move job J to its next machine
      // decrement n if J has finished
      if (J && !MoveToNextMachine(J)) n--;
      }
}

void OutputStats()
{// Output wait times at machine.
   cout << "Finish time = " << Now << endl;
   long TotalWait, NumTasks;
   for (int p = 1; p <= m; p++) {
      M[p].Stats(TotalWait, NumTasks);
      cout << "Machine " << p << " completed "
           << NumTasks << " tasks" << endl;
      cout << "The total wait time was " << TotalWait;
      cout << endl << endl;
      }
}

void main(void)
{// Machine shop simulation.
   try {
      InputData();    // get machine and job data
      StartShop();    // initial machine loading
      Simulate();     // run all jobs through shop
      OutputStats();} // output macine wait times
   catch (...) {
      cout << "An exception has occurred" << endl;}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -