Phân tích mối quan hệ giữa các yếu tố kinh tế - Xã hội - Môi trường làm cơ sở xây dựng mô hình tích hợp hỗ trợ quy hoạch sử dụng đất nông nghiệp trường hợp nghiên cứu tại tỉnh Sóc Trăng

Dữ liệu tối ưu của kịch bản 1 theo 3 phương án được bố trí không gian bằng mô hình ST-LUAM (Mục 4.3.3) nhằm thể hiện diện tích sau khi được tối ưu lên bản đồ bố trí đất sản xuất nông nghiệp. Đối với mỗi phương án tối ưu sẽ có sự bố trí diện tích các KSD lên bản đồ khác nhau. Kết quả bố trí đất sản xuất nông nghiệp theo phương án tối ưu hóa thích nghi của kịch bản 1 được trình bày ở Hình 4.41 cho thấy diện tích lúa 3 vụ được bố trí tập trung ở huyện Long Phú, diện tích lúa còn lại chủ yếu là lúa hai vụ. Vùng Mỹ Xuyên được bố trí canh tác lúa-tôm. Vùng bố trí chuyên tôm (LUT7) và hai vụ lúa-màu (LUT3) chủ yếu tập trung ở huyện Trần Đề. Các cây ăn quả (LUT6) và chuyên màu (LUT5) bố trí theo dạng tuyến dọc các hệ thống giao thông và sông ngòi của cả ba huyện. Tổng diện tích canh tác của từng KSD ở mỗi phương án được trình bày chi tiết trong phần Phụ lục.

