編程農場——入坑遊玩第一天
《編程農場——入坑遊玩第一天》是近期博客園技術區的好帖,信息密度大。下面分段講清它的核心內容,看到結尾你就知道該怎麼做了。
背景 編程農場又史低了,這個遊戲在我願望清單裏面待挺久了,因爲價格和其他原因,我一直沒有購買,於是趁着steam編程遊戲節,我直接買下了這款有意思的遊戲。 遊戲玩法 在購買這款遊戲前,我就對這個遊戲有所耳聞,這個遊戲就是通過編寫代碼,驅動一個無人機實行自動化收割、種植等功能,而這種自動化生產鏈遊戲,遊戲的趣味就在於,通過自己的方式,最大化產線生成效率。
背景 編程農場又史低了,這個遊戲在我願望清單裏面待挺久了,因爲價格和其他原因,我一直沒有購買,於是趁着steam編程遊戲節,我直接買下了這款有意思的遊戲。 遊戲玩法 在購買這款遊戲前,我就對這個遊戲有所耳聞,這個遊戲就是通過編寫代碼,驅動一個無人機實行自動化收割、種植等功能,而這種自動化生產鏈遊戲,遊戲的趣味就在於,通過自己的方式,最大化產線生成效率。 初期思路 這種最大化產線效率顯然可以通過編程的方式完成,我們可以寫一個程序完成這件事 第一次玩,還沒有解鎖太多作物,我想着先生產基礎的資源,把初期要用到的東西都解鎖了,並且防止後面基礎資源短缺,於是,我想這先生產乾草、木材和胡蘿蔔,我們需要將這三者的單位時間產量最大化,同時可以保證收支平衡,因爲種植胡蘿蔔需要消耗其他兩種作物,我的第一個簡單粗暴的想法就是,枚舉所有作物分佈,同時對任意作物分佈找到最優效率路徑,但是在實現的過程中,我偷偷計算了一下複雜度,發現哪怕我進行了簡化的操作,可能的作物分佈依舊達到了可怕的 \(3^{n^2}\) ,這意味着使用暴力,會直接爆炸,同時,從複雜度,也可以看出這是一個np難問題,因此我們要採用一些啓發性的方法來求最優解,對於啓發式算法,我最擅長的就是模擬退火了,於是我就想使用SA來解決這個問題,模擬退火需要一個清晰的,對於最優解的評估方法,我們所求的最優解是三個產物的產出效率最高,但是因爲這個狀態考慮起來過於複雜,於是我在開始時想着,因爲無人機飛行消耗時間較小,能不能先不考慮飛行的時序,只考慮圖中有多少數量的不同作物,即每種作物各佔多少格,這樣可以大幅減少目標函數的構造難度,我直接統計了田中不同種類作物的數量,然後計算出他們單位時間產出作物數量並求和,但是我在完成之後,發現,如果不考慮無人機的飛行時間和順序的話,所需要計算的部分全部都是簡單的線性計算,那麼我們其實可以直接通過線性規劃的方式求出其最優解,但是因爲寫都寫了,刪除重構是不可能的,於是我決定先將假的SA寫好,然後再把目標函數粘貼到另一個副本里面,然後再在已經完成的SA基礎上,把目標函數改成考慮時序和移動的做法。
背景 編程農場又史低了,這個遊戲在我願望清單裏面待挺久了,因爲價格和其他原因,我一直沒有購買,於是趁着steam編程遊戲節,我直接買下了這款有意思的遊戲。 遊戲玩法 在購買這款遊戲前,我就對這個遊戲有所耳聞,這個遊戲就是通過編寫代碼,驅動一個無人機實行自動化收割、種植等功能,而這種自動化生產鏈遊戲,遊戲的趣味就在於,通過自己的方式,最大化產線生成效率。 初期思路 這種最大化產線效率顯然可以通過編程的方式完成,我們可以寫一個程序完成這件事 第一次玩,還沒有解鎖太多作物,我想着先生產基礎的資源,把初期要用到的東西都解鎖了,並且防止後面基礎資源短缺,於是,我想這先生產乾草、木材和胡蘿蔔,我們需要將這三者的單位時間產量最大化,同時可以保證收支平衡,因爲種植胡蘿蔔需要消耗其他兩種作物,我的第一個簡單粗暴的想法就是,枚舉所有作物分佈,同時對任意作物分佈找到最優效率路徑,但是在實現的過程中,我偷偷計算了一下複雜度,發現哪怕我進行了簡化的操作,可能的作物分佈依舊達到了可怕的 \(3^{n^2}\) ,這意味着使用暴力,會直接爆炸,同時,從複雜度,也可以看出這是一個np難問題,因此我們要採用一些啓發性的方法來求最優解,對於啓發式算法,我最擅長的就是模擬退火了,於是我就想使用SA來解決這個問題,模擬退火需要一個清晰的,對於最優解的評估方法,我們所求的最優解是三個產物的產出效率最高,但是因爲這個狀態考慮起來過於複雜,於是我在開始時想着,因爲無人機飛行消耗時間較小,能不能先不考慮飛行的時序,只考慮圖中有多少數量的不同作物,即每種作物各佔多少格,這樣可以大幅減少目標函數的構造難度,我直接統計了田中不同種類作物的數量,然後計算出他們單位時間產出作物數量並求和,但是我在完成之後,發現,如果不考慮無人機的飛行時間和順序的話,所需要計算的部分全部都是簡單的線性計算,那麼我們其實可以直接通過線性規劃的方式求出其最優解,但是因爲寫都寫了,刪除重構是不可能的,於是我決定先將假的SA寫好,然後再把目標函數粘貼到另一個副本里面,然後再在已經完成的SA基礎上,把目標函數改成考慮時序和移動的做法。 第一版代碼 [代碼示例略] 顯然在僅考慮不同種類作物數量的情況下,這一方法不是最優的,應該採用線性規劃的方式求解最優解。
背景 編程農場又史低了,這個遊戲在我願望清單裏面待挺久了,因爲價格和其他原因,我一直沒有購買,於是趁着steam編程遊戲節,我直接買下了這款有意思的遊戲。 遊戲玩法 在購買這款遊戲前,我就對這個遊戲有所耳聞,這個遊戲就是通過編寫代碼,驅動一個無人機實行自動化收割、種植等功能,而這種自動化生產鏈遊戲,遊戲的趣味就在於,通過自己的方式,最大化產線生成效率。 初期思路 這種最大化產線效率顯然可以通過編程的方式完成,我們可以寫一個程序完成這件事 第一次玩,還沒有解鎖太多作物,我想着先生產基礎的資源,把初期要用到的東西都解鎖了,並且防止後面基礎資源短缺,於是,我想這先生產乾草、木材和胡蘿蔔,我們需要將這三者的單位時間產量最大化,同時可以保證收支平衡,因爲種植胡蘿蔔需要消耗其他兩種作物,我的第一個簡單粗暴的想法就是,枚舉所有作物分佈,同時對任意作物分佈找到最優效率路徑,但是在實現的過程中,我偷偷計算了一下複雜度,發現哪怕我進行了簡化的操作,可能的作物分佈依舊達到了可怕的 \(3^{n^2}\) ,這意味着使用暴力,會直接爆炸,同時,從複雜度,也可以看出這是一個np難問題,因此我們要採用一些啓發性的方法來求最優解,對於啓發式算法,我最擅長的就是模擬退火了,於是我就想使用SA來解決這個問題,模擬退火需要一個清晰的,對於最優解的評估方法,我們所求的最優解是三個產物的產出效率最高,但是因爲這個狀態考慮起來過於複雜,於是我在開始時想着,因爲無人機飛行消耗時間較小,能不能先不考慮飛行的時序,只考慮圖中有多少數量的不同作物,即每種作物各佔多少格,這樣可以大幅減少目標函數的構造難度,我直接統計了田中不同種類作物的數量,然後計算出他們單位時間產出作物數量並求和,但是我在完成之後,發現,如果不考慮無人機的飛行時間和順序的話,所需要計算的部分全部都是簡單的線性計算,那麼我們其實可以直接通過線性規劃的方式求出其最優解,但是因爲寫都寫了,刪除重構是不可能的,於是我決定先將假的SA寫好,然後再把目標函數粘貼到另一個副本里面,然後再在已經完成的SA基礎上,把目標函數改成考慮時序和移動的做法。 第一版代碼 [代碼示例略] 顯然在僅考慮不同種類作物數量的情況下,這一方法不是最優的,應該採用線性規劃的方式求解最優解。 第二版代碼-基於線性規劃 [代碼示例略] 這樣我們就得到了基於線性規劃的最優解求解代碼了,不過這個遊戲裏面,有一個因素也影響着效率,只不過之前簡化時忽略了而已,這個因素就是無人機移動消耗的時間、無人機操作的時間還有時序問題,這個因素其實在遊戲中是比較重要的,因爲只有一架無人機,移動操作時消耗的時間確實會很多,而如果導入了這個因素,那麼這版線性規劃的代碼就難以解決了。
背景 編程農場又史低了,這個遊戲在我願望清單裏面待挺久了,因爲價格和其他原因,我一直沒有購買,於是趁着steam編程遊戲節,我直接買下了這款有意思的遊戲。 遊戲玩法 在購買這款遊戲前,我就對這個遊戲有所耳聞,這個遊戲就是通過編寫代碼,驅動一個無人機實行自動化收割、種植等功能,而這種自動化生產鏈遊戲,遊戲的趣味就在於,通過自己的方式,最大化產線生成效率。 初期思路 這種最大化產線效率顯然可以通過編程的方式完成,我們可以寫一個程序完成這件事 第一次玩,還沒有解鎖太多作物,我想着先生產基礎的資源,把初期要用到的東西都解鎖了,並且防止後面基礎資源短缺,於是,我想這先生產乾草、木材和胡蘿蔔,我們需要將這三者的單位時間產量最大化,同時可以保證收支平衡,因爲種植胡蘿蔔需要消耗其他兩種作物,我的第一個簡單粗暴的想法就是,枚舉所有作物分佈,同時對任意作物分佈找到最優效率路徑,但是在實現的過程中,我偷偷計算了一下複雜度,發現哪怕我進行了簡化的操作,可能的作物分佈依舊達到了可怕的 \(3^{n^2}\) ,這意味着使用暴力,會直接爆炸,同時,從複雜度,也可以看出這是一個np難問題,因此我們要採用一些啓發性的方法來求最優解,對於啓發式算法,我最擅長的就是模擬退火了,於是我就想使用SA來解決這個問題,模擬退火需要一個清晰的,對於最優解的評估方法,我們所求的最優解是三個產物的產出效率最高,但是因爲這個狀態考慮起來過於複雜,於是我在開始時想着,因爲無人機飛行消耗時間較小,能不能先不考慮飛行的時序,只考慮圖中有多少數量的不同作物,即每種作物各佔多少格,這樣可以大幅減少目標函數的構造難度,我直接統計了田中不同種類作物的數量,然後計算出他們單位時間產出作物數量並求和,但是我在完成之後,發現,如果不考慮無人機的飛行時間和順序的話,所需要計算的部分全部都是簡單的線性計算,那麼我們其實可以直接通過線性規劃的方式求出其最優解,但是因爲寫都寫了,刪除重構是不可能的,於是我決定先將假的SA寫好,然後再把目標函數粘貼到另一個副本里面,然後再在已經完成的SA基礎上,把目標函數改成考慮時序和移動的做法。 第一版代碼 [代碼示例略] 顯然在僅考慮不同種類作物數量的情況下,這一方法不是最優的,應該採用線性規劃的方式求解最優解。 第二版代碼-基於線性規劃 [代碼示例略] 這樣我們就得到了基於線性規劃的最優解求解代碼了,不過這個遊戲裏面,有一個因素也影響着效率,只不過之前簡化時忽略了而已,這個因素就是無人機移動消耗的時間、無人機操作的時間還有時序問題,這個因素其實在遊戲中是比較重要的,因爲只有一架無人機,移動操作時消耗的時間確實會很多,而如果導入了這個因素,那麼這版線性規劃的代碼就難以解決了。 第三版代碼-添加移動以及時序處理功能的SA 爲了解決之前提到的問題,我們又回到了啓發性算法上,我們需要重新設計一下SA的目標函數,讓他能夠處理時序問題,我們可以注意到,無人機對於每個操作的時間是固定的,並且我們只有一臺無人機,因此我們可以通過離散化的方式處理時序問題,由於一下子就考慮時序的優化過於困難,我們可以先假定無人機按照固定週期遍歷全圖,累加全局時間,逐格判斷成熟並執行操作,最後統計淨產出。
行動建議:收藏這篇,下次碰到同類問題先翻出來對照做一遍。好經驗的價值,在於用起來。你最近被這類問題卡過嗎? 來源|博客園《編程農場——入坑遊玩第一天》,https://www.cnblogs.com/reasa/p/22955697.html
評論(0)
暫無評論,來搶第一條。