回溯法 解 作业分配问题

作业分配问题之回溯算法 1 问题描述 有n份作业分配给n个人去完成,每人完成一份作业。假定第i个人完成第j份作业需要花费cij时间, cij>0,1≦i,j≦n。试设计一个回溯算法,将n份作业分配给n个人完成,使得总花费时间最短。 2 算法实现 import java.io.*; import java.util.*; public class Demo { public int n; /... 阅读详情

运行环境: Windows XP,(开发环境:VC6.0)
运行过程说明: jobAssignBacktrack.exe
输入源数据文件路径+文件名
在同目录下可以查看输出文件output.txt
★问题描述 有n份作业分配给n个人去完成,每人完成一份作业。假定第i个人完成第j份作业需要花费cij时间,cij>0,1≦i,j≦n。试设计一个回溯算法,将n份作业分配给n个人完成,使得总花费时间最短。
★格式输入 由文件input.txt给出输入数据。第一行有1 个正整数n (1≤n≤100)。
接下来的n行,每行n个数,表示工作费用。
★格式输出 将计算出的结果输出到文件output.txt。
★示例输入输出 5
50 87 62 56 92
43 22 98 57 36
1 5 97 96 43
58 62 27 73 27
60 71 38 71 95

144
工人: 1 执行任务: 4
工人: 2 执行任务: 2
工人: 3 执行任务: 1
工人: 4 执行任务: 5
工人: 5 执行任务: 3
★算法设计(包括算法设计过程中相关内容的说明、数据结构的选择、 算法详细描述及算法分析):
●1.设计说明:
算法中使用job[i]记录作业i是否已被分配,若被分配则置1,不必再搜索其分支;、
assign(int k,unsigned int cost) cost用来记录当前作业分配的开销,作为参数传递给下一层递归调用。
●2.算法设计:
●2.1数据结构:
#define N 100 //N表示最大任务数和工人数
int c[N][N]; //c[i][j] 表示工人i执行作业j所用的时间
unsigned int mincost = 65535; //设置的初始值,大于可能的费用
int task[N], //当前作业分配情况: 工人i执行task[i]
bestSolution[N], //最优作业分配情况: 工人i执行作业bestSolution[i]
job[N]; //记录作业是否已被分配给工人,1表示已分配,0为分配
int njob; //实际工作、工人数
主要操作:
void input(int& njob, int c[][N]); //读入工人、作业数njob,开销矩阵c[][N]
//初始化task,bestSolution,job,读入工人、作业数njob,开销矩阵c[][N]
void initData(int* task, int* bestSolution, int* job, int& njob, int c[][N]);
void assign(int k,unsigned int cost); //为工人k分配作业,cost:当前作业分配后的花费
//输出结果:mincost、作业分配情况
void outputResult(int minCost,int njob, int* bestSolution);
●2.2算法描述:
void assign(int k,unsigned int cost) //为工人k分配作业,cost:当前作业分配后的花费
{
int i;
if(k > njob && cost < mincost) //搜索至叶节点,判断是否更优
{
mincost = cost;
for(i=1; i<=njob; i++)
bestSolution[i] = task[i];
}
else
{
for(i=1;i<=njob;i++)
{
if(job[i]==0 && cost+c[k][i])//约束函数,job[i]==0则为被分配
{
job[i] = 1; task[k] = i;
assign(k+1,cost+c[k][i]);
job[i] = 0; task[k] = 0;
}
}
}
}
●2.3算法分析
本算法的最坏时间复杂度为:O(n!)
最坏空间复杂度为:O(n)

 

 

 

以下的代码稍作改变,用于c[i][j]表示作业i由工人j完成的情况

多机调度问题 贪心算法解决 C++ 问题:设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工处理。作业i所需时间为Ti. 约定:任何作业可以在任何一台机器上加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。要求给出一种作业执行次序,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。要求:随机生成n个作业相关信息,并计算由m台机器处理的最短时间。分析思路:daidai贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先 阅读详情

相关推荐

【回溯法】批处理作业调度问题

给定n个作业的集合J=(J1,J2,...,Jn)。每一个作业Ji都有两项任务分别在2台机器上完成。每个作业必须先由机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji;i=1,2,...n;j=1,2。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的

代码不说谎 5401

算法第四次作业-分支限界法求解作业分配问题

一、运行环境: Win7、Spyder、Python3.7 二、运行过程说明: 数据文件格式:输入数据来源于文件,input_assign04_0*.dat。文件内是n*n矩阵的元素,每行的元素代表每个工人完成该任务所需要的时间,每列代表某个工人完成每个工作需要的时间,读出的数据放在嵌套了列表的列表matrix中。 输入格式: 在Spyder中运行程序,输入测试数据集文件编号。...

小红花yu 9290

工作分配问题(回溯法)

Description 有n件工作分配给n个人,将工作i分配给第j个人需要支付劳务费用Cij。请为每人分配一个工作,并使得总劳务费用达到最小。 输入格式 第一行一个正整数n(1<=n<=11),表示n个工作数,接下来n行,每行代表第i个工作支付给n个不同的人的劳务费用。 输出格式 两行。 第一行为最小的总劳务费用。 第二行有n个数,表示工作分配方案。 ...

Alchemist的博客 2168

算法第四次作业-回溯法求解作业分配问题

一、运行环境: Win7、Spyder、Python3.7 二、运行过程说明: 数据文件格式:输入数据来源于文件,input_assign04_0*.dat。文件内是n*n矩阵的元素,每行的元素代表每个工人完成该任务所需要的时间,每列代表某个工人完成每个工作需要的时间,读出的数据放在嵌套了列表的列表matrix中。 输入格式: 在Spyder中运行程序,输入测试数据集文件编号。 或...

小红花yu 4024

vs2017\vs2019 回溯法解决作业分配问题 C++

这是针对于博客vs2017安装和使用教程(详细)和vs2019安装和使用教程(详细)的回溯法解决作业分配问题的示例 目录 一、问题描述 二、要求 三、提示 四、运行环境 五、运行过程说明 *六、算法设计 七、数据结构设计 八、算法伪代码 九、代码 十、测试文件 十一、测试结果 一、问题描述 有n份作业分配给n个人去完成,每人完成一份作业。假定第i个人完成第j份作业需要花...

黄笳倞的博客 5130

Python写的作业分配求解工具:回溯法找最优人任务匹配,带5组测试数据和直接能运行的exe

一个用纯Python标准语法实现的作业分配问题求解工具,解决n个人分配n项任务的一对一最优匹配问题,目标是让总成本最低。核心算法采用回溯法,包含完整的递归搜索框架、剪枝逻辑(如当前路径成本已超最优解则提前终止)以及每一步选择和状态变化的详细输出,方便跟踪执行过程、理解回溯思想。资源里附带5个不同规模的成本矩阵测试文件(input_assgin04_*.dat),覆盖小到中等规模场景;同时提供打包好的Windows可执行程序(4_01.exe),双击就能跑,也附带完整源码(4_01.py)供学习修改。不需要安

o0p1q2r3的博客 234

​相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界​

相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界 ​ 在学习算法的过程中,递归、分治、动态规划、贪心、回溯、分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们之间还是有一些不同之处的。 一、算法思想 1.递归算法(recursion algorithm) 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。 直接或间接地调用自身的算法称为递归算

wangprince2017 646

Java实现分支限界法解决作业分配问题

分支限界法是一种用来解决组合优化问题的算法,与回溯法类似,但更注重于效率。其基本思想是系统地枚举所有可能的候选解,并用限界函数排除不可能产生最优解的候选解,以此减少搜索空间和加快求解过程。作业分配问题(Job Assignment Problem)是一类典型的运筹学问题,它涉及到资源优化配置的基本概念。在这个问题中,通常有一组作业(tasks)需要被分配给一组工人(workers)或者机器(machines)来执行。每个作业可以由任何一个工人执行,但每个工人在同一时间只能执行一个作业。

weixin_35987118的博客 1187

c语言-回溯法解决工作分配问题

问题描述 设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij。 试设计一个算法,为每个人都分配1件不同的工作,并使总费用达到最小。 算法设计: 设计一个算法,对于给定的工作费用,计算最佳工作分配方案,使总费用达到最小。 数据输入: 由文件input.txt给出输入数据。第一行有1个正整数n(1<=n<=20)。接下来的n行,每行n个数,表示工作费用。 结果输出: 将计算的最小总费用输出到文件output.txt。 输入文件示例 input.txt outpu

weixin_44924819的博客 3629

n个工人作业分配问题回溯算法python实现-有解析过程

n个作业分配给n个人,这是有解析过程的一版,无解析过程的一版,请进入个人主页下载。18级学姐自主完成的算法作业,呕心沥血,基于四舍五入等于0基础的python实现,如果在语言规范上存在不足,那就。就憋着!哈哈哈哈哈,代码仅供参考,自己亲自码代码更酸爽!

C++ 回溯法解决作业分配问题

C++回溯法解决作业分配问题 包含了代码、算法分析、测试文件和结果,非常详尽,值得拥有!

回溯法实现n份作业分配给n个人完成的问题

问题描述: 有n份作业分配给n个人去完成,每人完成一份作业。假定第i个人完成第j份作业需要花费cij时间, cij>0,1≦i,j≦n。试设计一个回溯算法,将n份作业分配给n个人完成,使得总花费时间最短。 问题思路: n分作业分配给n个人,共有A!中排列方式,深度优先遍历其排列数,如果遍历的路径已经比当前最小的话费则舍弃对当前路径的遍历,返回上层节点,寻找合适的路径,即回溯...

weixin_30602505的博客 2029

北京工业大学--算法作业5--分支界限法--任务分配--Java

北京工业大学--算法作业5--分支界限法--任务分配--Java 有n份作业分配给n个人去完成,每人完成一份作业。假定第i个人完成第j份作业需要花费cij时间, cij>0,1≦i,j≦n。试设计一个回溯算法,将n份作业分配给n个人完成,使得总花费时间最短。 请用分支界限法解决此问题。

回溯法实现最佳调度问题

使用回溯法实现最佳调度问题

qq_57669041的博客 3730

获取B站某用户更多的关注数和粉丝数

获取B站某用户更多的关注数和粉丝数 相关记录 一、 前言 B 站最多只能翻 5 页用户的关注数和粉丝数,如何能够看到更多呢。 方法我也是从网上翻来的,记载博客里,算是我研究过这个话题了。 二、需要的东西 关注数的 api https://api.bilibili.com/x/relation/followings?vmid=2884629&pn=1&ps=20&order=desc&jsonp=jsonp 关注者(粉丝)的 api https://api.bilibili.

Enderman_xiaohei的博客 4817

在LinuxMint 22.1(Ubuntu24.04)上安装使用同花顺远航版

Linux用户成功在LinuxMint22.1系统上通过Wine9.0运行同花顺远航版,解决了长期困扰的股票行情软件问题。此前Linux原生版同花顺功能简陋且停止更新,Wine版通达信存在显示问题。作者作为自由软件支持者,通过调整Wine配置文件解决了高分屏显示异常问题,实现了远航版的正常使用。期待同花顺能重启Linux原生版开发,支持更多处理器架构,完善国产软件生态。该方案为Linux股票软件用户提供了实用参考。

5129

作业分配(回溯法)

有n份作业分配给n个人去完成,每人完成一份作业。假定第i个人完成第j份作业需要花费cij时间, cij>0,1≦i,j≦n。试设计一个回溯算法,将n份作业分配给n个人完成,使得总花费时间最短。 C++实现:/* * Author: qinwu * Created Time: 2017/4/30 22:45:25 * File Name: Solution.cpp */ #include

qw___的博客 3234

记录:N10激光雷达串口编程,将数据存进 SQLite,并进行 ROS2 - cartographer 单雷达建图

N10 系列采用 TOF(time of flight)测距原理,通过测量调制激光的发射、返回时间差来测量物体与传感器的相对距离。激光发射器发出调制脉冲激光,内部定时器开始 从t1时刻计算时间,当激光照射到目标物体后,部分能量返回,当雷达接收到返回的激光信号时,在t2时刻停止内部定时器计时,光速C,激光雷达到达物体的距离D为:经过N10系列激光雷达内嵌的信号处理单元的实时解算得到探测物体的距离值,结合高精度自适应角度测量模块输出的角度信息,可以得到量程内周围 360 度环境 的二维平面信息。

m0_74013893的博客 1096

几种作业调度问题总结

★流水作业调度(动态规划) ★多机调度问题 (贪心算法) ★批处理作业调度 (回溯法)

sqjddb的博客 4146

使用pdfBox实现pdf转图片出现中文方块乱码 简单修改源码解决

参考文章 问题排查:使用pdfbox将pdf转image时STSong-Light字体中文乱码 pdfbox版本是2.0 日志中打印出类似这样的日志(例:Using fallback XXX for CID-keyed font STSong-Light),就说明系统没有安装STSong-Light字体,pdfbox使用XXX字体来替代了。如果出现方块,就说明没有这种字体,并且替代字体也没有,日志也有相应的其他提示。 正常操作就是安装缺失的 STSong-Light 字体,但是在网上搜到的都是 STSong

aji_csdn的博客 5266

Unity 升级引擎版本后构建报错:script class layout is incompatible between the editor and the player

Unity升级引擎版本后,项目报错:script class layout is incompatible between the editor and the player。

学习与分享 592

多机调度问题最优解(回溯法)

1.设计方案 从n个作业中找出有最小完成时间和的作业调度,所以批处理作业调度问题的解空间是一棵排列树。按照回溯法搜索排列树的算法框架,设开始时t=[1,2,... ,n]是所给的n个作业的完成时间,则相应的排列树由t[1:n]的所有排列构成。 数组len[]用于存储一组空间解,comp()函数用于计算一个完整调度的完成时间,search()函数用来做搜索,best记录相应的当前最佳作业调度完成时间。 当dep>n时,算法搜索至叶子结点,得到一个新的作业调度方案。此时算法适时更新当前最优值和相..

m0_57319279的博客 1973

PCB 传输线教程(上):基于 Polar Si9000 与嘉立创工艺的传输线设计

理论线宽是W1,但在实际制作时,铜线顶部会有部分被刻蚀掉,表面被刻蚀后的宽度表示为W2,一般取经验值W2=W1-1,单位为 mil,Si9000 里面默认也是采用 W1,W2 相差 1 mil 的方式进行计算。表面阻抗结构就是简单的在一个平面上走信号线,以另外一个平面为地平面,信号线所在平面不进行铺铜(或铺铜间距大到可以忽略不计),这是最简单的一种结构,只需要知道介质层的厚度和介电常数、信号线厚度就可以进行阻抗计算。这个也是经验值,一般保持默认,或者可以填入 C1 相同的值(即忽略堆积)。

Surrea1的博客 1万+

北京工业大学研究生算法作业(四)——回溯法作业分配

Readme 运行环境: Win10+python3.7.3 IDE:Pycharm 分析设计: 有n份作业分配给n个人去完成,每人完成一份作业。 假定第i个人完成第j份作业需要花费cij时间,cij>0,1≦i,j≦n。试设计一个回溯算法,将n份作业分配给n个人完成,使得总花费时间最少。 这是一个寻找最优解的问题,通常的解决办法就是穷举出所有结果,找出最优解 数据结构: 输入数据来源于文件...

qzzqcz的博客 653

【腾讯小龙虾WorkBuddy专栏04】一文搞懂WorkBuddy的「专家」和「专家团」

WorkBuddy专家与专家团:专业级AI协作解决方案 WorkBuddy的专家(Expert)与专家团(Expert Team)功能颠覆了通用AI的局限性,提供角色化、可交付的专业服务。 核心优势 专家:深度垂直领域的AI顾问,具备人设、方法论、工具链,如全栈开发专家能直接交付完整项目,而非代码片段。 专家团:多智能体协作,自动拆解复杂任务(如竞品分析、全栈开发)并分发给对应角色,并行执行后整合输出,效率提升显著。 使用场景 单专家:解决专业问题(如SQL优化、UI设计)。

AI人人懂 2010

CAPL学习之路-关键字

在capl中,关键字具有特殊的含义和用途,因此,不得将关键字用作变量或函数的名称 声明数据类型的关键字 可以用不同的关键字,声明或引用不同类型的数据 byte 声明一个字节的变量 word 声明两个字节的变量 dword 声明四个字节的变量 int 声明两个字节的整数 long 声明四个字节的变量 qword 声明八个字节的变量 char 声明一个字符串 float 声明一个浮点数,8个字节 double 声明一个浮点数,8个字节 定义一个结构体或枚举类型 struct struct Data { .

jasonj333 6107
上一篇: int float double 各类型的最大值最小值
下一篇: 用位操作解人员派遣问题
生无涯
博客等级 码龄16年 62粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值