我是靠谱客的博主 复杂大神,最近开发中收集的这篇文章主要介绍任务分配——回溯法有n个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,第i个人执行第j个任务的成本是c[i][j](1<=i,j<=n)。求出总成本最小的一种方案。,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
有n个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,第i个人执行第j个任务的成本是c[i][j](1<=i,j<=n)。求出总成本最小的一种方案。
思路:解空间为子集树,用回溯法(dfs)搜索所有方案取最优解
//解空间为子集树
#include<iostream>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 21
int n=4;//任务数量
//第i个人执行第j个任务的成本
int c[MAXN][MAXN]={{0},{0,9,2,7,8},{0,6,4,3,7},{0,5,8,1,8},{0,7,6,9,4}};
int x[MAXN];//临时解
int cost=0;//临时解的成本
int bestx[MAXN];//最优解
int mincost=INF;//最优解的成本
bool worker[MAXN];//worker[j]表示任务j是否已分配人员
void dfs(int i){
if(i>n){
if(cost<mincost){
mincost=cost;
for(int k=1;k<=n;k++){
bestx[k]=x[k];
}
}
}
else{
for(int j=1;j<=n;j++){ //为人员i试探任务j,从1到n
if(!worker[j]){ //任务j还未分配
worker[j]=true;
cost+=c[i][j];
x[i]=j;
dfs(i+1);
//回溯
worker[j]=false;
cost-=c[i][j];
x[i]=0;
}
}
}
}
int main()
{
memset(worker,false,sizeof(worker));//任务还未分配
dfs(1);
cout<<"最优方案:"<<endl;
for(int k=1;k<=n;k++){
cout<<"第"<<k<<"个人安排任务"<<bestx[k]<<endl;
}
cout<<"总成本为:"<<mincost<<endl;
}
最后
以上就是复杂大神为你收集整理的任务分配——回溯法有n个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,第i个人执行第j个任务的成本是c[i][j](1<=i,j<=n)。求出总成本最小的一种方案。的全部内容,希望文章能够帮你解决任务分配——回溯法有n个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,第i个人执行第j个任务的成本是c[i][j](1<=i,j<=n)。求出总成本最小的一种方案。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复