假期 2020.01.21
题目描述
有k个机器零件{n1,n2,n3,…,nk},都需要现在1号机器上加工,然后再在2号机器上加工,求解如何安排加工方式可以使得消耗时间最少。
思路分析
- 如图,举例初始条件如下
- 举例两个顺序
我们会发现顺序不一样很大可能造成消耗时间不一样,并且在机器二上的消耗时间是基于当前机器一与机器二上的消耗时间的较大值作为基数,再增加机器二上面的耗时。 - 即f2 = max( f1 , f2 ) + current_secondtime;
算法分析
根据以上可得f2 = max( f1 , f2 ) + current_secondtime;
并且在满足f2小于最优值best_time时,可继续进一步搜索,而当f2大于best_time时,不需要进一步搜索了,因为此时任意增加一个零件,都会使f2大于当前的最优值,即后面不会出现最优解。
代码解析
#include<iostream>
#include<algorithm>
using namespace std;
constexpr int Maxsize = 100;
typedef struct Node {
int time_start;
int time_end;
}Data_part;
Data_part Time_part[Maxsize];
int Count_part,best_time,f1 = 0,f2 = 0;//零件个数,最优时间消耗,当前消耗时间,机器一耗时,机器二耗时
int Choice_part[Maxsize];//已被选择器件处理顺序
int Current_part[Maxsize];//存储临时选择顺序
void Re_search(int i);//查找函数
int main()
{
int i, j;
cout << "请输入零件个数: ";
cin >> Count_part;
cout << "请输入每一个零件在机器一与机器二上的消耗时间(用空格分开):" << endl;
for (i = 1; i <= Count_part; i++)
{
cin >> Time_part[i].time_start >> Time_part[i].time_end;
Current_part[i] = i;
}
best_time = 0x0fffffff;
memset(Choice_part, 0, sizeof(Choice_part));
Re_search(1);
cout << "最优加工顺序是:";
for (i = 1; i <= Count_part; i++)
cout << Choice_part[i] << " ";
cout << endl;
cout << "最优加工时间是:" << best_time << endl;
return 0;
}
void Re_search(int i)
{
if (i > Count_part)
{
for (int j = 1; j <= Count_part; j++)
Choice_part[j] = Current_part[j];
best_time = f2;
return;
}
else {
for (int j = i; j <= Count_part; j++)
{
f1 += Time_part[Current_part[j]].time_start;//机器一时间消耗累计
int temp = f2;//暂时存储f2消耗时间
f2 = max(f1, f2) + Time_part[Current_part[j]].time_end;//机器二时间消耗累计
if (f2 < best_time)
{
int temp = Current_part[j];
Current_part[j] = Current_part[i];
Current_part[i] = temp;
Re_search(i + 1);//下一个器件处理
Current_part[i] = Current_part[j];
Current_part[j] = temp;//回溯
}
f1 -= Time_part[Current_part[j]].time_start;//回溯
f2 = temp;
}
}
return;
}
运行结果
来源:CSDN
作者:德林恩宝
链接:https://blog.csdn.net/qq_44116998/article/details/104060997