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

📄 machine.cpp

📁 常用算法与数据结构原代码
💻 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 + -