讀入資料 -> 處理資料(新增鬆弛變數,人工變數) -> 計算每一列的檢驗數 -> 決定繼續迭代還是結束
1 設立的變數
2 讀入資料(對應**中 read_data() 函式)vectora;//約束條件係數
vectorb;//約束條件右部數字
vectors;//約束條件符號
vectortest;//檢驗數
vectorxita;//θ
int *p;//基
int line = 0,row=0; //最初的行數和列數
int artificial = 0; //因為大於等於號需要新增的人工向量
資料格式:
1(表示目標函式是max);0(表示目標函式是min)
4 5 1 目標函式係數向量
3 3 約束條件矩陣維數
3 2 1 18 2 最後乙個數字表示約束條件符號,2表示大於等於
2 1 0 4 1 最後乙個數字表示約束條件符號,1表示小於等於
1 2 0 5 0 最後乙個數字表示約束條件符號,0表示等於
3 處理資料(對應**中 read_data() 函式)
中心思想:轉化為標準型
第乙個數字表示目標函式是求max還是min,如果是min直接將目標函式的係數取相反數;對於約束條件矩陣,其變化與否取決於約束條件的符號,即矩陣中每一行最後乙個數字:如果是等於(=0),預設需要新增人工變數,直接新增人工變數並將該變數對應的目標函式係數設為-m(本程式中m的值設為999,足夠進行所以資料的計算);如果是小於等於(=1),僅新增乙個鬆弛變數即可,約束條件矩陣係數為1;如果是大於等於,情況稍複雜,既需要新增鬆弛變數,約束條件矩陣係數為-1,又需要新增人工變數,約束條件矩陣係數為1。
如此一來,可以保證經處理過的矩陣中一定有單位矩陣便於後續單純形法的計算。此時係數矩陣的列數為 line + row + artificial,其中 line 為讀入係數矩陣的行數,row 為讀入係數矩陣的列數不包括符號右邊的常數和表示約束條件符號的數字,artificial 為因約束條件是大於等於而新增的人工變數的個數
4 單純形法計算(對應**中 cal_test()、cal_xita()和******x() 函式)
cal_test() 函式計算每一列(也可以說是每乙個變數)的檢驗數,如果所有檢驗數均小於等於0則停止迭代輸出答案,如果存在檢驗數大於0則取檢驗數最大的那一列,該列對應的變數即為換入變數 ex_in 。繼續計算該列不同行的 θ(即b[j]/a[i][j]) 值,cal_xita()函式實現了此計算,輸出 θ 最小的值對應的行,該行對應的變數即為換出變數 ex_out 。
確定了換入和換出變數之後,更改對應的約束矩陣係數使換入變數對應的列組成單位矩陣的一部分即可。最後更改記錄基的陣列 p 的值(例如,p[0]=3表示單純形表第一行的基為x3)即可。
結果以「result.txt」命名附於壓縮檔案中(執行程式在build檔案中同樣可以得到)。
以第乙個測試資料的結果為例:
5 3 1 1 0 0 0
-5 6 15 0 1 0 0
2 1 1 0 0 -1 1 //首先給出轉化為標準型並新增了人工變數之後的係數矩陣
test number:2008 1014 1011 0 0 -999 0 //每一列對應的檢驗數
we will exchange in x1 //存在檢驗數大於0的情況,確定換入變數
xita:1.8 999 2.5 //換入列每一行對應的θ值
we will exchange out line1 //找到最小的θ值,確定換出變數
1 0.6 0.2 0.2 0 0 0
0 9 16 1 1 0 0
0 -0.2 0.6 -0.4 0 -1 1 //改變基變數之後的係數矩陣,後續迭代同上
test number:0 -190.8 609.4 -401.6 0 -999 0
we will exchange in x3
xita:9 1.5 2.33333
we will exchange out line2
1 0.4875 0 0.1875 -0.0125 0 0
0 0.5625 1 0.0625 0.0625 0 0
0 -0.5375 0 -0.4375 -0.0375 -1 1
test number:0 -533.587 0 -439.688 -38.0875 -999 0
iteration complete //所有檢驗數小於等於0,迭代完成
the result as follows:
x1 = 1.5
x3 = 1.5
x7 = 0.5 //最終結果
-----------------
運籌學實驗-1.md : 實驗報告
results.txt : 測試結果
******x-method : 原始碼檔案
build-******x-method-desktop_qt_5_14_1_mingw_64_bit-debug : bulild檔案(含輸入檔案testdata.txt)
初識運籌學
運籌學的基本概括圖如下 凡事預則立,不預則廢 可見預見的重要作用。就其應用方法來說 分為 定性 定量 由於社會活動的複雜性,至今還沒有找到乙個 方法能使管理人員滿意的 精度,但是因為管理然預案每天都要進行決策,因此他們總要努力滴去手機所能得到的,並非理想 資料區 未來的不確定事件 有了 才能更好的進...
運籌學總結
一 思維導圖 二 內容的認識和記錄 1 凡事預則立,不預則廢 2 決策 狹義 對一些可供選擇的方案做出抉擇。廣義 和管理相近,包括四個程式 明確決策專案的目的,尋求可行的方案,在可行方案中抉擇,對選定的決策方案進過實施後的結果總結評價。3 庫存管理 為保障生產,對倉庫物資的管理,使之達到平衡,減少浪...
運籌學 3 決策
運籌學 3 決策 一 是什麼?概念 決策 通俗的說就是選擇,怎麼更好的做出最優的選擇。在有明確的目標 經過調查研究 根據實際可能 擬定多個方案 運用統一標準選擇 最佳的方案的過程就叫決策。1 決策分類 1 常規性 針對之前的舊問題 2 特殊性 針對新問題 2 決策步驟 1 確定目標 2 擬定方案 3...