第五十二章 編程?我自學的啊
三個人下意識地讓出了位置。
不是刻意的客氣,而是一種本能反應。
就好像一場手術台上爭論不休的實習醫生,看到主刀大夫推門進來,身體自動往兩邊撤。
儘管他們很清楚,陸豐是機械專業的。
但就是莫名其妙的對他就是信任,是因為之前陸豐對數學的絕對理解嗎,貌似不是,就是對他這個人信任。
陸豐彎腰看了一眼屏幕。
紅色的報錯信息刷了滿屏,密密麻麻的英文堆疊在一起,像一份催命的判決書,直接宣判了王哲他們的結果。
但在他眼裡,這些東西的辨識度還不如食堂門口的菜單複雜。
「IndexError: matrix dimension mismatch at line 247.」
陸豐的視線順著報錯信息往上追溯,在代碼編輯器里快速翻動。
第218行,約束矩陣的定義。
第233行,變量的索引賦值。
第247行,矩陣乘法。
原來如此。
他沒有說話,也沒有解釋,直接拉開椅子坐了下去。
雙手落在鍵盤上。
「嗒嗒嗒嗒—」
一連串密集到幾乎不間斷的敲擊聲驟然爆發,在安靜的機房裡清脆異常。
那節奏快到不像是在寫代碼,更像是在彈一首鋼琴曲。
野蜂飛舞,手速極快。
王哲剛張了張嘴,想說一句「我給你講一下代碼結構」,話還沒出口,就被眼前的畫面徹底堵了回去。
他看見陸豐的手指在鍵盤上飛速移動,光標精準地跳到第218行,選中一整段矩陣定義代碼,刪掉。
重新敲入。
三行代碼,替換了原來的十二行。
然後光標又跳到第233行。
這一次陸豐甚至沒有逐行修改,而是直接把整個for循環砍掉,換成了一行NumPy的向量化操作。
王哲的瞳孔猛地收縮。
他是計算機學院編程競賽拿過省二等獎的人,對代碼的優劣有著極其敏銳的判斷力。陸豐剛才那一手,不是簡單的修Bug,而是在重構。
他把一個低效的、嵌套了三層循環的矩陣運算,用一行向量化語句直接替代了。
這需要對NumPy底層的廣播機制有極其深入的理解,同時還要精確掌握線性代數中矩陣維度的變換規則。
關鍵是太快。
從坐下到現在,不到一分鐘。
王哲下意識地看了一眼自己的手,那雙經過了三年編程訓練、自認為手速不慢的手。
手速太快這是對鍵盤多麼了解才能做到如此速度。
此刻它們正老老實實地垂在身體兩側,一動不動。
跟人家比起來,他這手速連上桌的資格都沒有。
他們現在就配做一個背景板。
敲擊聲還在繼續。
陸豐的光標跳到第247行的矩陣乘法處,把原來的雙重循環手動乘法,改成了一個np.dot()函數調用。
接著又往下翻了幾行,在規劃模型的目標函數定義處停住。
他皺了皺眉。
「這裡的符號寫反了,最小化問題你們用的是maximize,求解器方向錯了。」
他把maximize改成minimize,順手在下面的約束條件里補了一個非負約束。
然後按下了運行鍵。
綠色的進度條閃了一下。
屏幕刷新。
一組整整齊齊的最優解數據,出現在輸出窗口裡。
三條生產線的最優排程方案,每條線開機的溫度區間、濕度閾值、設備輪換周期,全部以表格的形式呈列。
底部還自動生成了一張折線圖,顯示優化前後次品率的對比曲線。
從第一行紅色報錯到最終結果輸出。
兩分半鐘。
李浩盯著屏幕上那組乾淨漂亮的輸出數據,大腦一片空白。
他是編程組的組長,MATLAB和Python都用了三年。
剛才那個矩陣維度錯配的問題,他和王哲、劉宇三個人討論了將近二十分鐘,從索引檢查到類型轉換試了個遍,愣是沒搞定。
結果人家過來,兩分半鐘,連改帶調,直接出結果。
而且修完的代碼量,只有他們原來的三分之一。
劉宇推了推眼鏡,喉嚨動了一下。他把身體湊到屏幕前,在陸豐改過的那幾行代碼上來回看了三遍。
「向量化廣播……動態索引切片……」他的聲音有些乾澀,「這寫法,ACM競賽的金牌選手也不過如此了。」
陸豐從椅子上站起來,活動了一下手腕。
「問題出在兩個地方。」
他走到旁邊的白板前,拿起筆,畫了兩個矩陣的示意圖。
「第一,你們在構建約束矩陣的時候,手動用循環逐行賦值,但回歸方程的參數向量是列向量,直接做矩陣乘法會在第二維度對不齊。換成向量化操作之後,NumPy會自動處理維度廣播,根本不需要手動對齊。」
他在白板上標註了尺寸標記。
「第二,求解方向的問題。你們調用的scipy.optimize.linprog默認是最小化,但你們在目標函數前面沒有加負號,等於在最大化次品率。」
他停了一下,轉過頭看了三人一眼。
「相當於你們寫了一個幫工廠生產最多次品的程序。」
劉宇的眼鏡差點滑落。
李浩捂住了臉,也是有些尷尬。
不是好哥們,這都能出錯,問題還是出錯還沒發現。
王哲的拳頭重重砸在桌面上,聲音里混雜著懊惱和佩服。
「媽的,maximize和minimize就差了三個字母,我們找了二十分鐘……」
旁邊一直旁觀的陳靜端著水杯走過來,臉上掛著一種「早該預料到」的麻木表情。
「學弟,你對編程也是這種水平?」她問道。
陸豐把白板筆放回筆槽。
「之前自學過一段時間。」
「噗~」
陳靜嘴裡的水直接噴了出來。
一大片水霧精準地覆蓋了面前那台剛剛調試好的顯示器,屏幕上那組漂亮的輸出數據,瞬間被染上了一層唾沫星子。
「咳咳咳!」
陳靜劇烈地咳嗽著,一隻手扶著桌面,另一隻手瘋狂地抽紙巾擦屏幕。
周曉曉連忙遞過一包紙巾。
「不是,自學?」陳靜咽了口口水,指著屏幕上那幾行堪稱教科書級別的代碼,聲音已經帶上了哭腔。
「你到底還有多少技能是自學的?」
陸豐想了想。
「挺多的。」
陳靜直接自閉了。
我是誰,我在哪,我在幹什麼,這是個什麼妖怪。
李浩默默地關掉了自己寫了的代碼文件,盯著那個文件名看了兩秒。
然後右鍵,刪除。
「以後編程的事,學弟你也一起盯著吧。」他抬起頭,語氣誠懇。
陸豐點了點頭,沒有推辭。
因為他們真的有點太菜了。
不是刻意的客氣,而是一種本能反應。
就好像一場手術台上爭論不休的實習醫生,看到主刀大夫推門進來,身體自動往兩邊撤。
儘管他們很清楚,陸豐是機械專業的。
但就是莫名其妙的對他就是信任,是因為之前陸豐對數學的絕對理解嗎,貌似不是,就是對他這個人信任。
陸豐彎腰看了一眼屏幕。
紅色的報錯信息刷了滿屏,密密麻麻的英文堆疊在一起,像一份催命的判決書,直接宣判了王哲他們的結果。
但在他眼裡,這些東西的辨識度還不如食堂門口的菜單複雜。
「IndexError: matrix dimension mismatch at line 247.」
陸豐的視線順著報錯信息往上追溯,在代碼編輯器里快速翻動。
第218行,約束矩陣的定義。
第233行,變量的索引賦值。
第247行,矩陣乘法。
原來如此。
他沒有說話,也沒有解釋,直接拉開椅子坐了下去。
雙手落在鍵盤上。
「嗒嗒嗒嗒—」
一連串密集到幾乎不間斷的敲擊聲驟然爆發,在安靜的機房裡清脆異常。
那節奏快到不像是在寫代碼,更像是在彈一首鋼琴曲。
野蜂飛舞,手速極快。
王哲剛張了張嘴,想說一句「我給你講一下代碼結構」,話還沒出口,就被眼前的畫面徹底堵了回去。
他看見陸豐的手指在鍵盤上飛速移動,光標精準地跳到第218行,選中一整段矩陣定義代碼,刪掉。
重新敲入。
三行代碼,替換了原來的十二行。
然後光標又跳到第233行。
這一次陸豐甚至沒有逐行修改,而是直接把整個for循環砍掉,換成了一行NumPy的向量化操作。
王哲的瞳孔猛地收縮。
他是計算機學院編程競賽拿過省二等獎的人,對代碼的優劣有著極其敏銳的判斷力。陸豐剛才那一手,不是簡單的修Bug,而是在重構。
他把一個低效的、嵌套了三層循環的矩陣運算,用一行向量化語句直接替代了。
這需要對NumPy底層的廣播機制有極其深入的理解,同時還要精確掌握線性代數中矩陣維度的變換規則。
關鍵是太快。
從坐下到現在,不到一分鐘。
王哲下意識地看了一眼自己的手,那雙經過了三年編程訓練、自認為手速不慢的手。
手速太快這是對鍵盤多麼了解才能做到如此速度。
此刻它們正老老實實地垂在身體兩側,一動不動。
跟人家比起來,他這手速連上桌的資格都沒有。
他們現在就配做一個背景板。
敲擊聲還在繼續。
陸豐的光標跳到第247行的矩陣乘法處,把原來的雙重循環手動乘法,改成了一個np.dot()函數調用。
接著又往下翻了幾行,在規劃模型的目標函數定義處停住。
他皺了皺眉。
「這裡的符號寫反了,最小化問題你們用的是maximize,求解器方向錯了。」
他把maximize改成minimize,順手在下面的約束條件里補了一個非負約束。
然後按下了運行鍵。
綠色的進度條閃了一下。
屏幕刷新。
一組整整齊齊的最優解數據,出現在輸出窗口裡。
三條生產線的最優排程方案,每條線開機的溫度區間、濕度閾值、設備輪換周期,全部以表格的形式呈列。
底部還自動生成了一張折線圖,顯示優化前後次品率的對比曲線。
從第一行紅色報錯到最終結果輸出。
兩分半鐘。
李浩盯著屏幕上那組乾淨漂亮的輸出數據,大腦一片空白。
他是編程組的組長,MATLAB和Python都用了三年。
剛才那個矩陣維度錯配的問題,他和王哲、劉宇三個人討論了將近二十分鐘,從索引檢查到類型轉換試了個遍,愣是沒搞定。
結果人家過來,兩分半鐘,連改帶調,直接出結果。
而且修完的代碼量,只有他們原來的三分之一。
劉宇推了推眼鏡,喉嚨動了一下。他把身體湊到屏幕前,在陸豐改過的那幾行代碼上來回看了三遍。
「向量化廣播……動態索引切片……」他的聲音有些乾澀,「這寫法,ACM競賽的金牌選手也不過如此了。」
陸豐從椅子上站起來,活動了一下手腕。
「問題出在兩個地方。」
他走到旁邊的白板前,拿起筆,畫了兩個矩陣的示意圖。
「第一,你們在構建約束矩陣的時候,手動用循環逐行賦值,但回歸方程的參數向量是列向量,直接做矩陣乘法會在第二維度對不齊。換成向量化操作之後,NumPy會自動處理維度廣播,根本不需要手動對齊。」
他在白板上標註了尺寸標記。
「第二,求解方向的問題。你們調用的scipy.optimize.linprog默認是最小化,但你們在目標函數前面沒有加負號,等於在最大化次品率。」
他停了一下,轉過頭看了三人一眼。
「相當於你們寫了一個幫工廠生產最多次品的程序。」
劉宇的眼鏡差點滑落。
李浩捂住了臉,也是有些尷尬。
不是好哥們,這都能出錯,問題還是出錯還沒發現。
王哲的拳頭重重砸在桌面上,聲音里混雜著懊惱和佩服。
「媽的,maximize和minimize就差了三個字母,我們找了二十分鐘……」
旁邊一直旁觀的陳靜端著水杯走過來,臉上掛著一種「早該預料到」的麻木表情。
「學弟,你對編程也是這種水平?」她問道。
陸豐把白板筆放回筆槽。
「之前自學過一段時間。」
「噗~」
陳靜嘴裡的水直接噴了出來。
一大片水霧精準地覆蓋了面前那台剛剛調試好的顯示器,屏幕上那組漂亮的輸出數據,瞬間被染上了一層唾沫星子。
「咳咳咳!」
陳靜劇烈地咳嗽著,一隻手扶著桌面,另一隻手瘋狂地抽紙巾擦屏幕。
周曉曉連忙遞過一包紙巾。
「不是,自學?」陳靜咽了口口水,指著屏幕上那幾行堪稱教科書級別的代碼,聲音已經帶上了哭腔。
「你到底還有多少技能是自學的?」
陸豐想了想。
「挺多的。」
陳靜直接自閉了。
我是誰,我在哪,我在幹什麼,這是個什麼妖怪。
李浩默默地關掉了自己寫了的代碼文件,盯著那個文件名看了兩秒。
然後右鍵,刪除。
「以後編程的事,學弟你也一起盯著吧。」他抬起頭,語氣誠懇。
陸豐點了點頭,沒有推辭。
因為他們真的有點太菜了。