lptc.cpp

来自「自己编写的任务机调度问题的近似算法(包括了穷举+近似的算法)」· C++ 代码 · 共 98 行

CPP
98
字号
#include <iostream>
#include <algorithm>
#include <ctime>
const int N = 30;
int c = 3;
int m = 4;
int X[N];
int job[N] = {32,94,100,78,55,42,24,65,8,53};         // 各个任务的处理时间
int minTime = 10000;         //  记录穷举搜索的最优时间
int minMachine[N];   //  记录穷举搜索的最优调度的机器号码
using namespace std;

bool comp(const int& a,const int& b) // 逆序排序
{
	return a > b;
}

void traceback(int num)
{
	if(num == c){  // 找到一组解
		int maxProcessTime = 0;
		for(int j = 1; j <= m; j++){
			int temp = 0;
			for(int k = 0; k < c; k++){
				if(X[k] == j)
					temp += job[k];
			}
			if (temp > maxProcessTime )
				maxProcessTime = temp;
		}
		if (maxProcessTime < minTime){ // 更新,记录最优解
			minTime = maxProcessTime;
			printf("%d\n",minTime);
		
		for(int t = 0;  t < c; t++){
			minMachine[t] = X[t];
			printf("%d ",minMachine[t]);
		}
		printf("\n");
		}
		
	return;
	}
	for(int i = 1; i <= m; i++){
		X[num] = i;
		traceback(num+1);
	}
}



int main()
{
	int i,j;
	srand((unsigned)time(NULL)); 
	
	//for(i = 0; i < 10; i++)
	//	job[i] = rand()%100 + 1;
	//job = ;
	printf("调度前各个任务的处理时间\n");
	for(i = 0; i < 10; i++)   // 调度前各个任务的处理时间
		printf("%d\n",job[i]);
	printf("\n");
	printf("调度后的情况\n");
	sort(job,job+10,comp);      // 任务处理时间排序
	for(i = 0; i < 10; i++)   // 调度前各个任务的处理时间
		printf("%d ",job[i]);
	printf("\n");
	traceback(0);
	int time[N];           //  用来存储每台机器当前的任务量
	memset(time,0,sizeof(time));
	for(i = 0; i < c; i++)
		time[minMachine[i]] += job[i];

	// 处理剩余部分
	int min,k;
	for(i = c; i < 10; i++){
		min = time[1];
		k = 1;
		for(j = 2; j <= m; j++)
			if(time[j] < min){
				min = time[j];
				k = j;
			}
		minMachine[i] = k;
		time[k] += job[i];
	}
	int max = 0;
	printf("各个任务分配的机器\n");
	for(i = 0; i < 10; i++)
		printf("%d ",minMachine[i]);
	for(i = 1; i <= m; i++)
		if(time[i] > max)
			max = time[i];
	printf("处理的总时间:%d\n",max);
	traceback(0);
	return 0;
}

⌨️ 快捷键说明

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