Re: [问题]新手请教更好写法

楼主: ThxThx (洗洗睡)   2018-12-01 22:54:58
※ 引述《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。
错误的算法在数量级太大的时候是不实际的。
作者: zz860619 (Kukuboo)   2018-12-02 13:33:00
好的谢谢 我会再想想这个问题的解法
作者: qwaszx780917 (白目凉良)   2018-12-03 12:36:00
听起来很像整数规划里的指派问题 概念蛮简单的建议可以看看 或是一些作业研究里面比较适合的方法 应该把model列好 都会有现成的套件可以解 不过问题如果太大的话 效能考量上应该就建议用一些优化算法个人浅见

Links booklink

Contact Us: admin [ a t ] ucptt.com