怎样用python解决规划求解的问题

如果单是解这么一个只有两个变量的问题,真的先选价值最高那个,选到不能选了再补充另一种就是了。但是如果你要解多于两个变量的问题,你还是把他建模成线性规划,直接用线性规划的工具解吧。Step 0: 什么是线性规划。给你个wiki链接:https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92Step 1:把问题建模成线性规划,包括目标函数和限制条件。先用笔在纸上写。Step 2:找一个solver,把模型按照solver的规则写进去然后解就是了。如果你一定要用python,可以用一些package,例如PyGLPK和http://pymprog.sourceforge.net/ 我没用过python解,所以具体不清楚。真要解决问题的话,线性规划的算法不要自己编,会慢很多倍。但是想熟悉算法,自己编编倒是挺好的,你会看到里头有各种trick(小技巧)来提速或者解决特殊情况。Step 3: 看看得到的解现不现实,能不能用正常人思维理解。明显不对的话回到第一步继续吧。
■网友
……題主你真的不是在逗我嗎……既然鴨單價高,那就生產盡可能多的鴨咯……如果最多400的話那就400……然後還有剩餘資源,全用來生產魚咯……於是就(1 - 400/500) / (1/400) = 80咯……(也就是你的代碼算出來的答案:x=400,y=80)這哪裡用得著規劃了?哪裏用得著寫代碼了?!就抓個小學生過來也能算出來啊……用掉的時間還比你代碼跑得時間短呢……哦如果題主還沒上小學的話……當我沒說……學齡前兒童就已經會用python了那一定是祖國的希望啊……“时间上最多可生成400只橡皮鸭和300只橡皮鱼”,這個條件我實在想不明白是個什麼鬼……和?和??和?!完全不make sense……代碼就更不忍吐槽了……(內啥,由於題主修改了問題描述,以下的吐槽顯得不知所云。可以去問題日誌看題主最初的代碼……)請問l這個list的意義何在啊……你在length為120000的list中找max……你考慮過list的感受嗎……就算真的必須得兩層for循環……也得這麽寫啊……a = 0for x in range(401): for y in range(301): if 0.8*x+y\u0026lt;=400: p=6*x+5*y a=max(a, p)這樣程序就變成O(n)了啊……雖然仍然很但是一秒鐘就跑出來了啊……你搞個毫無用處的超長無比的l複雜度就是O(n^2)了啊……一跑兩分鐘啊……還有……誰叫你把變量命名成l的……能認出來是l還是I還是1嗎?……………………建議題主添加個標籤“逗比”……我覺得我的智商受到了侮辱……我想靜靜不要攔著我……————————————————我還是把下面的評論也貼到這裏來吧題主說:可是,你吐槽了我这么半天,就没有办法写出更好一点的代码吗?光说不练,是唬人呢。我的回復如下:首先,我指出了你代碼中最大的瓶頸,把時間從121秒縮減到了0.34秒(在我機器上)。確實有更好的解法,但即使進一步縮短到0.000034秒,和0.34秒又有什麼區別呢?其次,這題完全不用代碼。。。人腦就可以算,因為根本不用枚舉。再次,如果把條件改得複雜一點,人腦算不了,必須枚舉的話,應該怎麼寫?假設說,把“p=6*x+5*y”改成“p = x ** 6 * y ** 5”,這樣人腦肯定算不了了。(**在python表示冪運算,just in case you don\u0026#39;t know)(式子是我胡扯的,只是為了強調非線性而已)(答案是275 180)好了,該怎麼枚舉x和y?你用了兩個for,但是絕大多數的枚舉是完全沒用的。比如說,(x, y) = (1, 1)、(2, 2)、(10, 10)、(100, 100),這些都是符合條件的。哪個利潤大?肯定是(100, 100)啊。但(100, 100)也還不是利潤最大的,因為還有許多生產資源和時間資源被浪費掉了。也就是說,這兩種資源,必須消耗光其中至少一種,才有可能獲得最大利潤。剩下的,根本不用枚舉。必須消耗光至少一種。必須消耗光至少一種。必須消耗光至少一種。對於這道題來說,消耗光的是生產資源。真正需要枚舉的只有至多500對(x, y),就是(500, 0), (499, 0), (498, 1), (497, 2)……(400, 80), (399, 80)……(125, 300)……(0,400)你看,比枚舉120000對容易多了是不是。再優化一下,只枚舉(400, 80)到(125, 300)這276對就可以了,剩下的一小半(224對)又可以砍掉。枚舉y的話,從80到300,那就更少了。


推荐阅读