作业调度问题深度搜索定界算法

转载 2006年06月15日 10:08:00



深度搜索定界

设有n台处理机p1,p2,......pn,和m个作业j1,j2,...jm,处理机可并行工作,作业未完成不能中断,作业ji在处理机上的处理时间为ti,求解最佳方案,使得完成m项工作的时间最短?

本文用C++实现,方便C/C++读者。

上界定得很松:
    g_dMaxTime = g_dRestJobTime;
所以速度会慢一点。

可以应用迭代加深使搜索更快。
即开始时将上界定为最紧:
    g_dRestJobTime / g_nProcessor
搜索不成功再迭代放宽上界。

没有保存作业分配方案,只有时间值。

/*

http://it.pjschool.com.cn/Article/ArticleShow.asp?ArticleID=231
http://blog.csdn.net/jq0123/archive/2006/06/05/773593.aspx

深度搜索定界

例2:设定有n台处理机p1,p2,......pn,和m个作业j1,j2,...jm,处理机可并行工作,作业未完成不能中断,作业ji在处理机上的处理时间为ti,求解最佳方案,使得完成m项工作的时间最短?

说明:本题有两重搜索法,搜索处理机和搜索作业,当m,n较大时,搜索处理机不可能?搜索作业容易确定上下界,容易剪支。

若输入文件是:

3  6
11 7 5  5  4 7

输出结果如下:

7 7

5 5 4

11

time=14 

*/

#include <cstdlib>
#include <iostream>
#include <vector>
#include <fstream>
#include <iterator>
#include <numeric>

using namespace std;

// input parameters
int g_nProcessor;
int g_nJob;

typedef vector<double> D_VEC;
D_VEC g_vJobTime;
// end of input parameters

// search state
double g_dMaxTime;
typedef vector<bool> BOOL_VEC;
BOOL_VEC g_vJobDone;
int g_iCurProc;    // as search depth
D_VEC g_vProcUsedTime;
double g_dRestJobTime;
// end of search state

void PrepareSearch()
{
    g_dRestJobTime = accumulate(g_vJobTime.begin(), g_vJobTime.end(), 0.0);
    g_dMaxTime = g_dRestJobTime;
    g_vJobDone = BOOL_VEC(g_nJob, false);
    g_iCurProc = 0;
    g_vProcUsedTime = D_VEC(g_nProcessor, 0);
}

void ReadParams()
{
    ifstream cin("input.txt");
    cin >> g_nProcessor >> g_nJob;

    double dTime;
    for (int i = 0; i < g_nJob; i++)
    {
        cin >> dTime;
        g_vJobTime.push_back(dTime);
    }
}

bool AddJob(int iJob)
{
    g_vProcUsedTime[g_iCurProc] += g_vJobTime[iJob];
    g_dRestJobTime -= g_vJobTime[iJob];
}

void DelJob(int iJob)
{
    g_vProcUsedTime[g_iCurProc] -= g_vJobTime[iJob];
    g_dRestJobTime += g_vJobTime[iJob];
}

/*
Return false if add job bounce the limit:
1. g_vProcUsedTime[] descend
2. g_vProcUsedTime[1] less than MaxTime
*/
bool CanAddJob(int iJob)
{
    double dNewTime = g_vProcUsedTime[g_iCurProc] + g_vJobTime[iJob];
    if (0 == g_iCurProc)
        return dNewTime < g_dMaxTime;
    else
        return dNewTime <= g_vProcUsedTime[g_iCurProc - 1];
}

// Assign nFromJob..MAX to current processor
// Go next proc if all job tried.
void SearchFromJob(int iFromJob)
{
    if (g_nProcessor == g_iCurProc)
    {
        // all proc assigned, update max time
        if (g_dRestJobTime > 0) return;
        if (g_dMaxTime > g_vProcUsedTime[0])
            g_dMaxTime = g_vProcUsedTime[0];
        cout << "(DEBUG)MaxTime: " << g_dMaxTime << endl; // debug
        return;
    }

    /* / debug
    cout << "CurProc " << g_iCurProc
      << " : search From job " << iFromJob << endl;
    cout << "Job done list: ";
    copy(g_vJobDone.begin(), g_vJobDone.end(),
        ostream_iterator<int>(cout, " "));
    cout << endl;
    cout << "Proc used time: ";
    copy(g_vProcUsedTime.begin(), g_vProcUsedTime.end(),
        ostream_iterator<double>(cout, " "));
    cout << endl;
    */
   
    for (int i = iFromJob; i < g_nJob; i++)
    {
        if (g_vJobDone[i]) continue;
        if (!CanAddJob(i)) continue;

        AddJob(i);
        g_vJobDone[i] = true;
        SearchFromJob(i + 1);
        g_vJobDone[i] = false;
        DelJob(i);
    }

    // current proc assigned, search from next proc
    int nProcRest = g_nProcessor - 1 - g_iCurProc;
    double dMaxRestTime = nProcRest * g_vProcUsedTime[g_iCurProc];
    if (dMaxRestTime < g_dRestJobTime)
        return; // stop this branch
    g_iCurProc++;
    SearchFromJob(0);
    g_iCurProc--;
}

