|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- # -*- coding: utf-8 -*-
- """
- Created on Sun Apr 2 09:20:43 2017
- @author: xuxi
- """
- def assign(k,cost,n,mincost,c,job,task,bestSolution):
- if (k > n and cost < mincost):
- mincost = cost
- for i in range(n):
- bestSolution[i+1] = task[i+1]
- else:
- for i in range(n):
- if (job[i+1] == 0 and (cost+int(c[k-1][i]))>0):
- job[i+1] = 1
- task[k] = i + 1
- assign(k+1,cost+int(c[k-1][i]),n,mincost,c,job,task,bestSolution)
- job[i+1] = 0
- task[k] = 0
- #return mincost,bestSolution
-
- def output(mincost,n,bestSolution):
- print('最小总费用%s'%mincost)
- for i in range(n):
- print('员工:%s执行任务%s'%(i+1,bestSolution[i+1]))
- def main():
- f = open('input_assign04_01.dat')
- c = []
- for item in f.readlines():
- c.append(item.rstrip('\n').split())
- n = len(c)
- mincost = 65535
- job = []
- task = []
- bestSolution = []
- for i in range(n+1):
- job.append(0)
- task.append(0)
- bestSolution.append(0)
- assign(1,0,n,mincost,c,job,task,bestSolution)
- output(mincost,n,bestSolution)
-
- if __name__ == '__main__':
- main()
复制代码
问题为:有n份作业分配给n个人去完成,每人完成一份作业。假定第i个人完成第j份作业需要花费cij时间,cij>0,1≦i,j≦n。试设计一个回溯算法,将n份作业分配给n个人完成,使得总花费时间最短。
我是按照回溯法求解的,得出结果为:
结果明显不对,看了很久,希望有大神帮助看看
n个人完成n项工作,每人完成1项,其实这是n的全排列问题。
如果用全排列解就很方便了,当然递归也可以,只是要设置边界条件,比较麻烦,而且效率比全排列低
例如,假定N=4的情况。
- from itertools import permutations as pt
- #Define
- cij = [[1,2,3,4],
- [2,4,6,8],
- [3,5,7,9],
- [4,5,6,7]]
- def assign(n,cij=cij):
- comb = pt(range(n),n)
- min_comb = 9999
- for c in comb:
- temp = 0
- for i in range(n):
- temp += cij[i][c[i]]
- if temp < min_comb:
- min_comb = temp
- min_c = c
- return min_comb, min_c
- print assign(4)
复制代码
输出:
(17, (2, 0, 1, 3))
表示第0个人做第2项工作,第1个人做第0项工作,第2个人做第1项工作,第3个人做第3项工作,总共17个单位时间。
|
|