独立任务最优调度问题-动态规划解决

问题描述:

用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai>bi,而对于某些j,j≠i,有aj>bj。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这2台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。研究一个实例:

(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。

对于给定的2台处理机A和B处理n个作业,找出一个最优调度方案,使2台机器处理完这n个作业的时间最短。//注意与车间调度不同
思路:
在利用动态规划算法之前先确定该问题手否具有最优子结构性质,当第n个物品加工时的最短时间为第n-1个物品加工时的最优解。
又因为在求解的过程中,第n个物品的解与第n-1个物品的解都有关所以要把他们存下来。而不是省略掉,注意与贪心算法的区别。在更新第n组解时, 当n物体选择A时得到的 Ax, 如果第n解中有(Ax, Ay),要对比 Ay与第n-1组解中的Ay,如过小就更新,如果选B亦同,最后迭代产生第n组解,选出来就好了.

如何搞最优解?
在做之前,想用一个函数来判断这个解怎么样,但是我能力有限;在看完别人的帖子之后,采用先确定A比较B,和确定B比较A的方式。代码中20-35行中体现.

搞出解空间,与元组的方式类似:(time_A, time_B)即(A运行的时间,B运行的时间),在c++中利用字典map表示,
代码:

#include 
#include 
#include 
#define Inf 0x7fffffff
using namespace std;
const int machine_number = 2;// 机器数
const int work_number = 6;//作业数
int information[machine_number][work_number] = {{2, 5, 7, 10, 5, 2}, {3, 8, 4, 11, 3, 4}};//初始数组
map<int, int> solution;//保存;
map<int, int>::iterator it;//迭代器
void Get_best_solution()//获得解解空间
{
    map<int, int> s;
    solution.insert(make_pair(0, 0));
    for(int i = 0; i < work_number; i++)
    {
        for(it = solution.begin(); it != solution.end(); it++)//当进行下一个工作时更新解空间
        {
            int first = it->first + information[0][i], second = it->second + information[1][i];//当物品选择A or B 时的时间花费
            if(s.count(first) == 1)//放在A上面
            {   //解空间中已存在,
                if(s[first] > it->second)//如果有比他更优的更新
                    s[first] = it->second;
            } else{
                    s.insert(make_pair(first, it->second));
                }
            if(s.count(it->first) == 1)//放在B上面
            {
                //解空间中已存在,
                if(s[it->first] > second)
                    s[it->first] = second;
            }
            else {
                s.insert(make_pair(it->first, second));
            }
        }
        solution.clear();
        solution = s;
        s.clear();
    }
}
int main()
{
    Get_best_solution();
    int Max_time = Inf;
    for(it = solution.begin(); it != solution.end(); it++)//获取最优解,map存储的性质将数据按key值排序
        if(max(it->first, it->second) < Max_time)
            Max_time = max(it->first, it->second);
    cout << "需要的最短时间为: " << Max_time << endl;
}

你可能感兴趣的:(算法,c++)