CUMUM/code/solution3.m

1151 lines
31 KiB
Matlab
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

clc,clear
%% 数据处理
SKK = 5;
% 增长率
date = 1+[
10, 5, 10, 4, 1, 6, -1, -4; % 第一行
6.5+(SKK-1)/2, 0, 0, 5, 0, 5, -3, -5; % 第二行
5, -5, -10, 6, -1, 4, -5, -6 % 第三行
]/100;
% 将矩阵的每一行分别赋值给n0
n0 = date(2, :); %三行分别表示最优环境,最可能环境和鲁棒环境
% 指定文件名和工作表名
filenama3 = '附件1.xlsx';
sheetname1 = '乡村的现有耕地';
% 读取数据
A = readmatrix(filenama3, 'Sheet', sheetname1, 'Range', 'C2:C27');
B = readmatrix(filenama3, 'Sheet', sheetname1, 'Range', 'C28:C35');
C = readmatrix(filenama3, 'Sheet', sheetname1, 'Range', 'C36:C51');
D = readmatrix(filenama3, 'Sheet', sheetname1, 'Range', 'C52:C55');
% 指定文件名和工作表名
filenama2 = '附件2.xlsx';
sheetname2 = '2023年统计的相关数据';
% 读取数据
MP = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'F2:F16')';
MTB = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'F17:F31')';
MS = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'F32:F46')';
MSb = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'F47:F65')';
MSbbb = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'F84:F86')';
MDc = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'F66:F83')';
MDcc = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'F87:F90')';
MZdd = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'F91:F108')';
MZd = MDc; % 将MDc的值赋给MZd
factorr = n0(3); % 每一行的倍数因子
% 初始化扩展矩阵
nummRowss = 8; % 目标行数
% 为每个向量初始化扩展矩阵
MP_expend = zeros(nummRowss, length(MP));
MTB_expend = zeros(nummRowss, length(MTB));
MS_expend = zeros(nummRowss, length(MS));
MSb_expend = zeros(nummRowss, length(MSb));
MSbbb_expend = zeros(nummRowss, length(MSbbb));
MDc_expend = zeros(nummRowss, length(MDc));
MDcc_expend = zeros(nummRowss, length(MDcc));
MZdd_expend = zeros(nummRowss, length(MZdd));
MZd_expend = zeros(nummRowss, length(MZd));
% 将第一行设置为原始行向量
MP_expend(1, :) = MP;
MTB_expend(1, :) = MTB;
MS_expend(1, :) = MS;
MSb_expend(1, :) = MSb;
MSbbb_expend(1, :) = MSbbb;
MDc_expend(1, :) = MDc;
MDcc_expend(1, :) = MDcc;
MZdd_expend(1, :) = MZdd;
MZd_expend(1, :) = MZd;
% 计算其余的行
for i = 2:nummRowss
% 对每个矩阵的每一行应用倍数因子
MP_expend(i, :) = MP_expend(i-1, :) * factorr;
MTB_expend(i, :) = MTB_expend(i-1, :) * factorr;
MS_expend(i, :) = MS_expend(i-1, :) * factorr;
MSb_expend(i, :) = MSb_expend(i-1, :) * factorr;
MSbbb_expend(i, :) = MSbbb_expend(i-1, :) * factorr;
MDc_expend(i, :) = MDc_expend(i-1, :) * factorr;
MDcc_expend(i, :) = MDcc_expend(i-1, :) * factorr;
MZdd_expend(i, :) = MZdd_expend(i-1, :) * factorr;
MZd_expend(i, :) = MZd_expend(i-1, :) * factorr;
end
% 将扩展后的矩阵重新赋值给原变量名
MP = MP_expend;
MTB = MTB_expend;
MS = MS_expend;
MSb = MSb_expend;
MSbbb = MSbbb_expend;
MDc = MDc_expend;
MDcc = MDcc_expend;
MZdd = MZdd_expend;
MZd = MZd_expend;
% 读取G列的数据
CP = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'G2:G16')';
CT = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'G17:G31')';
CS = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'G32:G46')';
CSb = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'G47:G65')';
CSbb = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'G84:G86')';
CDc = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'G66:G83')';
CDcc = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'G87:G90')';
CZdd = readmatrix(filenama2, 'Sheet', sheetname2, 'Range', 'G91:G108')';
CZd = CDc; % 将CDc的值赋给CZd
factorr = n0(4); % 每一行的倍数因子
% 初始化扩展矩阵
nummRowss = 8; % 目标行数
% 为每个向量初始化扩展矩阵
CP_expend = zeros(nummRowss, length(CP));
CT_expend = zeros(nummRowss, length(CT));
CS_expend = zeros(nummRowss, length(CS));
CSb_expend = zeros(nummRowss, length(CSb));
CSbb_expend = zeros(nummRowss, length(CSbb));
CDc_expend = zeros(nummRowss, length(CDc));
CDcc_expend = zeros(nummRowss, length(CDcc));
CZdd_expend = zeros(nummRowss, length(CZdd));
CZd_expend = zeros(nummRowss, length(CZd));
% 将第一行设置为原始行向量
CP_expend(1, :) = CP;
CT_expend(1, :) = CT;
CS_expend(1, :) = CS;
CSb_expend(1, :) = CSb;
CSbb_expend(1, :) = CSbb;
CDc_expend(1, :) = CDc;
CDcc_expend(1, :) = CDcc;
CZdd_expend(1, :) = CZdd;
CZd_expend(1, :) = CZd;
% 计算其余的行
for i = 2:nummRowss
% 对每个矩阵的每一行应用倍数因子
CP_expend(i, :) = CP_expend(i-1, :) * factorr;
CT_expend(i, :) = CT_expend(i-1, :) * factorr;
CS_expend(i, :) = CS_expend(i-1, :) * factorr;
CSb_expend(i, :) = CSb_expend(i-1, :) * factorr;
CSbb_expend(i, :) = CSbb_expend(i-1, :) * factorr;
CDc_expend(i, :) = CDc_expend(i-1, :) * factorr;
CDcc_expend(i, :) = CDcc_expend(i-1, :) * factorr;
CZdd_expend(i, :) = CZdd_expend(i-1, :) * factorr;
CZd_expend(i, :) = CZd_expend(i-1, :) * factorr;
end
% 将扩展后的矩阵重新赋值给原变量名
CP = CP_expend;
CT = CT_expend;
CS = CS_expend;
CSb = CSb_expend;
CSbb = CSbb_expend;
CDc = CDc_expend;
CDcc = CDcc_expend;
CZdd = CZdd_expend;
CZd = CZd_expend;
% 读取H列的数据
date_SDJ = readcell(filenama2, 'Sheet', sheetname2, 'Range', 'H32:H47');
date_SDYJ = readcell(filenama2, 'Sheet', sheetname2, 'Range', 'H48:H65');
date_SDEJ = readcell(filenama2, 'Sheet', sheetname2, 'Range', 'H84:H108');
% 初始化存储平均值的数组
SDJ = zeros(length(date_SDJ), 1);
SDYJ = zeros(length(date_SDYJ), 1);
SDEJ = zeros(length(date_SDEJ), 1);
% 处理SDJ数据
for i = 1:length(date_SDJ)
str = date_SDJ{i}; % 获取单元格数据
if ismissing(str)
SDJ(i) = NaN; % 处理缺失数据
else
parrts = split(str, '-'); % 按'-'分割字符串
numms = str2double(parrts); % 将分割后的字符串转换为数字
SDJ(i) = mean(numms); % 计算平均值
end
end
% 处理SDYJ数据
for i = 1:length(date_SDYJ)
str = date_SDYJ{i};
if ismissing(str)
SDYJ(i) = NaN;
else
parrts = split(str, '-');
numms = str2double(parrts);
SDYJ(i) = mean(numms);
end
end
% 处理SDEJ数据
for i = 1:length(date_SDEJ)
str = date_SDEJ{i};
if ismissing(str)
SDEJ(i) = NaN;
else
parrts = split(str, '-');
numms = str2double(parrts);
SDEJ(i) = mean(numms);
end
end
SDJ = SDJ';
% 初始化矩阵
nummRowss = 8; % 目标行数
nummCols = length(SDJ); % 列数与 SDJ 的长度相同
factorr = n0(5); % 取 n0 的第五个元素作为倍数因子
result = zeros(nummRowss, nummCols); % 初始化结果矩阵
% 将第一行设置为 SDJ
result(1, :) = SDJ;
% 计算其余的行
for i = 2:nummRowss
result(i, :) = result(i-1, :) * factorr; % 每一行是上一行的 n0(5) 倍
end
SDJ = result;
SDYJ = SDYJ';
% 初始化矩阵
nummRowss = 8; % 目标行数
nummCols = length(SDYJ); % 列数与 SDJ 的长度相同
factorr = n0(6); % 取 n0 的第五个元素作为倍数因子
result = zeros(nummRowss, nummCols); % 初始化结果矩阵
% 将第一行设置为 SDYJ
result(1, :) = SDYJ;
% 计算其余的行
for i = 2:nummRowss
result(i, :) = result(i-1, :) * factorr; % 每一行是上一行的 n0(5) 倍
end
SDYJ = result;
SDEJ = SDEJ';
% 取 n0 向量中的倍数因子
factorr6 = n0(6); % 对于第4,5,6元素
factorr7 = n0(7); % 对于第7元素
factorr8 = n0(8); % 对于其他元素
% 初始化矩阵
nummRowss = 8; % 目标行数
nummCols = length(SDEJ); % 列数与 SDEJ 的长度相同
result = zeros(nummRowss, nummCols); % 初始化结果矩阵
% 将第一行设置为原始的 SDEJ
result(1, :) = SDEJ;
% 计算其余的行
for i = 2:nummRowss
% 对于每一行,根据条件进行扩展
rowPrevious = result(i-1, :); % 取得上一行
newRow = rowPrevious; % 初始化新行
% 对于第4,5,6元素
newRow(4:6) = rowPrevious(4:6) * factorr7;
% 对于第7元素
newRow(7) = rowPrevious(7) * factorr8;
% 其他元素
newRow([1:3, 8:end]) = rowPrevious([1:3, 8:end]) * factorr6;
% 将新行赋值到结果矩阵
result(i, :) = newRow;
end
SDEJ = result;
% 指定文件名和工作表名
filenama = '附件2.xlsx';
sheetname = '2023年的农作物种植情况';
% 读取整个B列和E列的数据
B_date = readmatrix(filenama, 'Sheet', sheetname, 'Range', 'B2:B88');
E_date = readmatrix(filenama, 'Sheet', sheetname, 'Range', 'E2:E88');
% 任务1: 创建并填充a0矩阵
a0 = zeros(26, 15);
for i = 1:26
colIndex = B_date(i);
if colIndex >= 1 && colIndex <= 15
a0(i, colIndex) = E_date(i);
end
end
% 任务2: 创建并填充b0矩阵
b0 = zeros(8, 19); % 行数增加到8以容纳最后的设置
evenRowss = [28, 30, 32, 34, 36, 38];
for i = 1:6
colIndex = B_date(evenRowss(i) - 1) - 16;
if colIndex >= 1 && colIndex <= 19
b0(i, colIndex) = E_date(evenRowss(i) - 1);
end
end
b0(7, 1) = 22; % 手动设置的值
b0(8, 1) = 20;
% 任务3: 创建并填充bb0矩阵
bb0 = zeros(8, 3);
oddRowss = [29, 31, 33, 35, 37, 39];
for i = 1:6
colIndex = B_date(oddRowss(i) - 1) - 34;
if colIndex >= 1 && colIndex <= 3
bb0(i, colIndex) = E_date(oddRowss(i) - 1);
end
end
% 任务4: 创建并填充c0矩阵
filenama = '附件2.xlsx';
sheetname = '2023年的农作物种植情况';
% 读取B列和E列的指定行数据
RowssC0 = [42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 71, 73];
B_date_c0 = readmatrix(filenama, 'Sheet', sheetname, 'Range', ['B' num2str(min(RowssC0)) ':B' num2str(max(RowssC0))]);
E_date_c0 = readmatrix(filenama, 'Sheet', sheetname, 'Range', ['E' num2str(min(RowssC0)) ':E' num2str(max(RowssC0))]);
% 初始化零矩阵c0长16, 宽18
c0 = zeros(16, 18);
% 行映射注意第15行用两次
rowMapC0 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 16];
% 填充c0矩阵
for i = 1:length(RowssC0)
colIndex = B_date_c0(i) - 16; % 计算横坐标
rowIndex = rowMapC0(i); % 获取映射的行索引
if colIndex >= 1 && colIndex <= 18
c0(rowIndex, colIndex) = E_date_c0(i); % 存储数据
end
end
% 任务5: 创建并填充cc0矩阵
cc0 = zeros(16, 4);
selectedRowssCC0 = [43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 72, 74] - 1;
for i = 1:length(selectedRowssCC0)
colIndex = B_date(selectedRowssCC0(i)) - 37;
if colIndex >= 1 && colIndex <= 4
cc0(i, colIndex) = E_date(selectedRowssCC0(i));
end
end
% 任务6: 创建并填充d0矩阵
d0 = zeros(4, 18);
RowssD0 = [75, 76, 79, 80, 83, 86] - 1;
rowIndices = [1, 1, 2, 2, 3, 4]; % 映射到相应的行数
for i = 1:length(RowssD0)
colIndex = B_date(RowssD0(i)) - 16;
if colIndex >= 1 && colIndex <= 18
d0(rowIndices(i), colIndex) = E_date(RowssD0(i));
end
end
% 任务7: 创建并填充dd0矩阵
dd0 = zeros(4, 18);
RowssDD0 = [77, 78, 81, 82, 84, 85, 87, 88] - 1;
rowIndices = [1, 1, 2, 2, 3, 3, 4, 4]; % 映射到相应的行数
for i = 1:length(RowssDD0)
colIndex = B_date(RowssDD0(i)) - 16;
if colIndex >= 1 && colIndex <= 18
dd0(rowIndices(i), colIndex) = E_date(RowssDD0(i));
end
end
GDJ =zeros(1,16);
GDYJ =zeros(1,18);
GDEJ =zeros(1,25);
% 预期收获(斤)
MP
GDJ(1:15) = MP(1,:).*sum(a0(1:6,:),1) + MTB(1,:).*sum(a0(7:20,:),1) + MS(1,:).*sum(a0(21:26,:),1);
GDJ(16) = MSb(1,1)*sum(b0(:,1),1);
GDYJ = MSb(1,2:19).*sum(b0(:,2:19),1) + MDc(1,:).*sum(c0(:,:),1) + MZd(1,:).*sum(d0(:,:),1);
GDEJ(1:3) = MSbbb(1,:).*sum(bb0(:,:),1);
GDEJ(4:7) = MDcc(1,:).*sum(cc0(:,:),1);
GDEJ(8:end) = MZdd(1,:).*sum(dd0(:,:),1);
factorr1 = n0(1); % 对于第1,2元素
factorr2 = n0(2); % 对于其他元素
% 初始化矩阵
nummRowss = 8; % 目标行数
nummCols = length(GDJ); % 列数与 GDJ 的长度相同
GDJ_expend = zeros(nummRowss, nummCols); % 初始化结果矩阵
% 将第一行设置为原始的 GDJ
GDJ_expend(1, :) = GDJ;
% 计算其余的行
for i = 2:nummRowss
% 取得上一行
rowPrevious = GDJ_expend(i-1, :);
% 初始化新行
newRow = rowPrevious;
% 对于第1,2元素
newRow(1:2) = rowPrevious(1:2) * factorr1;
% 对于其他元素
newRow(3:end) = rowPrevious(3:end) * factorr2;
% 将新行赋值到结果矩阵
GDJ_expend(i, :) = newRow;
end
factorr = n0(2); % 对于所有元素的倍数因子
% 初始化矩阵
nummRowss = 8; % 目标行数
nummCols_GDYJ = length(GDYJ); % GDYJ 的列数
nummCols_GDEJ = length(GDEJ); % GDEJ 的列数
% 初始化扩展矩阵
GDYJ_expend = zeros(nummRowss, nummCols_GDYJ); % GDYJ 扩展矩阵
GDEJ_expend = zeros(nummRowss, nummCols_GDEJ); % GDEJ 扩展矩阵
% 将第一行设置为原始行向量
GDYJ_expend(1, :) = GDYJ;
GDEJ_expend(1, :) = GDEJ;
% 计算其余的行
for i = 2:nummRowss
% 取得上一行
rowPrevious_GDYJ = GDYJ_expend(i-1, :);
rowPrevious_GDEJ = GDEJ_expend(i-1, :);
% 初始化新行
newRow_GDYJ = rowPrevious_GDYJ;
newRow_GDEJ = rowPrevious_GDEJ;
% 将每一行的元素乘以倍数因子
newRow_GDYJ = rowPrevious_GDYJ * factorr;
newRow_GDEJ = rowPrevious_GDEJ * factorr;
% 将新行赋值到结果矩阵
GDYJ_expend(i, :) = newRow_GDYJ;
GDEJ_expend(i, :) = newRow_GDEJ;
end
GDJ = GDJ_expend;
GDYJ = GDYJ_expend;
GDEJ = GDEJ_expend;
%% 回归分析
r1 = CP(1,:)';
r2 = SDJ(1,1:15)';
r3 = GDJ(1,1:15)';
% 假设 r1, r2 和 r3 是 15x1 列向量
X = [r1, r2]; % 自变量矩阵
Y = r3; % 响应变量向量
% 创建回归模型
mdl = fitlm(X, Y);
% 显示模型的详细信息
disp(mdl);
% 提取回归系数及其统计信息
coefficients = mdl.Coefficients;
disp(coefficients);
% 绘制残差图
figure;
subplot(1,1,1);
plotResiduals(mdl, 'fitted');
title('拟合残差');
figure;
% 绘制正态概率图
subplot(1,1,1);
plotResiduals(mdl, 'probability');
title('正态概率图');
%% 变量设计
a = sdpvar(26,15,8);
b = sdpvar(8,19,8);
bb = sdpvar(8,3,8);
c = sdpvar(16,18,8);
cc = sdpvar(16,4,8);
d = sdpvar(4,18,8);
dd = sdpvar(4,18,8);
b_temp = binvar(8,1,8);
arr = binvar(26,15,8);
br = binvar(8,19,8);
bbr = binvar(8,3,8);
cr = binvar(16,18,8);
ccr = binvar(16,4,8);
dr = binvar(4,18,8);
ddr = binvar(4,18,8);
mDJ= sdpvar(1,16,8);
mDYJ= sdpvar(1,18,8);
mDEJ= sdpvar(1,25,8);
cDJ= sdpvar(1,16,8);
cDYJ= sdpvar(1,18,8);
cDEJ= sdpvar(1,25,8);
QDJ= sdpvar(1,16,8);
QDYJ= sdpvar(1,18,8);
QDEJ= sdpvar(1,25,8);
% = sdpvar(,,);
% = sdpvar(,,);
% 约束设置
Constraintsshb = [];
% 2023年数据载入
Constraintsshb = [Constraintsshb,a(:,:,1) == a0];
Constraintsshb = [Constraintsshb,b(:,:,1) == b0];
Constraintsshb = [Constraintsshb,bb(:,:,1) == bb0];
Constraintsshb = [Constraintsshb,c(:,:,1) == c0];
Constraintsshb = [Constraintsshb,cc(:,:,1) == cc0];
Constraintsshb = [Constraintsshb,d(:,:,1) == d0];
Constraintsshb = [Constraintsshb,dd(:,:,1) == dd0];
% % 水浇地每年可以单季种植水稻或两季种植蔬菜作物。
Constraintsshb = [Constraintsshb, sum(bb,2) <= b_temp*10e5];
Constraintsshb = [Constraintsshb, 10e-4-b(:,1,2:8)<=b_temp(:,:,2:8)*100];
Constraintsshb = [Constraintsshb, 100-b(:,1,2:8)>=b_temp(:,:,2:8)*100];
% 种植面积约束
Constraintsshb = [Constraintsshb, sum(arr,2) <= SKK];
Constraintsshb = [Constraintsshb, 0.1*arr(:,:,2:8)<=a(:,:,2:8)];
Constraintsshb = [Constraintsshb, repmat(A, [1, 15, 7]).*arr(:,:,2:8)>=a(:,:,2:8)];
Constraintsshb = [Constraintsshb, sum(br,2) <= SKK];
Constraintsshb = [Constraintsshb, 0.1*br(:,:,2:8)<=b(:,:,2:8)];
Constraintsshb = [Constraintsshb, repmat(B, [1, 19, 7]).*br(:,:,2:8)>=b(:,:,2:8)];
Constraintsshb = [Constraintsshb, sum(bbr,2) <= SKK];
Constraintsshb = [Constraintsshb, 0.1*bbr(:,:,2:8)<=bb(:,:,2:8)];
Constraintsshb = [Constraintsshb, repmat(B, [1, 3, 7]).*bbr(:,:,2:8)>=bb(:,:,2:8)];
Constraintsshb = [Constraintsshb, sum(cr,2) <= SKK];
Constraintsshb = [Constraintsshb, 0.1*cr(:,:,2:8)<=c(:,:,2:8)];
Constraintsshb = [Constraintsshb, repmat(C, [1, 18, 7]).*cr(:,:,2:8)>=c(:,:,2:8)];
Constraintsshb = [Constraintsshb, sum(ccr,2) <= SKK];
Constraintsshb = [Constraintsshb, 0.1*ccr(:,:,2:8)<=cc(:,:,2:8)];
Constraintsshb = [Constraintsshb, repmat(C, [1, 4, 7]).*ccr(:,:,2:8)>=cc(:,:,2:8)];
Constraintsshb = [Constraintsshb, sum(dr,2) <= SKK];
Constraintsshb = [Constraintsshb, 0.1*dr(:,:,2:8)<=d(:,:,2:8)];
Constraintsshb = [Constraintsshb, repmat(D, [1, 18, 7]).*dr(:,:,2:8)>=d(:,:,2:8)];
Constraintsshb = [Constraintsshb, sum(ddr,2) <= SKK];
Constraintsshb = [Constraintsshb, 0.1*ddr(:,:,2:8)<=dd(:,:,2:8)];
Constraintsshb = [Constraintsshb, repmat(D, [1, 18, 7]).*ddr(:,:,2:8)>=dd(:,:,2:8)];
% 连续两年种植不同
Constraintsshb = [Constraintsshb, arr(:,:,1:7)+arr(:,:,2:8)<=1];
Constraintsshb = [Constraintsshb, br(:,:,1:7)+br(:,:,2:8)<=1];
Constraintsshb = [Constraintsshb, bbr(:,:,1:7)+bbr(:,:,2:8)<=1];
Constraintsshb = [Constraintsshb, cr(:,:,1:7)+cr(:,:,2:8)<=1];
Constraintsshb = [Constraintsshb, ccr(:,:,1:7)+ccr(:,:,2:8)<=1];
Constraintsshb = [Constraintsshb, dr(:,:,1:7)+dr(:,:,2:8)<=1];
Constraintsshb = [Constraintsshb, ddr(:,:,1:7)+ddr(:,:,2:8)<=1];
% 三年种一次豆类
for i =1:6
Constraintsshb = [Constraintsshb, sum(a(:,1:5,i)+a(:,1:5,i+1)+a(:,1:5,i+2),2)>=A*0.5];
Constraintsshb = [Constraintsshb, sum(b(:,2:4,i)+b(:,2:4,i+1)+b(:,2:4,i+2),2)>=B*0.5];
Constraintsshb = [Constraintsshb, sum(c(:,1:3,i)+c(:,1:3,i+1)+c(:,1:3,i+2),2)>=C*0.5];
Constraintsshb = [Constraintsshb, sum(d(:,1:3,i)+d(:,1:3,i+1)+d(:,1:3,i+2)+dd(:,1:3,i)+dd(:,1:3,i+1)+dd(:,1:3,i+2),2)>=D*0.5];
end
%% 目标函数
% 收获(斤)
MP= permute(MP, [2, 3,1]);
MP= permute(MP, [2, 1, 3]);
% 对 CP 进行相同操作
CP = permute(CP, [2, 3, 1]);
CP = permute(CP, [2, 1, 3]);
% 对 CT 进行相同操作
CT = permute(CT, [2, 3, 1]);
CT = permute(CT, [2, 1, 3]);
% 对 CS 进行相同操作
CS = permute(CS, [2, 3, 1]);
CS = permute(CS, [2, 1, 3]);
% 对 CSb 进行相同操作
CSb = permute(CSb, [2, 3, 1]);
CSb = permute(CSb, [2, 1, 3]);
% 对 CSbb 进行相同操作
CSbb = permute(CSbb, [2, 3, 1]);
CSbb = permute(CSbb, [2, 1, 3]);
% 对 CDc 进行相同操作
CDc = permute(CDc, [2, 3, 1]);
CDc = permute(CDc, [2, 1, 3]);
% 对 CDcc 进行相同操作
CDcc = permute(CDcc, [2, 3, 1]);
CDcc = permute(CDcc, [2, 1, 3]);
% 对 CZdd 进行相同操作
CZdd = permute(CZdd, [2, 3, 1]);
CZdd = permute(CZdd, [2, 1, 3]);
% 对 CZd 进行相同操作
CZd = permute(CZd, [2, 3, 1]);
CZd = permute(CZd, [2, 1, 3]);
% 对 MTB 进行相同操作
MTB = permute(MTB, [2, 3, 1]);
MTB = permute(MTB, [2, 1, 3]);
% 对 MS 进行相同操作
MS = permute(MS, [2, 3, 1]);
MS = permute(MS, [2, 1, 3]);
% 对 MSb 进行相同操作
MSb = permute(MSb, [2, 3, 1]);
MSb = permute(MSb, [2, 1, 3]);
% 对 MSbbb 进行相同操作
MSbbb = permute(MSbbb, [2, 3, 1]);
MSbbb = permute(MSbbb, [2, 1, 3]);
% 对 MDc 进行相同操作
MDc = permute(MDc, [2, 3, 1]);
MDc = permute(MDc, [2, 1, 3]);
% 对 MDcc 进行相同操作
MDcc = permute(MDcc, [2, 3, 1]);
MDcc = permute(MDcc, [2, 1, 3]);
% 对 MZdd 进行相同操作
MZdd = permute(MZdd, [2, 3, 1]);
MZdd = permute(MZdd, [2, 1, 3]);
% 对 MZd 进行相同操作
MZd = permute(MZd, [2, 3, 1]);
MZd = permute(MZd, [2, 1, 3]);
mDJ(1,1:15,:) = MP.*sum(a(1:6,:,:),1) + MTB.*sum(a(7:20,:,:),1) + repmat(MS, [1, 1, 1]).*sum(a(21:26,:,:),1);
mDJ(1,16,:) = repmat(MSb(1,1,:), [1, 1, 1]).*sum(b(:,1,:),1);
mDYJ = repmat(MSb(1,2:19,:), [1, 1, 1]).*sum(b(:,2:19,:),1) + repmat(MDc, [1, 1, 1]).*sum(c(:,:,:),1) + repmat(MZd, [1, 1, 1]).*sum(d(:,:,:),1);
mDEJ(1,1:3,:) = repmat(MSbbb, [1, 1, 1]).*sum(bb(:,:,:),1);
mDEJ(1,4:7,:) = repmat(MDcc, [1, 1, 1]).*sum(cc(:,:,:),1);
mDEJ(1,8:end,:) = repmat(MZdd, [1, 1, 1]).*sum(dd(:,:,:),1);
% 总成本
cDJ(1,1:15,:) = repmat(CP, [1, 1, 1]).*sum(a(1:6,:,:),1) + repmat(CT, [1, 1, 1]).*sum(a(7:20,:,:),1) + repmat(CS, [1, 1, 1]).*sum(a(21:26,:,:),1);
cDJ(1,16,:) = repmat(CSb(1,1,:), [1, 1, 1]).*sum(b(:,1,:),1);
cDYJ = repmat(CSb(1,2:19,:), [1, 1, 1]).*sum(b(:,2:19,:),1) + repmat(CDc, [1, 1, 1]).*sum(c(:,:,:),1) + repmat(CZd, [1, 1, 1]).*sum(d(:,:,:),1);
cDEJ(1,1:3,:) = repmat(CSbb, [1, 1, 1]).*sum(bb(:,:,:),1);
cDEJ(1,4:7,:) = repmat(CDcc, [1, 1, 1]).*sum(cc(:,:,:),1);
cDEJ(1,8:end,:) = repmat(CZdd, [1, 1, 1]).*sum(dd(:,:,:),1);
% 最终收益
% Constraintsshb = [Constraintsshb, QDJ(:,:,2:8)<=mDJ(:,:,2:8)];
% Constraintsshb = [Constraintsshb, QDJ(:,:,2:8)<=repmat(GDJ, [1, 1, 7])];
% Constraintsshb = [Constraintsshb, QDYJ(:,:,2:8)<=mDYJ(:,:,2:8)];
% Constraintsshb = [Constraintsshb, QDYJ(:,:,2:8)<=repmat(GDYJ, [1, 1, 7])];
% Constraintsshb = [Constraintsshb, QDEJ(:,:,2:8)<=mDEJ(:,:,2:8)];
% Constraintsshb = [Constraintsshb, QDEJ(:,:,2:8)<=repmat(GDEJ, [1, 1, 7])];
GDJ = permute(GDJ, [2, 3, 1]);
GDJ = permute(GDJ, [2, 1, 3]);
GDYJ = permute(GDYJ, [2, 3, 1]);
GDYJ = permute(GDYJ, [2, 1, 3]);
GDEJ = permute(GDEJ, [2, 3, 1]);
GDEJ = permute(GDEJ, [2, 1, 3]);
Constraintsshb = [Constraintsshb, mDJ(:,:,2:8)<=(GDJ(:,:,2:8))*1];
Constraintsshb = [Constraintsshb, mDYJ(:,:,2:8)<=(GDYJ(:,:,2:8))*1];
Constraintsshb = [Constraintsshb, mDEJ(:,:,2:8)<=(GDEJ(:,:,2:8))*1];
SDJ = permute(SDJ, [2, 3, 1]);
SDJ = permute(SDJ, [2, 1, 3]);
SDYJ = permute(SDYJ, [2, 3, 1]);
SDYJ = permute(SDYJ, [2, 1, 3]);
SDEJ = permute(SDEJ, [2, 3, 1]);
SDEJ = permute(SDEJ, [2, 1, 3]);
OBJ2 = sum(sum(sum( mDJ(:,:,2:8).* SDJ (:,:,2:8)))) + sum(sum(sum( mDYJ(:,:,2:8).* SDYJ(:,:,2:8) ))) + sum(sum(sum( mDEJ(:,:,2:8).* SDEJ(:,:,2:8) ))) - sum(sum(sum( cDJ(:,:,2:8)))) -sum(sum(sum( cDYJ(:,:,2:8)))) -sum(sum(sum( cDEJ(:,:,2:8)))) ;
ops = sdpsettings(...
'solver', 'gurobi', ...
'gurobi.timelimit', 60, ...
'gurobi.MIPFocus', 1, ...
'gurobi.Heuristics', 0.5, ...
'gurobi.NodeLimit', 1000, ...
'allowmilp', 1, ...
'debug', 1, ...
'verbose', 0 ...
);
obj=-OBJ2;
result=optimize(Constraintsshb,obj);
if result.problem==0
disp('!!!!!!!!!!!!Solver thinks it is feasible')
elseif result.problem == 1
disp('!!!!!!!!!!!!Solver thinks it is infeasible')
else
disp('!!!!!!!!!!!!Timeout, Display the current optimal solution')
end
value(obj)
a = value(a);
b = value(b);
c = value(c);
d = value(d);
bb = value(bb);
cc = value(cc);
dd = value(dd);
%% 数据写入
% 创建矩阵数据2024
a3 = a(:,:,2);
b1 = b(:,:,2);
bb1 = bb(:,:,2);
c1 = c(:,:,2);
cc1 = cc(:,:,2);
d1 = d(:,:,2);
dd1 = dd(:,:,2);
% Excel 文件和工作表名称
filenama = 'result2.xlsx';
sheetname = '2024';
% 写入 Excel 文件
% 1. 首先将 C2 到 AQ83 全部写为 0
xlswrite(filenama, zeros(82, 43), sheetname, 'C2:AQ83');
% 2. 将 a3 写在 C2 到 Q27
xlswrite(filenama, a3, sheetname, 'C2');
% 3. 将 b1 写在 R28 到 AJ35
xlswrite(filenama, b1, sheetname, 'R28');
% 4. 将 bb1 写在 AK56 到 AM63
xlswrite(filenama, bb1, sheetname, 'AK56');
% 5. 将 c1 写在 R36 到 AJ51
xlswrite(filenama, c1, sheetname, 'R36');
% 6. 将 cc1 写在 AN36 到 AQ51
xlswrite(filenama, cc1, sheetname, 'AN36');
% 7. 将 d1 写在 R52 到 AJ55
xlswrite(filenama, d1, sheetname, 'R52');
% 8. 将 dd1 写在 R80 到 AJ83
xlswrite(filenama, dd1, sheetname, 'R80');
% 创建矩阵数据2025
a3 = a(:,:,3);
b1 = b(:,:,3);
bb1 = bb(:,:,3);
c1 = c(:,:,3);
cc1 = cc(:,:,3);
d1 = d(:,:,3);
dd1 = dd(:,:,3);
% Excel 文件和工作表名称
filenama = 'result2.xlsx';
sheetname = '2025';
% 写入 Excel 文件
% 1. 首先将 C2 到 AQ83 全部写为 0
xlswrite(filenama, zeros(82, 43), sheetname, 'C2:AQ83');
% 2. 将 a3 写在 C2 到 Q27
xlswrite(filenama, a3, sheetname, 'C2');
% 3. 将 b1 写在 R28 到 AJ35
xlswrite(filenama, b1, sheetname, 'R28');
% 4. 将 bb1 写在 AK56 到 AM63
xlswrite(filenama, bb1, sheetname, 'AK56');
% 5. 将 c1 写在 R36 到 AJ51
xlswrite(filenama, c1, sheetname, 'R36');
% 6. 将 cc1 写在 AN36 到 AQ51
xlswrite(filenama, cc1, sheetname, 'AN36');
% 7. 将 d1 写在 R52 到 AJ55
xlswrite(filenama, d1, sheetname, 'R52');
% 8. 将 dd1 写在 R80 到 AJ83
xlswrite(filenama, dd1, sheetname, 'R80');
% 创建矩阵数据2026
a3 = a(:,:,4);
b1 = b(:,:,4);
bb1 = bb(:,:,4);
c1 = c(:,:,4);
cc1 = cc(:,:,4);
d1 = d(:,:,4);
dd1 = dd(:,:,4);
% Excel 文件和工作表名称
filenama = 'result2.xlsx';
sheetname = '2026';
% 写入 Excel 文件
% 1. 首先将 C2 到 AQ83 全部写为 0
xlswrite(filenama, zeros(82, 43), sheetname, 'C2:AQ83');
% 2. 将 a3 写在 C2 到 Q27
xlswrite(filenama, a3, sheetname, 'C2');
% 3. 将 b1 写在 R28 到 AJ35
xlswrite(filenama, b1, sheetname, 'R28');
% 4. 将 bb1 写在 AK56 到 AM63
xlswrite(filenama, bb1, sheetname, 'AK56');
% 5. 将 c1 写在 R36 到 AJ51
xlswrite(filenama, c1, sheetname, 'R36');
% 6. 将 cc1 写在 AN36 到 AQ51
xlswrite(filenama, cc1, sheetname, 'AN36');
% 7. 将 d1 写在 R52 到 AJ55
xlswrite(filenama, d1, sheetname, 'R52');
% 8. 将 dd1 写在 R80 到 AJ83
xlswrite(filenama, dd1, sheetname, 'R80');
% 创建矩阵数据2027
a3 = a(:,:,5);
b1 = b(:,:,5);
bb1 = bb(:,:,5);
c1 = c(:,:,5);
cc1 = cc(:,:,5);
d1 = d(:,:,5);
dd1 = dd(:,:,5);
% Excel 文件和工作表名称
filenama = 'result2.xlsx';
sheetname = '2027';
% 写入 Excel 文件
% 1. 首先将 C2 到 AQ83 全部写为 0
xlswrite(filenama, zeros(82, 43), sheetname, 'C2:AQ83');
% 2. 将 a3 写在 C2 到 Q27
xlswrite(filenama, a3, sheetname, 'C2');
% 3. 将 b1 写在 R28 到 AJ35
xlswrite(filenama, b1, sheetname, 'R28');
% 4. 将 bb1 写在 AK56 到 AM63
xlswrite(filenama, bb1, sheetname, 'AK56');
% 5. 将 c1 写在 R36 到 AJ51
xlswrite(filenama, c1, sheetname, 'R36');
% 6. 将 cc1 写在 AN36 到 AQ51
xlswrite(filenama, cc1, sheetname, 'AN36');
% 7. 将 d1 写在 R52 到 AJ55
xlswrite(filenama, d1, sheetname, 'R52');
% 8. 将 dd1 写在 R80 到 AJ83
xlswrite(filenama, dd1, sheetname, 'R80');
% 创建矩阵数据2028
a3 = a(:,:,6);
b1 = b(:,:,6);
bb1 = bb(:,:,6);
c1 = c(:,:,6);
cc1 = cc(:,:,6);
d1 = d(:,:,6);
dd1 = dd(:,:,6);
% Excel 文件和工作表名称
filenama = 'result2.xlsx';
sheetname = '2028';
% 写入 Excel 文件
% 1. 首先将 C2 到 AQ83 全部写为 0
xlswrite(filenama, zeros(82, 43), sheetname, 'C2:AQ83');
% 2. 将 a3 写在 C2 到 Q27
xlswrite(filenama, a3, sheetname, 'C2');
% 3. 将 b1 写在 R28 到 AJ35
xlswrite(filenama, b1, sheetname, 'R28');
% 4. 将 bb1 写在 AK56 到 AM63
xlswrite(filenama, bb1, sheetname, 'AK56');
% 5. 将 c1 写在 R36 到 AJ51
xlswrite(filenama, c1, sheetname, 'R36');
% 6. 将 cc1 写在 AN36 到 AQ51
xlswrite(filenama, cc1, sheetname, 'AN36');
% 7. 将 d1 写在 R52 到 AJ55
xlswrite(filenama, d1, sheetname, 'R52');
% 8. 将 dd1 写在 R80 到 AJ83
xlswrite(filenama, dd1, sheetname, 'R80');
% 创建矩阵数据2029
a3 = a(:,:,7);
b1 = b(:,:,7);
bb1 = bb(:,:,7);
c1 = c(:,:,7);
cc1 = cc(:,:,7);
d1 = d(:,:,7);
dd1 = dd(:,:,7);
% Excel 文件和工作表名称
filenama = 'result2.xlsx';
sheetname = '2029';
% 写入 Excel 文件
% 1. 首先将 C2 到 AQ83 全部写为 0
xlswrite(filenama, zeros(82, 43), sheetname, 'C2:AQ83');
% 2. 将 a3 写在 C2 到 Q27
xlswrite(filenama, a3, sheetname, 'C2');
% 3. 将 b1 写在 R28 到 AJ35
xlswrite(filenama, b1, sheetname, 'R28');
% 4. 将 bb1 写在 AK56 到 AM63
xlswrite(filenama, bb1, sheetname, 'AK56');
% 5. 将 c1 写在 R36 到 AJ51
xlswrite(filenama, c1, sheetname, 'R36');
% 6. 将 cc1 写在 AN36 到 AQ51
xlswrite(filenama, cc1, sheetname, 'AN36');
% 7. 将 d1 写在 R52 到 AJ55
xlswrite(filenama, d1, sheetname, 'R52');
% 8. 将 dd1 写在 R80 到 AJ83
xlswrite(filenama, dd1, sheetname, 'R80');
% 创建矩阵数据2030
a3 = a(:,:,8);
b1 = b(:,:,8);
bb1 = bb(:,:,8);
c1 = c(:,:,8);
cc1 = cc(:,:,8);
d1 = d(:,:,8);
dd1 = dd(:,:,8);
% Excel 文件和工作表名称
filenama = 'result2.xlsx';
sheetname = '2030';
% 写入 Excel 文件
% 1. 首先将 C2 到 AQ83 全部写为 0
xlswrite(filenama, zeros(82, 43), sheetname, 'C2:AQ83');
% 2. 将 a3 写在 C2 到 Q27
xlswrite(filenama, a3, sheetname, 'C2');
% 3. 将 b1 写在 R28 到 AJ35
xlswrite(filenama, b1, sheetname, 'R28');
% 4. 将 bb1 写在 AK56 到 AM63
xlswrite(filenama, bb1, sheetname, 'AK56');
% 5. 将 c1 写在 R36 到 AJ51
xlswrite(filenama, c1, sheetname, 'R36');
% 6. 将 cc1 写在 AN36 到 AQ51
xlswrite(filenama, cc1, sheetname, 'AN36');
% 7. 将 d1 写在 R52 到 AJ55
xlswrite(filenama, d1, sheetname, 'R52');
% 8. 将 dd1 写在 R80 到 AJ83
xlswrite(filenama, dd1, sheetname, 'R80');
%% 结果计算
% 收获(斤)
mDJ(1,1:15,:) = MP.*sum(a(1:6,:,:),1) + MTB.*sum(a(7:20,:,:),1) + repmat(MS, [1, 1, 1]).*sum(a(21:26,:,:),1);
mDJ(1,16,:) = repmat(MSb(1,1,:), [1, 1, 1]).*sum(b(:,1,:),1);
mDYJ = repmat(MSb(1,2:19,:), [1, 1, 1]).*sum(b(:,2:19,:),1) + repmat(MDc, [1, 1, 1]).*sum(c(:,:,:),1) + repmat(MZd, [1, 1, 1]).*sum(d(:,:,:),1);
mDEJ(1,1:3,:) = repmat(MSbbb, [1, 1, 1]).*sum(bb(:,:,:),1);
mDEJ(1,4:7,:) = repmat(MDcc, [1, 1, 1]).*sum(cc(:,:,:),1);
mDEJ(1,8:end,:) = repmat(MZdd, [1, 1, 1]).*sum(dd(:,:,:),1);
% 总成本
cDJ(1,1:15,:) = repmat(CP, [1, 1, 1]).*sum(a(1:6,:,:),1) + repmat(CT, [1, 1, 1]).*sum(a(7:20,:,:),1) + repmat(CS, [1, 1, 1]).*sum(a(21:26,:,:),1);
cDJ(1,16,:) = repmat(CSb(1,1,:), [1, 1, 1]).*sum(b(:,1,:),1);
cDYJ = repmat(CSb(1,2:19,:), [1, 1, 1]).*sum(b(:,2:19,:),1) + repmat(CDc, [1, 1, 1]).*sum(c(:,:,:),1) + repmat(CZd, [1, 1, 1]).*sum(d(:,:,:),1);
cDEJ(1,1:3,:) = repmat(CSbb, [1, 1, 1]).*sum(bb(:,:,:),1);
cDEJ(1,4:7,:) = repmat(CDcc, [1, 1, 1]).*sum(cc(:,:,:),1);
cDEJ(1,8:end,:) = repmat(CZdd, [1, 1, 1]).*sum(dd(:,:,:),1);
% 最终收益
% 初始化 beneits 为 0
beneits = 0;
mDJ1 = mDJ(:,:,2:8);
SDJ1 = repmat(SDJ, [1, 1, 7]);
GDJ1 = repmat(GDJ, [1, 1, 7]);
% 获取 mDJ1, GDJ1 和 SDJ1 的维度
[dim1, dim2, dim3] = size(mDJ1);
% 遍历所有元素并更新 beneits
for i = 1:dim1
for j = 1:dim2
for k = 1:dim3
if mDJ1(i,j,k) <= GDJ1(i,j,k)
% 如果 mDJ 小于或等于 GDJ
beneits = beneits + mDJ1(i,j,k) * SDJ1(i,j,k);
else
% 如果 mDJ 大于 GDJ
beneits = beneits + GDJ1(i,j,k) * SDJ1(i,j,k) ...
+ (mDJ1(i,j,k) - GDJ1(i,j,k)) * 0;
end
end
end
end
mDYJ1 = mDYJ(:,:,2:8);
SDYJ1 = repmat(SDYJ, [1, 1, 7]);
GDYJ1 = repmat(GDYJ, [1, 1, 7]);
% 获取 mDJ1, GDJ1 和 SDJ1 的维度
[dim1, dim2, dim3] = size(mDYJ1);
% 遍历所有元素并更新 beneits
for i = 1:dim1
for j = 1:dim2
for k = 1:dim3
if mDYJ1(i,j,k) <= GDYJ1(i,j,k)
% 如果 mDJ 小于或等于 GDJ
beneits = beneits + mDYJ1(i,j,k) * SDYJ1(i,j,k);
else
% 如果 mDJ 大于 GDJ
beneits = beneits + GDYJ1(i,j,k) * SDYJ1(i,j,k) ...
+ (mDYJ1(i,j,k) - GDYJ1(i,j,k)) * 0;
end
end
end
end
mDEJ1 = mDEJ(:,:,2:8);
SDEJ1 = repmat(SDEJ, [1, 1, 7]);
GDEJ1 = repmat(GDEJ, [1, 1, 7]);
% 获取 mDJ1, GDJ1 和 SDJ1 的维度
[dim1, dim2, dim3] = size(mDEJ1);
% 遍历所有元素并更新 beneits
for i = 1:dim1
for j = 1:dim2
for k = 1:dim3
if mDEJ1(i,j,k) <= GDEJ1(i,j,k)
% 如果 mDJ 小于或等于 GDJ
beneits = beneits + mDEJ1(i,j,k) * SDEJ1(i,j,k);
else
% 如果 mDJ 大于 GDJ
beneits = beneits + GDEJ1(i,j,k) * SDEJ1(i,j,k) ...
+ (mDEJ1(i,j,k) - GDEJ1(i,j,k)) * 0;
end
end
end
end
beneits