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.
                
              
                                            
                                
            
 
            
                 242 trang
242 trang | 
Chia sẻ: tueminh09 | Lượt xem: 634 | Lượt tải: 0 
              
            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