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 |
Chia sẻ: tueminh09 | Ngày: 09/02/2022 | Lượt xem: 380 | 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