pdf242 trang | Chia sẻ: tueminh09 | Ngày: 09/02/2022 | Lượt xem: 263 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Phân tích mối quan hệ giữa các yếu tố kinh tế - Xã hội - Môi trường làm cơ sở xây dựng mô hình tích hợp hỗ trợ quy hoạch sử dụng đất nông nghiệp trường hợp nghiên cứu tại tỉnh Sóc Trăng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
h cell đến duong action set_distance_road{ int j<-0; loop road_obj over: road{ // lặp các bufer từ đường ra 50-1500m mỗi lần tăng 50 m, //tìm các cell nằm trong bufer để xác định khoảng cách tới đường loop j from:100 to:max_distance step:100{ ask active_cell where (each.dist_road=0) overlapping (road_obj.shape+j#m) { dist_road<-float(j); } } } ask active_cell where (each.dist_road >0){ dist_road <- (max_distance-dist_road)/max_distance+0,05; } } //xac dinh khoảng cách từ cac cell gan song theo lớp 50m từ kênh rạch action set_distance_river_canals{ int j<-0; loop canal_obj over: canals{ loop j from:100 to:max_distance step:100{ ask active_cell where (each.dist_river_canals=0) overlapping (canal_obj.shape+j#m){ dist_river_canals<- float(j); } } } ask active_cell where (each.dist_river_canals >0){ dist_river_canals <- (max_distance-dist_river_canals)/max_distance+0.1; } } action cal_LUT_cell_capacity_index {// of cells PL-34 // Compute the density of all the LUT of neighbours cells // Với mỗi cell, quét 8 cells xung quanh, tính chỉ số mỗi loại sử dụng đất= số ô mỗi loại/8 ask active_cell { list neighborcell <- (self neighbors_at neighbor_radius); loop i over: land_use_type.keys{ density[i] <- (neighborcell count (each.landuse = i)) / length(neighborcell); // tinhs lai chi so Cab Capacity_Index_LUT[i]<- weight_prior_village*village_prior + weight_density*density[i]+weight_dist_road*dist_road+weight_dist_river*dist_river_canals; } } } action capnhat_dientich_LUT_tanggiam_dvdd{ // tính tổng diện tich của LUT; cập nhật danh sách diện tích cần tăng giảm ask land_unit{ loop i over:area_needed_LUT.keys{ current_area_LUT[i] <- float(active_cell count ((each.landuse = i) and (each.land_unit_code=landunit)))*area_per_cell; if (area_needed_LUT[i]>=current_area_LUT[i] ){ area_LUT_need_increasing[i] <-area_needed_LUT[i] - current_area_LUT[i]; } else{ area_LUT_need_decreasing[i] <- current_area_LUT[i] - area_needed_LUT[i] ; availableLUT[i]<-area_LUT_need_decreasing[i]; } } write "landnit"+landunit+ " current_area_LUT:" +current_area_LUT; write "landnit"+landunit+ " area_needed_LUT:" +area_needed_LUT; } } //Calculate Fuzzy Kappa action call_fuzzy_kappa{ // Calculate fuzzy Kappa int nb_LUT <- length(color_map.keys); // number of land-use types bool use_fuzzy_kappa_sim <- false ; float distance_kappa <- 200.0 ; // Distance for calculation Fuzzy Kappa matrix fuzzy_categories; // Categories to calculate the FKappa matrix fuzzy_transitions; // Categories to calculate the FKapp list nb_per_cat_obs; // Categories to transition matrix list nb_per_cat_sim; // Number of categories observed list categories <-color_map.keys; fuzzy_categories <- 0.0 as_matrix {nb_LUT,nb_LUT}; loop i from: 0 to: nb_LUT - 1 { fuzzy_categories[i,i] <- 1.0; } fuzzy_transitions <- 0.0 as_matrix {nb_LUT*nb_LUT,nb_LUT*nb_LUT}; loop i from: 0 to: (nb_LUT * nb_LUT) - 1 { fuzzy_transitions[i,i] <- 1.0; } list similarity_per_agents <- []; kappa <- kappa(cell where (each intersects (vungdanhgia at 0).shape) collect (each.landuse) , cell_thaydoi where (each intersects (vungdanhgia at 0).shape) collect (each.landuse), categories); PL-35 write 'He so kappa:' + kappa; } reflex Allocation{ // do Allocate_LUT; do save_allocation_map; // xuất bản đồ allocation test } action tinh_dientich_LUT_mophong{ listdientich_LUT<-[]; loop i over:color_map.keys{ dientich_LUT<<float(cell count (each.landuse = i))*area_per_cell; } write "Tong dien tich loai dat:"; write color_map.keys; write dientich_LUT; } action tinh_dientich_LUT_theoDVDD{ // tính diện tích của các LUT theo từng ĐVĐĐ string stDientich <-""; save ["dvdd",land_use_type.keys] to: "../results/DVDD_LUT.csv" type:"csv"; ask land_unit { // duyệt từng land unit để tính diện tích vào map map dientich_LUT stDientich<-""; loop i over:dientich_LUT_DVDD_canbotri[landunit].keys{ dientich_LUT[i] <-float(active_cell count ((each.landuse = i) and (each.land_unit_code=landunit)))*area_per_cell; stDientich <- stDientich + ","+ string(dientich_LUT[i]) ; } save "DVDD " + landunit + stDientich to: "../results/DVDD_LUT.csv" type:"csv" rewrite: false; dientich_LUT_DVDD[landunit]<-dientich_LUT; } // write "Dien tich loai dat theo tung DVDD:" + dientich_LUT_DVDD; } // tinh tong dien tich tung DVDD sau khi loại bo song rach action tinh_tongdt_tunhien_DVDD{ float dientich; save "DVDD,dientich_ha" to: "../results/DT_DVDD.csv" type:"csv" ; ask land_unit{ dientich <- float(active_cell count ((each.land_unit_code = landunit)and (each.landuse in [1,2,3,6,7,12])))*area_per_cell; save "DVDD " + landunit +"," + dientich to: "../results/DT_DVDD.csv" type:"csv" rewrite: false; } } action tinh_LUT_botri_xa{ // tính diện tích các kiểu sử dụng theo xã string stDientich <-""; float dientich_LUT; // save ["Xa",color_map.keys] to: "../results/dientich_LUT_xa.csv" type:"csv"; ask village { // duyệt từng land unit để tính diện tích vào map //map dientich_LUT stDientich<-""; dientich_LUT<-0.0; loop i over:color_map.keys{ dientich_LUT <-float(cell_thaydoi count ((each.landuse = i) and (each.village_name=village_name)))*area_per_cell; stDientich <- stDientich + ","+ string(dientich_LUT) ; PL-36 } // save "" + village_name + ","+stDientich to: "../results/dientich_LUT_xa.csv" type:"csv" rewrite: false; write "" + village_name + stDientich ; } } //Tong dien tichs caanf phaan bo - 0.25<0, dung vong lap action Allocate_LUT{ ask land_unit where (each.number_lut >1){ write "Bố trí đvđđ thứ " +self.landunit; int i <-0; // the land use code: 1-7 list selectedCell ; loop i over: area_needed_LUT.keys{ if ( i!= landuse){ // nếu i khác kiểu với land use đang bố trí tam trên DVDD thì xét bố trí thêm write " Dien tich LUT " + i + " yêu cầu: " + area_needed_LUT[i]; loop while: (area_needed_LUT[i]-area_per_cell)>0{// chỉ xét các LUT có diện tích yêu cầu bố trí >0 // tính chỉ số khả năng bố trí LUT i cho các cell thuộc đơn vị đất đai đang xét ask active_cell where ((each.land_unit_code=landunit) and !(each.allocated)) { // chỉ tính cho các cell thuộc đvđ và chưa bố trí list neighborcell <- (self neighbors_at neighbor_radius); density[i] <- (neighborcell count (each.landuse = i)) / length(neighborcell); // tinhs lai chi so Cab Capacity_Index_LUT[i]<- weight_prior_village*village_prior + weight_density*density[i]+weight_dist_road*dist_road+weight_dist_river*dist_river_canals; } // Chọn ra các cell thảo điều kiện có chỉ số > 0 và các ràng buộc thuộc LU và chưa bố trí selectedCell<- (active_cell where ((each.land_unit_code=landunit) and !(each.allocated) and (each.Capacity_Index_LUT[i]>0.0) and (each.i_invest>0)) ) sort_by -(each.Capacity_Index_LUT[i]); // overlapping self write " số cell tìm được:" + length(selectedCell); loop vCell over:selectedCell { if ((area_needed_LUT[i]- area_per_cell)>0 ){ vCell.landuse <-i; area_needed_LUT[i]<- area_needed_LUT[i]-area_per_cell; //vCell.grid_value <- float(i); vCell.color <- color_map[i]; vCell.allocated <- true; // gán thuộc tính đã bố trí rồi } } if (length(selectedCell)*area_per_cell < area_needed_LUT[i]){ write "Không bố trí được " + (area_needed_LUT[i] -length(selectedCell)*area_per_cell) + "ha LUT " + i + " vào ĐVDD" + self.landunit + "do thiếu diện tích"; area_needed_LUT[i] <-0; } PL-37 } write "Bo tri xong land use " + i + " vào ĐVDD" + self.landunit ; } } } write "Bo tri xong. Ket thuc"; } } grid cell file: lu_map neighbors: 8{ int landuse7)?0:int(grid_value); int salinity; int land_unit_code <-0; float village_prior; //chỉ số mức ưu tiên bố trí cho xã:0-1: xã NTM có mức ưu tiên cao hoặc xã được ưu tiên bố trí 1 kSD bool allocated <-false; rgb color <- color_map[landuse]; float dist_road <-0.0; float dist_river_canals<-0.0; int i_invest <- 1.0; // tạm khóa flip(0.23)?0:1 ; // khả năng đầu tư của nông hộ, nếu XS 23% xảy ra, hộ nghèo, giá trị 0 (không khả năng) mapdensity; // // mapLS_LUT; // mapCapacity_Index_LUT; // // gán màu test density action set_color_capacityindex { if (density[2] = 0 ){ color <- #white; } if (density[2] > 0 and density[2] < 0.2 ){ color <- #red; } if (density[2] >= 0.2 and density[2] < 0.5 ){ color <- #green; } if (density[2] >= 0.5 and density[2] < 0.7 ){ color <- #blue; } if (density[2] >0.7 ){ color <- #yellow; } } action tomau_khoangcach{ // đùng để kiểm tra tính toán khoảng cách color<- rgb(int(dist_road*200),0,0); } aspect displayCapacity { draw shape color: color border:color; } aspect Capacity_Index { draw shape color: rgb(density[35]*100,255,255) border:rgb(density[35]*255,255,255); //hsb(0.4 - 0.4 * (min([1.0, (max([0.0, Capacity_Index_LUT[35] - 0])) / 5])), 1.0, 1.0); } } species land_unit{ int landunit <-0; int landuse <-1; string s_LUT<-""; // chuỗi chứa các LUT được gán vào dvdd, nếu có 2 LUT cách nhau bằng dấu "_" 1_2 VD: 2 LUT 1 và 2; rgb color<- color_map[int(landuse)]; int number_lut;// số LUT cần thiết để bố trí cho DVDD; map area_needed_LUT;// PL-38 float totalArea_need_increase<-0.0; // current area of the LUTs map current_area_LUT;// // mới điều chỉnh 9/5/2018 map area_LUT_need_increasing; // // mới điều chỉnh map area_LUT_need_decreasing; // // mới điều chỉnh mapavailableLUT; // 1: LUC, 2: TSL, 3: màu . 6: LUK , 12 Láa tôm action tomau_dvdd{ color<- color_map[landuse]; } } species diked_area{ int id; int salinity; int duration; aspect nhan{ draw "salinity " + salinity color: #black size: 5; } } species road{ rgb color<- #red; aspect default { draw shape color:color border:color; } } species ranhxa{ rgb color <-#red; string village_name; aspect default { draw shape color:color border:color; } } species village{ rgb color <-#red; string village_name; int nongthonmoi; aspect default { //draw shape color:color border:color; draw village_name color: #black font: font("SansSerif", 18, #bold); } } species vungdanhgia{ rgb color<- #red; aspect default { draw shape color:color border:color; } } species canals{ rgb color <-#blue; aspect default { draw shape color:color border:color; } } grid cell_obs file: obs_map use_individual_shapes: false use_regular_agents: false neighbors: 8{ int landuse<- int(grid_value); } grid cell_thaydoi file: obs_map use_individual_shapes: false use_regular_agents: false neighbors: 8{ int landuse<- 0; string village_name; rgb color; reflex xacdinhvungbotri{ cell c <- cell[grid_x, grid_y]; PL-39 cell_obs o <- cell_obs[grid_x, grid_y]; if (c.landuse = o.landuse){ // grid_value <- 0.0; landuse <- 0; } else { // grid_value <- c.grid_value ; landuse <- c.landuse; } color<- color_map[landuse]; } } experiment LUAM_ST type: gui { output { display "Land use allocation - pixell" { overlay position: { 5, 5 } size: { 130 # px, (25 * length(land_use_type.keys) + 10) # px } background: # white transparency: 0.5 border: # black rounded: true { // draw "Date: " + current_date.month + " - " + current_date.year at: { 20 # px, 30 # px } color: # white font: font("SansSerif", 24, # bold); float y <- 20 # px; loop code over: land_use_type.keys { draw square(10 # px) at: { 20 # px, y } color: color_map[code] border:color_map[code]; draw land_use_type[code] at: { 40 # px, y + 4 # px } color: # black font: font("SansSerif", 13,#plain); y <- y + 25 # px; } } grid cell; // species road; species ranhxa; } display "Land use chart"{ chart "Tổng diện tích đất" type:series { loop code over: land_use_type.keys { data "LUT " + code value: float(active_cell count (each.landuse = code)) color:color_map[code]; } } } display "Bo tri LU - DVĐĐ - vector"{ species land_unit; } } } PL-40 PHỤ LỤC 11. Mã lệnh chương trình chính của LandOptimizer 'Imports Microsoft.Office.Interop.Excel ' Imports Microsoft.Office.Interop Imports System.Data.OleDb Imports System.Data Imports System.IO Public Class FrmMain Dim objSolver As New clsSolver ' Public v_Tongvon As Double Public v_tonglaodong As Double Public v_tongdt_dvdd As Double Public v_slgDVDD As Integer Public v_slgLUT As Integer Public v_slgSanpham As Integer Public v_fileDVDD As String Public st_PT_Hammuctieu As String = "" Public st_PT_Rangbuocchiphi As String Public st_PT_RangbuocDientichTN_LUT() As String Public st_PT_RangbuocDientich_LUT_max() As String Public st_PT_RangbuocDientich_LUT_min() As String Public st_PT_RangbuocSanpham_min() As String Public st_PT_RangbuocSanpham_max() As String Public st_PT_RangbuocDientich_LUT_DVDD_GT0() As String Public st_PT_RangbuocDientichDVDD() As String Public st_PT_RangbuocLaodong As String Public st_PT_RangbuocTongdtDVDD As String Public v_phuongan As String Private Sub mnuToiUuHoa_Click(sender As Object, e As EventArgs) Handles mnuToiUuHoa.Click System.Diagnostics.Debug.WriteLine(CurDir()) lpsolve55.Init(".") ' System.Diagnostics.Debug.WriteLine("bat dau phan toi uu") createGrdKetqua() objSolver.LUOptimizer() End Sub Private Sub mnuExit_Click(sender As Object, e As EventArgs) Handles mnuExit.Click End End Sub Private Sub mnuAbout_Click(sender As Object, e As EventArgs) Handles mnuAbout.Click Dim frmAbout1 As New frmAbout frmAbout1.ShowDialog() End Sub Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'load_shp() End Sub Private Sub mnuNewProject_Click(sender As Object, e As EventArgs) Handles mnuNewProject.Click Dim frmNewProj1 As New frmNewProject frmNewProj1.ShowDialog() End Sub Private Sub toolNew_Click(sender As Object, e As EventArgs) Handles toolNew.Click PL-41 mnuNewProject.PerformClick() End Sub Private Sub toolOpen_Click(sender As Object, e As EventArgs) Handles toolOpen.Click mnuOpenProject.PerformClick() End Sub Private Sub toolChayToiuu_Click(sender As Object, e As EventArgs) Handles toolChayToiuu.Click mnuToiUuHoa.PerformClick() End Sub Private Sub cmdTaoPhtrinh_Click(sender As Object, e As EventArgs) Handles cmdTaoPhtrinh.Click createHammuctieu() createRangbuocDientichTN_DVDD() createRangbuocLaodong() createRangbuocDT_LUT() ' xaydung các phương trinh ràng buộc sản lwongj - thêm năm 2018 createRangbuocSanluong_min() createRangbuocSanluong_max() ' thêm năm t3/2019 - Thêm ra gf buộc diện tích các KSD >0 ' Bỏ vào tháng 4 / 2019 'createRangbuocDT_LUT_canduoi() ' tháng 4/2019: Bổ sung ràng buộc tổng diện tích LUT của mỗi DVDD >0 createRangbuocDientichLUT_DVDD_GT0() createRangbuocTongdtDVDD() Dim file As System.IO.FileStream 'LoadStream = New StreamWriter(OutputFile, False, System.Text.Encoding.Default) 'Try ' Indicate whether the text file exists If Not My.Computer.FileSystem.FileExists(CurDir() & "\hephuongtrinh.lp") Then ' Try to create the text file with all the info in it file = System.IO.File.Create(CurDir() & "\hephuongtrinh.lp") file.Close() End If Dim addInfo As System.IO.StreamWriter addInfo = My.Computer.FileSystem.OpenTextFileWriter(CurDir() & "\hephuongtrinh.lp", False, System.Text.Encoding.Default) ' System.Text.Encoding.Default: Để ghi file dạng ANSI bình thường ( Unicode LPSolve đọc lỗi) addInfo.WriteLine(st_PT_Hammuctieu) If chkRangbuocYC.Checked Then For i = 0 To v_slgLUT - 1 addInfo.WriteLine(st_PT_RangbuocDientich_LUT_max(i)) Next ' Phương trình ràng buộc cận dưới diwenj tích yêu cầu For i = 0 To v_slgLUT - 1 addInfo.WriteLine(st_PT_RangbuocDientich_LUT_min(i)) Next End If '' Tong dien tich của các LUT trong DVDD >0 để tránh trường hợp có DVDD không được bố trí For i = 0 To v_slgDVDD - 1 addInfo.WriteLine(st_PT_RangbuocDientich_LUT_DVDD_GT0(i)) Next PL-42 ' Đưa ràng buộc diện tích của DVĐ If chkRangbuocDVDD.Checked Then For i = 0 To v_slgDVDD - 1 addInfo.WriteLine(st_PT_RangbuocDientichDVDD(i)) Next End If ' Đư ầng buộc lao động vào If chkRangbuocLD.Checked Then addInfo.WriteLine(st_PT_RangbuocLaodong) ' addInfo.WriteLine(st_PT_RangbuocTongdtDVDD) End If ' themm rang buoc san luong If chkRangbuocSanluongmin.Checked Then For i = 0 To v_slgSanpham - 1 addInfo.WriteLine(st_PT_RangbuocSanpham_min(i)) 'MsgBox(st_PT_RangbuocSanpham_min(i)) Next End If If chkRangbuocSanluongmax.Checked Then For i = 0 To v_slgSanpham - 1 addInfo.WriteLine(st_PT_RangbuocSanpham_max(i)) ' MsgBox(st_PT_RangbuocSanpham_min(i)) Next End If addInfo.Close() 'Catch 'End Try MsgBox("Đã xây dựng hệ phương trình tối ưu xong") End Sub Private Sub createHammuctieu() ' Tạo hàm đa mục tiêu st_PT_Hammuctieu = " max: " Dim i As Integer = 0 Dim j As Integer = 0 Dim W1 As Double, W2 As Double, W3 As Double W1 = CDbl(txtTrongsoLN.Text) ' W2 = CDbl(txtTrongsoLD.Text) W2 = CDbl(txttso_MT.Text) W3 = CDbl(txtTso_RR.Text) For i = 0 To v_slgDVDD - 1 ' Duyệt số dòng của grdLoinhuanchuanhoa For j = 1 To v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa ' If grdThichNghi.Rows(i).Cells(j).Value 0 Then If rdDamuctieu.Checked Then 'Mỗi dòng ( 5 Lut * LD của từng lut * MT của từng LUT ' Bổ sung hàm (1-TN) * rủi ro ' làm tròn số TN* laodong: Khi TN >0 thi phai dung luong lao dong nhu nhau , ko anh huong boi cap TN v_phuongan = "DMT" If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_Hammuctieu = st_PT_Hammuctieu & "+" & W1 * grdLoinhuanChuanhoa.Rows(i).Cells(j).Value + W2 * Math.Round(grdThichNghi.Rows(i).Cells(j).Value) * grdMoitruong.Item(1, j - 1).Value - W3 * Math.Round(grdThichNghi.Rows(i).Cells(j).Value) * grdRuiro.Item(1, j - 1).Value & "x" & (i + 1) & j End If ElseIf rdThichnghi.Checked Then v_phuongan = "TN" If (grdThichNghi.Rows(i).Cells(j).Value 0) Then 'Mỗi dòng ( 5 Lut * LD của từng lut * MT của từng LUT PL-43 st_PT_Hammuctieu = st_PT_Hammuctieu & "+" & grdThichNghi.Rows(i).Cells(j).Value & "x" & (i + 1) & j End If ElseIf rdLN_MT.Checked Then v_phuongan = "LN_MT" If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_Hammuctieu = st_PT_Hammuctieu & "+" & grdLoinhuanChuanhoa.Rows(i).Cells(j).Value + Math.Round(grdThichNghi.Rows(i).Cells(j).Value) * grdMoitruong.Item(1, j - 1).Value & "x" & (i + 1) & j End If ElseIf rdLaodong.Checked Then ' Lấy dữ liệu lao động chuẩn hóa ' sua lai toi uu LN + LD (4/6/2019) v_phuongan = "LD" If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_Hammuctieu = st_PT_Hammuctieu & "+" & grdLaodongChuanhoa.Item(1, j - 1).Value & "x" & (i + 1) & j End If ElseIf rdLoinhuan.Checked Then v_phuongan = "LN" If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_Hammuctieu = st_PT_Hammuctieu & "+" & grdLoinhuanChuanhoa.Rows(i).Cells(j).Value & "x" & (i + 1) & j End If ElseIf rdMuctieutichhop.Checked Then v_phuongan = "Tichhop" If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_Hammuctieu = st_PT_Hammuctieu & "+" & grdLoinhuanChuanhoa.Rows(i).Cells(j).Value * grdMoitruong.Item(1, j - 1).Value * grdLaodongChuanhoa.Item(1, j - 1).Value & "x" & (i + 1) & j End If End If Next Next st_PT_Hammuctieu = st_PT_Hammuctieu & " ;" End Sub Private Sub createRangbuocDT_LUT() ' Ràng buộc tổng sản lượng sản phẩm của LUT (i) >= sản lượng tối thiểu yêu cầu của LUT (i) ' San luong = dientich* ns Dim i As Integer = 0 Dim j As Integer = 0 ReDim Preserve st_PT_RangbuocDientich_LUT_max(v_slgLUT) ReDim Preserve st_PT_RangbuocDientich_LUT_min(v_slgLUT) For j = 0 To v_slgLUT - 1 ' Duyệt số cot ( so LUT ) của grdTN ; Cot 0 la co DVDD nhung de dien vao cot 0 cua phuong trinh st_PT_RangbuocDientich_LUT_max(j) = "" st_PT_RangbuocDientich_LUT_min(j) = "" For i = 0 To v_slgDVDD - 1 ' DUyệt số dòng của grdTN (số DVDĐ) st_PT_RangbuocDientich_LUT_max(j) = st_PT_RangbuocDientich_LUT_max(j) & "+x" & (i + 1) & (j + 1) st_PT_RangbuocDientich_LUT_min(j) = st_PT_RangbuocDientich_LUT_min(j) & "+x" & (i + 1) & (j + 1) Next ' trường hợp bình thường càn lớn hơn diện tích yêu cầu ' Trường hợ đặt biệt = diện tích yêu cầu st_PT_RangbuocDientich_LUT_max(j) = st_PT_RangbuocDientich_LUT_max(j) & " <= " & grdRangbuoc.Rows(j).Cells(2).Value & " ;" ' cột 2 trong grdRangbuoc chứa diện tích ràng buộc của LUT ghi cận trên của yêu cầu PL-44 st_PT_RangbuocDientich_LUT_min(j) = st_PT_RangbuocDientich_LUT_min(j) & " >= " & grdRangbuoc.Rows(j).Cells(1).Value & " ;" ' cột 1 trong grdRangbuoc chứa diện tích ràng buộc của LUT ghi cận dưới của yêu cầu ' MsgBox(" PT rang buoc DT LUT:" & st_PT_RangbuocDientichTN_LUT(i)) Next End Sub Private Sub createRangbuocDientichTN_DVDD() ' Điều kiện Tổng diện tích các LUT cần tìm trong một DVDD(i) <= diện tích của ĐVDD(i) Dim i As Integer = 0 Dim j As Integer = 0 ReDim Preserve st_PT_RangbuocDientichDVDD(v_slgDVDD) ' For i = 0 To v_slgDVDD - 1 ' Duyệt số dòng của grdLoinhuanchuanhoa st_PT_RangbuocDientichDVDD(i) = "" For j = 1 To v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa 'Ngày 9/5/2018 sửa bỏ nhân với grdThichNghi.Rows(i).Cells(j + 1).Value * If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_RangbuocDientichDVDD(i) = st_PT_RangbuocDientichDVDD(i) & "+" & "x" & (i + 1) & j End If Next st_PT_RangbuocDientichDVDD(i) = st_PT_RangbuocDientichDVDD(i) & " <= " & grdDVDD.Rows(i).Cells(1).Value & " ;" ' cột 1 trong grdDVDDD chứa diện tích của ĐVĐĐ Next End Sub Private Sub createRangbuocDientichLUT_DVDD_GT0() ' Điều kiện Tổng diện tích các LUT cần tìm trong một DVDD(i) <= diện tích của ĐVDD(i) Dim i As Integer = 0 Dim j As Integer = 0 ReDim Preserve st_PT_RangbuocDientich_LUT_DVDD_GT0(v_slgDVDD) ' For i = 0 To v_slgDVDD - 1 ' Duyệt số dòng của grdLoinhuanchuanhoa st_PT_RangbuocDientich_LUT_DVDD_GT0(i) = "" For j = 1 To v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa 'Ngày 9/5/2018 sửa bỏ nhân với grdThichNghi.Rows(i).Cells(j + 1).Value * If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_RangbuocDientich_LUT_DVDD_GT0(i) = st_PT_RangbuocDientich_LUT_DVDD_GT0(i) & "+" & "x" & (i + 1) & j End If Next st_PT_RangbuocDientich_LUT_DVDD_GT0(i) = st_PT_RangbuocDientich_LUT_DVDD_GT0(i) & " > 0;" ' cột 1 trong grdDVDDD chứa diện tích của ĐVĐĐ Next End Sub Private Sub createRangbuocSanluong_min() ' Tổng diện tích sản phẩm 1 >= dien tich san pham i tối thiểu Dim i As Integer = 0 Dim j As Integer = 0 ReDim Preserve st_PT_RangbuocSanpham_min(v_slgSanpham) PL-45 ' Xem lại chỉ số k = 0 sản phẩm, loại bỏ tiêu đề nếu giữ chỉ số 0 For k = 0 To v_slgSanpham - 1 ' Duyệt số sản phẩm st_PT_RangbuocSanpham_min(k) = "" For j = 1 To v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa If (grdNangsuat.Rows(k).Cells(j).Value 0) Then For i = 0 To v_slgDVDD - 1 ' Duyệt số dòng của grdLoinhuanchuanhoa If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_RangbuocSanpham_min(k) = st_PT_RangbuocSanpham_min(k) & "+" & grdNangsuat.Rows(k).Cells(j).Value * grdVu_canhtac.Rows(k).Cells(j).Value & "x" & (i + 1) & j End If Next End If Next st_PT_RangbuocSanpham_min(k) = st_PT_RangbuocSanpham_min(k) & " >= " & grd_LN_rangbuoc.Rows(k).Cells(4).Value & " ;" ' cột 1 trong grdDVDDD chứa diện tích của ĐVĐĐ Next End Sub Private Sub createRangbuocSanluong_max() ' Tổng diện tích sản phẩm 1 >= dien tich san pham i tối thiểu Dim i As Integer = 0 Dim j As Integer = 0 ReDim Preserve st_PT_RangbuocSanpham_max(v_slgSanpham) ' Xem lại chỉ số k = 0 sản phẩm, loại bỏ tiêu đề nếu giữ chỉ số 0 For k = 0 To v_slgSanpham - 1 ' Duyệt số sản phẩm st_PT_RangbuocSanpham_max(k) = "" For j = 1 To v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa If (grdNangsuat.Rows(k).Cells(j).Value 0) Then For i = 0 To v_slgDVDD - 1 ' Duyệt số dòng của grdLoinhuanchuanhoa If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_RangbuocSanpham_max(k) = st_PT_RangbuocSanpham_max(k) & "+" & grdNangsuat.Rows(k).Cells(j).Value * grdVu_canhtac.Rows(k).Cells(j).Value & "x" & (i + 1) & j End If Next End If Next st_PT_RangbuocSanpham_max(k) = st_PT_RangbuocSanpham_max(k) & " <= " & grd_LN_rangbuoc.Rows(k).Cells(5).Value & " ;" ' cột 1 trong grdDVDDD chứa diện tích của ĐVĐĐ Next End Sub Private Sub createRangbuocLaodong() ' Điều kiện Tổng lao dộng cho các LUTi * dt_LUTi <= Tong lao dong Dim i As Integer = 0 Dim j As Integer = 0 st_PT_RangbuocLaodong = "" For i = 0 To v_slgDVDD - 1 ' Duyệt số dòng của grdLoinhuanchuanhoa For j = 1 To v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa If (grdLoinhuanChuanhoa.Rows(i).Cells(j).Value 0) Then st_PT_RangbuocLaodong = st_PT_RangbuocLaodong & "+" & grdLaodong.Item(1, j - 1).Value & "x" & (i + 1) & j End If Next Next st_PT_RangbuocLaodong = st_PT_RangbuocLaodong & " <= " & Val(txtTogngaycong.Text) & " ;" ' MsgBox("PT rang buoc DT DVĐ:" & st_PT_RangbuocLaodong PL-46 End Sub Private Sub createRangbuocTongdtDVDD() 'Tinh_tonglaodong dien tich cac bien X = tong dt cac dvdd Dim i As Integer = 0 Dim j As Integer = 0 st_PT_RangbuocTongdtDVDD = "" For i = 0 To v_slgDVDD - 1 ' Duyệt số dòng của grdLoinhuanchuanhoa For j = 1 To v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa If (grdThichNghi.Rows(i).Cells(j).Value 0) Then st_PT_RangbuocTongdtDVDD = st_PT_RangbuocTongdtDVDD & "+x" & (i + 1) & j End If Next Next st_PT_RangbuocTongdtDVDD = st_PT_RangbuocTongdtDVDD & " = " & v_tongdt_dvdd & " ;" ' MsgBox("PT rang buoc DT DVĐ:" & st_PT_RangbuocLaodong End Sub Private Sub cmdChayToiuu_Click(sender As Object, e As EventArgs) Handles cmdChayToiuu.Click System.Diagnostics.Debug.WriteLine(CurDir()) lpsolve55.Init(".") ' System.Diagnostics.Debug.WriteLine("bat dau phan toi uu") createGrdKetqua() objSolver.LUOptimizer() ' Xử lý kết quả tối ưu hóa xulyketqua() ' tinh dien tich, loi nhuận tinhtongdientich() ' tinh tong dien tich theo cot tinhtongloinhuan() ' tam khoa ' tính tổng sản lượng ' thêm grd Tong san luong tinhtongsanluong_ketqua() ' Tính các chỉ tiêu LĐ, LN, MT Tinh_tonglaodong() ' Xuất dữ liệu liên kết bản đô createGrdBando() XuatdulieuBando() End Sub ' Public Sub tinhtongsanluong_ketqua() Dim i As Integer grdKqSanluong.Rows.Clear() grdKqSanluong.Columns.Clear() grdKqSanluong.ColumnCount = v_slgSanpham + 1 grdKqSanluong.RowCount = 8 grdKqSanluong.Columns(0).HeaderText = "Sản lượng" For i = 1 To v_slgSanpham - 1 grdKqSanluong.Columns(i).HeaderText = grd_LN_rangbuoc.Rows(i).Cells(0).Value Next Dim k As Integer, j As Integer Dim v_tong As Double PL-47 ' Dim st As String For i = 0 To v_slgSanpham - 1 ' Duyệt số sản phẩm v_tong = 0.0 ' st = "" For j = 1 To v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa v_tong = v_tong + grdKetqua.Item(j, grdKetqua.RowCount - 3).Value * grdVu_canhtac.Rows(i).Cells(j).Value * grdNangsuat.Rows(i).Cells(j).Value ' st = st + grdKetqua.Item(j, grdKetqua.RowCount - 3).Value Next ' MsgBox(st) grdKqSanluong.Rows(0).Cells(i).Value = v_tong.ToString("N2") Next End Sub Public Sub tinhtongdientich() If grdKetqua.RowCount > 1 Then Dim tongcot As Double = 0 Dim j As Integer = 0 Dim index As Integer = 0 For index = 1 To grdKetqua.ColumnCount - 1 tongcot = 0 For j = 0 To v_slgDVDD - 1 'grdKetqua.RowCount - 2 tongcot += grdKetqua.Item(index, j).Value Next grdKetqua.Item(index, v_slgDVDD).Value = tongcot.ToString("N2") Next End If End Sub Public Sub tinhtongloinhuan() Dim v_Tongloinhuan As Double = 0 Dim tongcot As Double = 0 Dim j As Integer = 0 Dim index As Integer = 0 If grdKetqua.RowCount > 1 Then For index = 1 To grdKetqua.ColumnCount - 1 tongcot = 0 For j = 0 To v_slgDVDD - 1 'grdKetqua.RowCount - 4 ' tổng lợi nhuận theo LUTi If Not (grdKetqua.Item(index, j).Value Is Nothing) Then tongcot += grdKetqua.Item(index, j).Value * grdLoinhuan.Item(index, j).Value 'MsgBox("ket dòng " & j & " cot: " & index & " null") End If 'If Not (FrmMain.grdLoinhuan.Item(index, j).Value Is Nothing) Then ' MsgBox(FrmMain.grdKetqua.RowCount & " LN dòng" & j & " cot: " & index & " null") 'End If Next grdKetqua.Item(index, v_slgDVDD + 1).Value = tongcot.ToString("N2") 'grdKetqua.RowCount - 2 ' MsgBox(tongcot) v_Tongloinhuan = v_Tongloinhuan + tongcot Next End If txtTongLoinhuan.Text = v_Tongloinhuan.ToString("N2") End Sub Private Sub Tinh_tonglaodong() PL-48 Dim i As Integer ' Tạo ra số cột theo số lượng LUT 'grdKetqua.DataSource = Nothing grdKqLaodong.Rows.Clear() grdKqLaodong.Columns.Clear() grdKqLaodong.ColumnCount = v_slgLUT + 2 grdKqLaodong.RowCount = 8 grdKqLaodong.Columns(0).HeaderText = "Chỉ tiêu" For i = 1 To v_slgLUT 'FrmMain.grdDVDD.RowHeadersBorderStyle grdKqLaodong.Columns(i).HeaderText = "LUT" & Trim(Str(i)) Next grdKqLaodong.Columns(i).HeaderText = " Tổng " ' Tạo các dòng kchir tiêu grdKqLaodong.Rows(0).Cells(0).Value = "Diện tích" grdKqLaodong.Rows(1).Cells(0).Value = "Lao động" grdKqLaodong.Rows(2).Cells(0).Value = "Rủi ro" grdKqLaodong.Rows(3).Cells(0).Value = "Môi trường" ' Điên fkeets quả Dim v_tongld As Double, v_tongRuiro As Double, v_tongMoitruong As Double, v_tongdt As Double v_tongld = 0 v_tongRuiro = 0 v_tongMoitruong = 0 v_tongdt = 0 For i = 1 To v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa v_tongdt = v_tongdt + grdKetqua.Item(i, grdKetqua.RowCount - 3).Value grdKqLaodong.Rows(0).Cells(i).Value = grdKetqua.Item(i, grdKetqua.RowCount - 3).Value v_tongld = v_tongld + grdKetqua.Item(i, grdKetqua.RowCount - 3).Value * grdLaodong.Rows(i - 1).Cells(1).Value grdKqLaodong.Rows(1).Cells(i).Value = grdKetqua.Item(i, grdKetqua.RowCount - 3).Value * grdLaodong.Rows(i - 1).Cells(1).Value ' Rui ro v_tongRuiro = v_tongRuiro + grdKetqua.Item(i, grdKetqua.RowCount - 3).Value * grdRuiro.Rows(i - 1).Cells(1).Value grdKqLaodong.Rows(2).Cells(i).Value = grdKetqua.Item(i, grdKetqua.RowCount - 3).Value * grdRuiro.Rows(i - 1).Cells(1).Value ' Moi truong v_tongMoitruong = v_tongMoitruong + grdKetqua.Item(i, grdKetqua.RowCount - 3).Value * grdMoitruong.Rows(i - 1).Cells(1).Value grdKqLaodong.Rows(3).Cells(i).Value = grdKetqua.Item(i, grdKetqua.RowCount - 3).Value * grdMoitruong.Rows(i - 1).Cells(1).Value ' st = st + grdKetqua.Item(j, grdKetqua.RowCount - 3).Value Next ' MsgBox(st) grdKqLaodong.Rows(0).Cells(i).Value = v_tongdt.ToString("N2") grdKqLaodong.Rows(1).Cells(i).Value = v_tongld.ToString("N2") grdKqLaodong.Rows(2).Cells(i).Value = v_tongRuiro.ToString("N2") grdKqLaodong.Rows(3).Cells(i).Value = v_tongMoitruong.ToString("N2") End Sub Private Sub ToolTinhlaidulieu_Click(sender As Object, e As EventArgs) Handles ToolTinhlaidulieu.Click tinhtongdientich() ' tinh tong dien tich theo cot tinhtongloinhuan() ' tam khoa ' tính tổng sản lượng ' thêm grd Tong san luong PL-49 tinhtongsanluong_ketqua() ' Tính các chỉ tiêu LĐ, LN, MT Tinh_tonglaodong() End Sub 'Xuất dữ liệu tạo bản đô Private Sub XuatdulieuBando() Dim i As Integer = grdKetqua.RowCount Dim j As Integer = grdKetqua.RowCount If grdXuatbando.RowCount > 1 Then For i = 0 To v_slgDVDD - 1 For j = 1 To v_slgLUT ' tổng lợi nhuận theo LUTi If (grdKetqua.Item(j, i).Value > 0) Then 'grdKetqua.Item(i, j).Value = 10000 'MsgBox("ket dòng " & j & " cot: " & index & " null") grdXuatbando.Rows(i + 1).Cells(1).Value = grdXuatbando.Rows(i + 1).Cells(1).Value & "LUT" & Str(j) grdXuatbando.Rows(i + 1).Cells(2).Value = grdXuatbando.Rows(i + 1).Cells(2).Value & Str(j) End If Next Next End If End Sub Private Sub createGrdBando() Dim i As Integer ' Tạo ra số cột theo số lượng LUT 'grdKetqua.DataSource = Nothing grdXuatbando.Rows.Clear() grdXuatbando.Columns.Clear() grdXuatbando.RowCount = v_slgDVDD + 4 grdXuatbando.ColumnCount = v_slgLUT + 1 grdXuatbando.Rows(0).Cells(0).Value = "DVDD" grdXuatbando.Rows(0).Cells(1).Value = "LUT" grdXuatbando.Rows(0).Cells(2).Value = "code_LUT" 'For i = 1 To v_slgLUT ' 'FrmMain.grdDVDD.RowHeadersBorderStyle ' grdXuatbando.Rows(0).Cells(i).Value = "LUT" & Trim(Str(i)) 'Next ' Tạo ra số dòng theo số lượng ĐVĐ For i = 1 To v_slgDVDD 'FrmMain.grdDVDD.RowHeadersBorderStyle grdXuatbando.Rows(i).Cells(0).Value = i Next End Sub Private Sub exportSTLUAM_Click(sender As Object, e As EventArgs) Handles exportSTLUAM.Click Try ' Lưu và đóng excel Dim v_fname As String ' Dim kq As Integer Dim fopen As New SaveFileDialog fopen.FileName = "ketqua_landoptimizer.csv" 'End Try fopen.Filter = "CSV (*.csv)|*.csv" PL-50 fopen.ShowDialog() v_fname = fopen.FileName If File.Exists(v_fname) Then File.Delete(v_fname) End If Dim sw As New StreamWriter(v_fname) Dim st As String st = "DVDD" For j = 1 To v_slgLUT st = st & "," & j Next st = st & Chr(10) sw.Write(st) For i = 0 To grdKetqua.RowCount - 4 ' trừ ra 3 dòng cuối st = Str(i + 1) For j = 1 To grdKetqua.ColumnCount - 1 ' cột 0 là cột dvđ đã gán ở dòng trên st = st & "," & IIf(grdKetqua(j, i).Value "", grdKetqua(j, i).Value, 0) Next st = st & Chr(10) sw.Write(st) Next 'sw.Write("1,2,3,4,5,6" + Chr(10)) 'sw.Write("6, 7, 8, 9, 10") sw.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class PL-51 PHỤ LỤC 12. Lớp thực thi hệ phương trình bằng thư viện LPSOLVE Option Strict Off Option Explicit On Class clsSolver Public Sub Main() System.Diagnostics.Debug.WriteLine(CurDir()) lpsolve55.Init(".") End Sub Private Sub logfunc(ByVal lp As Integer, ByVal userhandle As Integer, ByVal Buf As String) System.Diagnostics.Debug.Write(Buf) End Sub Private Function ctrlcfunc(ByVal lp As Integer, ByVal userhandle As Integer) As Integer 'If set to True, then solve is aborted and returncode will indicate this. ctrlcfunc = True End Function Private Sub msgfunc(ByVal lp As Integer, ByVal userhandle As Integer, ByVal message As lpsolve55.lpsolve_msgmask) End Sub Public Sub LUOptimizer() Dim lp As Integer 'Read a model from an lp structure Dim v_file As String = CurDir() & "\hephuongtrinh.lp" ' hephuongtrinh.lp" ' MsgBox(v_file) lp = lpsolve55.read_LP(v_file, False, "test") If lp = 0 Then MsgBox("không tìm thấy hệ phương trình!") Exit Sub End If lpsolve55.set_outputfile(lp, CurDir() & "\ketquatoiuu.txt") lpsolve55.print_str(lp, "An lp structure can be created and read from a .lp file" & vbLf) lpsolve55.print_str(lp, "lp = lpsolve55.read_LP(""lp.lp"", False, ""test"")" & vbLf) lpsolve55.print_str(lp, "The verbose option is disabled" & vbLf) lpsolve55.print_str(lp, "lp is now:" & vbLf) lpsolve55.print_lp(lp) lpsolve55.print_str(lp, "solution:" & vbLf) lpsolve55.set_debug(lp, 1) lpsolve55.solve(lp) lpsolve55.set_debug(lp, 0) lpsolve55.print_objective(lp) lpsolve55.print_solution(lp, 1) Dim kq As Double = lpsolve55.get_objective(lp) ' MsgBox("Ham muc tieu :" & kq) FrmMain.txtGiatriHamMuctieu.Text = String.Format("{0:n2}", kq) lpsolve55.print_constraints(lp, 1) ' Bổ sung thêmdim i á Dim i1 As Integer Dim j1 As Integer Dim k1 As Integer Dim v_variables() As Double Dim sobien As Integer = lpsolve55.get_Ncolumns(lp) ReDim v_variables(sobien) PL-52 'Dim row2(5) As Integer 'Dim kq1 As Double = lpsolve55.get_constraints(lp, v_constraint) Dim kq1 As Double = lpsolve55.get_variables(lp, v_variables) Console.WriteLine(v_variables) Dim st As String = "" FrmMain.grdBien.RowCount = 65000 For i = 0 To sobien - 1 ' st = st & v_variables(i) & ";" FrmMain.grdBien.Rows(i).Cells(1).Value = v_variables(i) Next Dim k As Integer = 0 For i = 0 To FrmMain.v_slgDVDD - 1 ' Duyệt số dòng của grdLoinhuanchuanhoa For j = 1 To FrmMain.v_slgLUT ' DUyệt số cột của grdLoinhuanchuanhoa If (FrmMain.grdThichNghi.Rows(i).Cells(j).Value 0) Then FrmMain.grdKetqua.Rows(i).Cells(j).Value = v_variables(k).ToString("F2") ''F2 dinh dang so 2 so le k = k + 1 End If Next Next ' Kết thúc bổ sung lpsolve55.set_outputfile(lp, vbNullString) lpsolve55.delete_lp(lp) End Sub End Class PL-53 PHỤ LỤC 13. Hướng dẫn sử dụng LandOptimizer 13.1 Giới thiệu Phần mềm ứng dụng LandOptimizer được phát triển nhằm mục đích tối ưu hóa các diện tích các kiểu sử dụng đất nông nghiệp để hỗ trợ công tác quy hoạch sử dụng đất nông nghiệp. LandOptimizer được xây dựng bằng ngôn ngữ lập trình VB.NET, cung cấp cho người dùng công cụ thực hiện bài toán tối ưu hóa tuyến tính thông qua giao diện tiếng Việt. Người dùng chỉ cần nhập dữ liệu đầu vào theo các tiêu chí tối ưu hóa ban đầu, chương trình tự động xây dựng thành mô hình toán tối ưu hóa theo chuẩn của ngôn ngữ mô hình LP (Linear Programming). Mô hình toán sau đó được giải dựa trên thư viện LP_Solve 5.5 được phát triển bởi Michel Berkelaar ở Đại học Kỹ thuật Eindhoven. Kết quả trả về được LandOptimizer xử lý và xuất ra theo định dạng Excel và CSV để phục vụ bố trí diện tích đã tối ưu hóa lên bản đồ. 13.2 Giao diện của ứng dụng Giới thiệu các menu chức năng Hình 0.1 Các thực đơn lệnh của phần mềm Giới thiệu thanh công cụ của phần mềm PL-54 Hình 0.2 Thanh công cụ của phần mềm LandOptimizer 13.3 Tạo dự án mới B1: Để tạo dự án mới, click menu Tập tin\Tạo dự án mới hoặc chọn công cụ tương ứng trên thanh công cụ B2: Nhập số lượng kiểu sử dụng cần xét tối ưu hóa B3: Trường hợp có lớp bản đồ ĐVĐĐ dạng shapefile, người dùng chọn mở file, phần mềm sẽ nạp danh sách cột để người dùng chọn cột nào chứa mã đơn vị đất đai. Nếu không có bản đồ người dùng nhập số lượng đơn vị đất đai cần tối ưu hóa vào ô “Số lượng ĐVĐĐ” B4: Chọn tên file để lưu dự án ra file. Khi đó mỗi khi người dùng nhấn nút “Lưu file dự án, thông tin được lưu vào file này. Hình 0.3 Nhập đơn vị đất đai từ file PL-55 13.4 Nhập dữ liệu 13.4.1 Nhập đơn vị đất đai Trường hợp không có bản đồ, người dùng cần nhập diện tích cho mỗi đơn vị đất đai. Để nhập liệu người dùng thực hiện các bước sau: B1: Click chọn vào thẻ “1.ĐVĐĐ” các mã ĐVĐĐ đã được tạo tự động từ bước tạo dự án hoặc có sẵn từ file bản đồ B2: Nhập diện tích của từng đơn vị đất đai vào cột ”dientich” Hình 0.4 Trang nhập thông tin đơn vị đất đai 13.4.2 Nhập kiểu sử dụng Khung nhập các kiểu sử dụng được tạo ra tự động từ khi khai báo dự án mới. Mã kiểu sử dụng được đánh số tự động trong trang nhập “2.LUT”. Người dùng cần nhập thêm các thông tin: Tên kiểu sử dụng, lợi nhuận (triệu đồng/ha) vào cột tương ứng PL-56 Hình 0.5 Nhập các kiểu sử dụng 13.4.3 Nhập dữ liệu thích nghi đất đai Khi click vào trang “3. Thích nghi” bảng dữ liệu thích nghi đất đai được tạo sẵn gồm các ô trống để người dùng nhập vào. Cấu trúc bảng này gồm các dòng là các đơn vị đất đai, các cột là các kiểu sử dụng. B1: Thực hiện phân tích thích nghi đất đai của từng kiểu sử dụng cho các ĐVĐĐ. Bước này được thực hiện bên ngoại phần mềm theo hướng dân xủa FAO(1976). B2: Nhập liệu vào bảng với giá trị đã được lượng hóa cho các cấp thích nghi như sau: Cấp S1: 1; S2: 0.67; S3: 0.33; N:0. PL-57 Hình 0.6 Nhập thích nghi đất đai của các KSD 13.4.4 Nhập rủi ro Rủi ro của các kiểu sử dụng được thu thập từ điều tra thức tế theo tỷ lệ phần trăm đánh giá cho từng kiểu sử dụng. PL-58 Hình 0.7 Nhập rủi ro các kiểu sử dụng 13.4.5 Nhập lợi nhuận kiểu sử dụng Lợi nhuận của các kiểu sử dụng được tính dựa vào mức lợi nhuận điều tra và mức thích nghi của kiểu sử dụng trên từng đơn vị đất đai. B1: Mức lợi nhuận của kiểu sử dụng ở các mức thích nghi được tính bằng 100%, 75%, 50%, ứng với các mức thích nghi S1, S2, S3 và N. B2: Sau khi nhập dữ liệu, click nút Chuẩn hóa, dữ liệu lợi nhuận được chuẩn hóa sang khu bên phải của cửa sổ. Hình 0.8 Nhập và chuẩn hóa lợi nhuận kiểu sử dụng PL-59 13.4.6 Nhập ngày công lao động các kiểu sử dụng Số lượng lao động cho từng kiểu sử dụng được thu thập qua điều tra thực tế. B1: Nhập số ngày công/năm của từng kiểu sử dụng B2: Click nút Chuẩn hóa để thực hiện chuẩn hóa dữ liệu. Dữ liệu chuẩn hóa thể hiện trong bảng dữ liệu bên phải của cửa sổ. Số ngày công lớn nhất được chuẩn hóa về 1, số ngày công còn loại Hình 0.9 Nhập và chuẩn hóa số ngày công các kiểu sử dụng 13.4.7 Nhập chỉ số môi tường của các kiểu sử dụng Chỉ số tốt cho môi trường của các kiểu sử dụng được điều tra thực tế tỷ lệ phần trăm đánh giá kiểu sử dụng tốt cho môi trường. PL-60 Hình 0.10 Nhập chỉ số tốt cho môi trường của kiểu sử dụng 13.4.8 Nhập số vụ của các kiểu sử dụng Mối kiểu sử dụng sản xuất một hoặc vài sản phẩm, dữ liệu các sản phẩm được thể hiện qua bảng ở trang “9. Vu”. Trong đó người dùng cần xác định kiểu sử dụng nào có sản phẩm gì, số vụ là bao nhiêu B1: Nhập từng dòng sản phẩm, số vụ >0 vào cột là sản phẩm của kiểu sử dụng, số vụ 0 vào cột mà KSD không có sản phẩm. Ví dụ: Số vụ lúa của LUT1 là 3 thì nhập số 3 vào cột tương ứng của dòng “lúa”, không sản xuất thì nhập giá trị 0 B2: Lặp lại từng dòng sản phẩm. Hình 0.11 Nhập số vụ của các kiểu sử dụng 13.4.9 Nhập dữ liệu năng suất Tương tự như dữ liệu vụ, dữ liệu năng suất trung bình trong điều tra của từng loại sản phẩm được nhập vào cột kiểu sử dụng tương ứng. Nếu kiểu sử dụng không sản xuất loại sản phẩm thì nhập giá trị 0 PL-61 Hình 0.12 Nhập năng suất sản phẩm của các kiểu sử dụng 13.4.10 Nhập yêu cầu sản lượng Mỗi kiểu sử dụng cung cấp một loại nông sản (hoặc 2 loại nông sản với kiểu Lúa – tôm). Sản lượng yêu cầu được đặt ra gồm sản lượng tối thiểu và sản lượng tối đa. Sản lượng này được thu thập từ yêu cầu của địa phương. Thông thường giá trị này được dựa vào sản lượng nông sản của địa phương các năm trước để đặt mục tiêu cho các năm tới. B1: Người dùng nhập giá trị sản lượng các loại nông sản và sản lượng tương ứng B2: nếu không giới hạn sản lượng của một loại nông sản, người dùng nhập số max = 1.000.000.000 tấn. Hình 0.13 Nhập yêu cầu sản lượng tối thiểu và tối đa của các sản phẩm 13.4.11 Nhập yêu cầu diện tích Diện tích yêu cầu được đặt để giới hạn diện tích của các kiểu sử dụng gồm có diện tích cận trên và diện tích cận dưới. PL-62 B1: Nhập diện tích cận dưới của các kiểu sử dụng. Nếu không giới hạn cận dưới tứ diện tích có thể bằng 0 thì nhập số 0. Nếu diện tích tối thiểu phải có thì nhập giá trị diện tích tối thiểu B2: Nhập diện tích cân trên. Diện tích giới hạn cao nhất có thể bố trí để hạn chế diện tích phát triển nhằm giảm việc dư thừa sản phẩm tạo ra. Nếu không giới hạn diện tích cận trên thì nhập giá trị max = 10.000.000ha. Hình 0.14 Nhập yêu cầu diện tích tối thiểu và tối đa của các kiểu sử dụng 13.5 Chạy tối ưu hóa 13.5.1 Lựa chọn phương án tối ưu Sau khi nhập liệu đầy đủ, người dùng lập mô hình và chạy tối ưu hóa B1: Chọn trang “12. PA tối ưu hóa” B2: Chọn phương án tối ưu hóa trong khung tương ứng. Trong mục này gồm các tùy chọn - Tối ưu hóa lợi nhuận - Tối ưu hóa thích nghi: - Tối ưu hóa sử dụng lao động - Tối ưu hóa tích hợp Lợi nhuận, lao động và môi trường - Tối ưu hóa 2 mục tiêu Lợi nhuận và Môi trường - Tối ưu hóa Đa mục tiêu Lợi nhuận, rủi ro và môi trường PL-63 Hình 0.15 Lựa chọn phương án tối ưu hóa B3: Nhập trọng số của các mục tiêu. Trong trường hợp tối ưu hóa đa mục tiêu, các trọng số của các mục tiêu được đặt mặc định bằng 1. Người dùng thay đổi các giá trị trọng số trong khoảng 0-1 để thiết lập mức độ ưu tiên của các mục tiêu thành phần. Lưu ý nhập liệu các giá trị trọng số sao cho tổng trọng số của các mục tiêu bằng 1. 13.5.2 Chọn các phương trình ràng buộc Các phương trình ràng buộc gồm: - Ràng buộc tổng lao động: Cho phép lập phương trình ràng buộc tổng số ngày công canh tác các kiểu sử dụng nhờ hơn hoặc bằng tổng ngày công lao động lao động của vùng nghiên cứu - Ràng buộc diện tích của ĐVĐĐ. Ràng buộc này yêu cầu diện tích các LUT trong một đơn vị đất đai phải nhỏ hơn hoặc bằng diện tích của đơn vị đất đai đó - Ràng buộc diện tích tối thiểu/tối đa: Yêu cầu tổng diện tích của các kiểu sử dụng trong vùng nghiên cứu phải lớn hơn diện tích tối thiểu/nhỏ hơn diện tích tối đa của kiểu sử dụng. PL-64 - Ràng buộc sản lượng tối thiểu/tối đa: Lập phương trình ràng buộc yêu cầu cho các loại sản phẩm có sản lượng lớn hơn sản lượng tối thiểu/nhỏ hơn sản lượng tối đa 13.5.3 Chọn các tùy chọn đọc dữ liệu Ở các trang 1 và trang 8, các cột dữ liệu diện tích và diện tích tối thiểu, tối đa cần được xác định để phần mềm đọc dữ liệu diện tích tương ứng. Thứ tự cột bắt đầu từ 0. - Ví dụ trong trang 1, cột diện tích là cột số 2 thì nhập là 1 vào ô tương ứng - Trong trang 8, cột 2 và 3 chứ diện tích tối thiểu và tối đa thì nhập số 1 và 2 vào ô tương ứng. 13.5.4 Lập mô hình và chạy tối ưu hóa B1: Nhập dữ liệu đầy đủ B2: Lựa chọn các tùy chọn Phương án tối ưu, Phương trình ràng buộc và các tùy chọn đọc dữ liệu. B3: Click nút “Xây dựng hệ phương trình” để phần mềm xây dựng hệ phương trình tối ưu theo các tùy chọn mà người dùng đã chọn. B4: Click nút “Chạy tối ưu” để thực thi tối ưu hóa. Khi đó phần mềm sẽ gọi thư viện giải mô hình tối ưu hóa LP_Solve để tìm phương án tối ưu. B5 Đọc kết quả tối ưu hóa diện tích. Kết quả tối ưu hóa được thể hiện trong trang “13. Kết quả tối ưu hóa”. Kết quả được thể hiện gồm diện tích các kiểu sử dụng cho mỗi đơn vị đất đai Bên cạnh đó sản lượng của các loại nông sản của phương án được tính toán trong mục “Sản lượng” Kết quả của các chỉ tiêu diện tích, lao động được thể hiện trong mục “Kết quả các chỉ tiêu” PL-65 Hình 0.16 Đọc kết quả tối ưu hóa 13.6 Xuất dữ liệu bản đồ 13.6.1 Xuất kết quả tối ưu hóa Sau khi thực hiện tối ưu hóa, để xuất kết quả r tập tin. Ta thực hiện các bước sau: B1: Click nút “Xuất dữ liệu tối ưu hóa” trên thanh công cụ, cửa sổ lựa chọn file xuất hiện Hình 0.17 Chọn xuất dữ kết quả tối ưu hóa - B2: Chọn thư mục lưu, đặt tên file và click Save PL-66 Hình 0.18 Chọn tập tin kết quả cần xuất Kết quả xuất ra file dạng Excel PL-67 Hình 0.19 Kết quả tối ưu hóa xem dạng file Excel 13.6.2 Xuất kết quả tối ưu hóa ra mô hình bố trí đất sản xuất nông nghiệp ST- LUAM Để bố trí diện tích đã tối ưu hóa ra bản đồ, người dùng cần xuất dữ liệu tối ưu hóa ra file để đưa vào mô hình bố trí đất sản xuất nông nghiệp ST-LUAM B1: Click nút “Xuất kết quả tối ưu hóa sang ST-LUAM PL-68 Hình 0.20 Chọn xuất dữ kết quả tối ưu hóa cho bố trí đất sản xuất nông nghiệp B2: Chọn thư mục và đặt tên file, sau đó click nút Save để xuất dữ liệu. Kết quả xuất dữ liệu ra file dạng CSV như hình bên dưới. Trong đó LUT được ký hiệu bằng mã loại đất. Hình 0.21 Kết quả tối ưu hóa xuất cho mô hình tối ưu hóa PL-69 PHỤ LỤC 14. Danh sách các bài báo đã công bố 1. Nguyễn Hồng Thảo và Nguyễn Hiếu Trung, 2017. Xây dựng ứng dụng mã nguồn mở để tối ưu diện tích sử dụng đất nông nghiệp. Tạp chí Khoa học Trường Đại học Cần Thơ. 52a: 62-71. https://doi.org/10.22144/ctu.jvn.2017.111 2. Nguyễn Hồng Thảo, Nguyễn Hiếu Trung và Lê Quang Trí, 2017. Xây dựng mô hình hỗ trợ bố trí đất nông nghiệp - Trường hợp nghiên cứu ở huyện Mỹ Xuyên, tỉnh Sóc Trăng. Tạp chí Khoa học Trường Đại học Cần Thơ. Số chuyên đề: Môi trường và Biến đổi khí hậu (2): 166-177. https://doi.org/10.22144/ctu.jsi.2017.065 3. Thao, N.H. and Trung, N.H., 2018. Establishing an integrated model for supporting agricultural land use planning: A case study in Tran De district, Soc Trang province. Can Tho University Journal of Science. 54 (Special issue: Agriculture): 62-71. https://doi.org/10.22144/ctu.jsi.2018.096 4. Nguyễn Hồng Thảo, Nguyễn Hiếu Trung, Trương Chí Quang, Phạm Thanh Vũ, Phan Hoàng Vũ, Vương Tuấn Huy, Đặng Kim Sơn, 2019. Ứng dụng bài toán tối ưu hóa và bố trí sử dụng đất nông nghiệp cho vùng Đồng bằng sông Cửu Long. Tạp chí Khoa học Đất Số đặc biệt 57, 97–102. 5. Nguyễn Hồng Thảo và Nguyễn Hiếu Trung, 2019. Ứng dụng mô hình Monte Carlo dự báo diện tích đất sản xuất nông nghiệp trong tối ưu hóa đất nông nghiệp. Tạp chí Khoa học Trường Đại học Cần Thơ. 55 (Số chuyên đề: Môi trường và Biến đổi khí hậu)(2): 164-174. https://doi.org/10.22144/ctu.jsi.2019.143

Các file đính kèm theo tài liệu này:

  • pdfphan_tich_moi_quan_he_giua_cac_yeu_to_kinh_te_xa_hoi_moi_tru.pdf
  • docx5. Phieu thong tin luan an_EN_thao.docx
  • docx4. Phieu thong tin luan an_VN_thao.docx
  • pdf3_tomtat_nhthao_EN.pdf
  • pdf2_tomtat_nhthao_VN.pdf
Luận văn liên quan