※ 引述《zz860619 (Kukuboo)》之铭言:
: 各位大大晚安 最近小弟在写一个小专题
: 题目简单说就是分配航段内航班给各个航空公司
: 譬如我这个航段里总共有10个航班要分配给2个航空公司
: 这样就有可能是(0,10) (1,9)以此类推
: 航班数跟航空公司小还好说,分配的航空公司一多,想求出每种可能性就要跑半天,不知
: 道有没有更快求出的写法?
: 以下是目前写的 a就是当下的可能性
: total =4 #总共要分配的航班数
: num = 3 #分给几家航空公司
: a = [0 for x in range(num)]
: def per (fas_total,air_number,num):
: if air_number == 1:
: a[num-air_number] = fas_total
: print(a)
: print("========================")
: else:
: for i in range(fas_total+1):
: a[num-air_number] = i
: per(fas_total-i,air_number-1,num)
: per(total,num,num)
: 希望有人可以帮忙我一下,谢谢~
针对你真正的问题“求所有可能组合中的最佳解”
这个问题是NP-complete的问题(我想应该可以转换成某种weighted vertex cover,
还烦请高手指正)
所以如果没有更多条件的话,用暴力解(就是你现在的作法)不要太期待会有很快得到
解答的方法。
你可以想想看,光“航空公司含有航班数量”的组合就有H^m_n种可能(例如,
你的范例会有11种),还要考虑航班的排列情况。
比较好的方法是利用已知条件减少搜寻的数量。
看你的code,你可能真正的code是把print那行改成计算cost的function。如果是这样,
那就是DFS的搜寻,也许可以减枝吧?在下一层递回前把不可能的情况跳过,可以少算很多。
我的意思是,感觉你还没有深入想想这个问题适合的算法,就想优化code。
错误的算法在数量级太大的时候是不实际的。