int main(int argc, char *argv[])
{
    ReadParams();
    PrepareSearch();
    SearchFromJob(0);
   
    cout << "Max time: " << g_dMaxTime << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

作业调度问题深度搜索定界算法

作业调度问题深度搜索定界算法深度搜索定界设有n台处理机p1,p2,......pn,和m个作业j1,j2,...jm,处理机可并行工作,作业未完成不能中断,作业ji在处理机上的处理时间为ti,求解最佳...
  • jq0123
  • jq0123
  • 2006年06月12日 12:50
  • 2535

算法设计之流水作业调度问题Johnson算法结论

本来不想写这个的,不过想想还是写写吧,今天上午考了算法设计的试卷,考试比较平稳,说难其实并不是很难,就是量稍微大了些,其中有一题考到了流水作业调度问题,给出一组工作序列,要求写出他们的最优排列。 很...
  • zhyh1435589631
  • zhyh1435589631
  • 2015年06月12日 19:29
  • 1035

分支定界之深度搜索定界

深度搜索定界原文 http://it.pjschool.com.cn/Article/ArticleShow.asp?ArticleID=231原文题为分支定界, 深度搜索定界是其中例2, 例1代码已...
  • jq0123
  • jq0123
  • 2006年06月05日 09:18
  • 3811

poj 2751 双机调度问题Johnson算法(贪心)

题意: 2台机器,n件任务,每件任务必须先在S1上做,再在S2上做。任务之间先做后做任意。求最早的完工时间。 分析:         这是一个经典问题:2台机器的情况下有多项式算法(Johnso...
  • sepNINE
  • sepNINE
  • 2015年06月22日 15:43
  • 1286

流水线调度dp问题

流水线调度 Assembly-Lines-Scheduling 问题:生产产品X需要经过m道手续,现在有两条流水线,每条流水线上m个站点,对应的站点功能相同, p[i][j]表示在第i条流水线上第...
  • BeforeEasy
  • BeforeEasy
  • 2016年08月31日 19:25
  • 769

分支定界法 广度搜索定界 深度搜索定界

分支定界法的思想是:首先确定目标值的上下界,边搜索边减掉搜索树的某些支,提高搜索效率。 2.1 广度搜索定界 例1:设有A,B,C,D,E 5人从事j1,j2,j3,j4,j5 5项工作每...
  • songyux6
  • songyux6
  • 2013年03月17日 08:23
  • 735

算法之旅 动态规划之车间调度问题

动态规划之车间调度问题 真言 哎呀,大家好。憋了我久了,终于回校了,回校以后真不想说我的大学了,你说我回来这么早来准备面试,你给供暖不行呀,暖气冰凉冰凉的,你想冻死学生呀,学生...
  • cqs_2012
  • cqs_2012
  • 2014年02月14日 22:28
  • 2724

—【贪心算法】多机调度问题

0026算法笔记——【贪心算法】多机调度问题 分类: 算法2013-03-30 17:51 382人阅读 评论(0) 收藏 举报 多机调度问题算法笔记贪心算法最小堆     ...
  • pi9nc
  • pi9nc
  • 2013年08月04日 21:16
  • 2183

五大常用算法之分支定界法

看了五大常用算法之一这篇博文,感觉理解了很多,可是纯粹都是理论,缺少一些示例,所以准备综合一篇博文,以帮助自己记忆,原文: 一、基本描述     类似于回溯法,也是一种在问题的解空...
  • feiyangtianyao
  • feiyangtianyao
  • 2014年06月29日 16:51
  • 9929

算法导论-任务调度问题

问题描述: 在单处理器上具有期限和惩罚的单位时间任务调度问题(课本P239) 实验要求: (1)实现这个问题的贪心算法 (2)将每个 wi 替换为max{...
  • a342500329a
  • a342500329a
  • 2016年05月25日 14:56
  • 1465
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:作业调度问题深度搜索定界算法
举报原因:
原因补充:

(最多只允许输入30个字)