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

原创 2006年06月12日 12:50:00
作业调度问题深度搜索定界算法

深度搜索定界

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

Pascal代码实现:http://blog.csdn.net/jq0123/archive/2006/06/05/773593.aspx

本文用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;
}
版权声明:

相关文章推荐

给一个IP地址,如何划分为几个子网?

1、基本知识介绍1.1网络中的每一个主机或路由器至少有一个IP地址;在Internet中不允许有两个设备具有同样的IP地址;1.2IP地址采用分层结构;IP地址是由网络号(net ID)与主机号(ho...

一道IP组网题---- 子网掩码

24位: 11111111 11111111 11111111 00000000        192.168.1.0 ~ 192.168.1.25529位: 11111111 11111111 11...

TCP/IP详解(一)---入门知识

什么是TCP/IP? 我们常说的TCP/IP协议并不是单指TCP协议和IP协议,而是指一组协议簇,其中包含了但不仅限于:TCP协议、IP协议、ICMP协议、POP协议、SMTP协议、FTP协议等。关于...

TCP/IP详解学习笔记(1)-基本概念

为什么会有TCP/IP协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。...

集线器、交换机、路由器 之 你的女友小芳版

某一天,你到你女友小芳(暂定这个名字吧)就读的学校去找她,那么你的做法是什么呢:一、集线器的工作方式:你站到学校中庭,大喊一声“小芳,我来你找你了!” (广播)如果这个时候正好有别人也在大喊大叫,你就...

IP地址子网划分终极讲解(笔记)

1.学习子网前的准备知识-什么是数制 现场讲解版二进制和十进制的关系 二进制和十六进制的关系 16进制的每个位是2进制的4位 F=1111 二进制转16进制,按上面4位一组分...

IP地址的分类——a,b,c 类是如何划分的

现在的IP网络使用32位地址,以点分十进制表示,如172.16.0.0。地址格式为:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址。 IP地址类型 最初设计互联网络时,为了便...

TCP/IP之TCP协议(3):流量控制(滑动窗口协议)

一、流量控制(滑动窗口协议) 1、流量控制是管理两端的流量,以免会产生发送过块导致收端溢出,或者因收端处理太快而浪费时间的状态。用的是:滑动窗口,以字节为单位2、窗口有3种动作:展开(右边向右),合拢...

折半查找

折半查找算法举例  对给定数列(有序){ 3,5,11,17,21,23,28,30,32,50},按折半查找算法,查找关键字值为30的数据元素。   折半查找的算法讨论:   优点: ASL≤log...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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