作者ThxThx (洗洗睡)
看板Python
标题Re: [问题]新手请教更好写法
时间Sat Dec 1 22:54:58 2018
※ 引述《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。
错误的演算法在数量级太大的时候是不实际的。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.44.244.126
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1543676101.A.986.html
1F:→ zz860619: 好的谢谢 我会再想想这个问题的解法 12/02 13:33
2F:推 qwaszx780917: 听起来很像整数规划里的指派问题 概念蛮简单的建议 12/03 12:36
3F:→ qwaszx780917: 可以看看 或是一些作业研究里面比较适合的方法 应 12/03 12:36
4F:→ qwaszx780917: 该把model列好 都会有现成的套件可以解 不过问题如 12/03 12:36
5F:→ qwaszx780917: 果太大的话 效能考量上应该就建议用一些优化演算法 12/03 12:36
6F:→ qwaszx780917: 个人浅见 12/03 12:36