数学建模问题可分为三大类:预测类问题、连续性优化问题、离散型优化问题。
预测类、连续性优化问题要求有很强的数学基础,但是求解方法固定。
离散型优化问题难在求解,所以注重各种优化算法用matlab自主编程求解规划问题。
预测类问题
使用数学方法:拟合、回归、插值、神经网络、灰色预测、小波分析
CUMCM:2003A、2005A、2007A
连续型优化问题
使用数学方法:拟合、回归、插值、微分、求极值
CUMCM:2002A、2008A、2009A
离散型优化问题
使用数学方法:目标规划
CUMCM:2002B、2003B、2004A、2004B、2005B、2006A、2007B、2009B
文档:2002B.note
链接:http://note.youdao.com/noteshare?id=39677d3761846916df202611a3c6e104&sub=92EE275E5AC64029B7D7683EEA177130
% 功能说明:
% 根据参考答案中的模型,本程序分别对
% K1、K2、K3、K4型彩票进行求解,并对
% n、m的各种组合进行循环。求解时,首先
% 计算当前n、m的各奖项获奖概率,然后
% 随机生成多个初始值,调用fmincon函数
% 寻找目标函数的最小值(原目标函数要求
% 极大,但fmincon是寻找极小,故令原目标
% 函数乘以(-1),寻找新目标函数的极小值),
% 最后比较各种类型彩票的求解结果,输出
% 对应最大的原目标函数的解。
% 本程序包含的m文件为:
% main.m:主程序
% cpiao.m:目标函数
% calculate_probability.m:计算各奖项获奖概率
% nonlcon.m:非线性约束
% 使用说明:
% 执行main.m
%1.main.m
clc
clear
% 为避免陷入局部最优,需要以随机的初值进行多次尝试,
% 该变量为对每个m/n组合生成随机初值的数目,越大则找到
% 全局最优的概率越大,但程序运行的时间也越长,
% 请根据电脑情况自行设置
nums_test_of_initial_value = 20;
global v
v = 630589; % 求解v为630589的收入水平情况
DEBUG = 0;
rand('state',sum(100*clock)) % 初始化随机数生成器
format long g
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 求解开始
% 对于K1型
p_k1 = [2e-7;8e-7;1.8e-5;2.61e-4;3.42e-3;4.1995e-2];
% 6个奖项6个变量
Aeq=[1,1,1,0,0,0];
beq=1;
a_lb=[10,4,3,4,2];
b_ub=[233,54,17,20,10];
A= [0,0,0,-1,a_lb(4),0;
0,0,0,1,-b_ub(4),0;
0,0,0,0,-1,a_lb(5);
0,0,0,0,1,-b_ub(5)];
b= [0;0;0;0];
lb=[0.5;0;0;0;0;0];
ub=[0.8;1;1;inf;inf;inf];
p_test = p_k1;
rx0_tmp = zeros(6,1);
rx_meta_result = zeros(6,1);
fval_meta_result = inf;
flag_meta_result = nan; %用以判断有没有得到过可行解
if DEBUG == 1
output_meta_result = [];
end
for j = 1:nums_test_of_initial_value
%随机生成多个初始值rx0_tmp,以避免局部最优
rx0_tmp(1) = rand*(0.8-0.5) + 0.5;
rx0_tmp(2) = rand*(1-rx0_tmp(1));
rx0_tmp(3) = 1 - rx0_tmp(1) - rx0_tmp(2);
rx0_tmp(4) = rand*1000;
rx0_tmp(5) = rand*100;
rx0_tmp(6) = rand*50;
% 寻优
[rx_tmp,fval_tmp,flag_tmp,output_tmp]= ...
fmincon('cpiao',rx0_tmp,A,b,...
Aeq,beq,lb,ub,'nonlcon',[],1,p_test,a_lb,b_ub);
% 上式倒数第四个参数是为了区分彩票的类型(K1/K2/K3/K4)
% 最后三个是函数cpiao和nonlcon计算中可能要用到的量。
if (flag_tmp == 1) && (fval_meta_result > fval_tmp)
fval_meta_result = fval_tmp;
rx_meta_result = rx_tmp;
flag_meta_result = 1;
if DEBUG == 1
output_meta_result = output_tmp;
end
end
end
% 把求得的最好结果保存下来
if ~isnan(flag_meta_result)
rx_k1 = rx_meta_result;
fval_k1 = fval_meta_result;
flag_k1 = flag_meta_result;
if DEBUG == 1
output = output_meta_result;
end
else
if DEBUG == 1
rx_k1 = rx_tmp;
fval_k1 = fval_tmp;
flag_k1 = flag_tmp;
output = output_tmp;
end
end
% 对于K2、K3、K4型的情况
% n选m或(m+1),n的选择范围在29到60,m的选择范围为5到7
% 故有 (60-29+1)*(7-5+1)=96种 取法,
% 依题意,K2、K3、K4都有这96种取法,也即第三维上为3
% 故有下面的变量声明:
p_all=zeros(7,96,3);
rx_all = zeros(7,96,3);
fval_all= zeros(1,96,3);
flag_all = zeros(1,96,3);
for m=5:7
for n=29:60
for i=1:3
% 根据i的值判断属于(K2、K3、K4)中哪一型
% (i=1是K2;i=2是K3;i=3是K4),
% 并根据n、m生成各奖项概率
% p_temp=eval(sprintf('comb_k%d(m,n)',i+1));
p_temp = calculate_probability(m,n,i+1);
p_all(:,(m-5).*32+(n-28),i) = p_temp;
% K2、K3可合并处理(奖项数目一样)
if (i ~= 3)
Aeq=[1,1,1,0,0,0,0];
beq=1;
a_lb=[10,4,3,4,2,2];
b_ub=[233,54,17,20,10,10];
A=[ 0,0,0,-1,a_lb(4),0,0;
0,0,0,1,-b_ub(4),0,0;
0,0,0,0,-1,a_lb(5),0;
0,0,0,0,1,-b_ub(5),0];
%由于x(7)可能为零,故不在这里对x(6)/x(7)进行上下限限制,
% 而在非线性约束nonlcon中进行
% 0,0,0,0,0,-1,a_lb(6);
% 0,0,0,0,0,1,-b_ub(6)];
%b=[0;0;0;0;0;0];
b=[0;0;0;0];
lb=[0.5;0;0;0;0;0;0];
ub=[0.8;1;1;inf;inf;inf;inf];
p_test = p_temp;
%随机生成多个初始值rx0_tmp,以避免局部最优
rx0_tmp = zeros(7,1);
rx_meta_result = zeros(7,1);
fval_meta_result = inf;
flag_meta_result = nan; %用以判断有没有得到过可行解
for j = 1:nums_test_of_initial_value
rx0_tmp(1) = rand*(0.8-0.5) + 0.5;
rx0_tmp(2) = rand*(1-rx0_tmp(1));
rx0_tmp(3) = 1 - rx0_tmp(1) - rx0_tmp(2);
rx0_tmp(4) = rand*1000;
rx0_tmp(5) = rand*100;
rx0_tmp(6) = rand*50;
rx0_tmp(7) = rand*10;
[rx_tmp,fval_tmp,flag_tmp]= ...
fmincon('cpiao',rx0_tmp,...
A,b,Aeq,beq,lb,ub,...
'nonlcon',[],i+1,p_test,a_lb,b_ub);
% 上式倒数第四个参数是为了区分彩票的类型(K1/K2/K3/K4)
% 最后三个是函数cpiao和nonlcon计算中可能要用到的量。
if (flag_tmp == 1) && (fval_meta_result > fval_tmp)
fval_meta_result = fval_tmp;
rx_meta_result = rx_tmp;
flag_meta_result = 1;
end
end
% 把求得的最好结果保存下来
rx_all(:,(m-5).*32+(n-28),i) = rx_meta_result;
fval_all(1,(m-5).*32+(n-28),i) = fval_meta_result;
flag_all(1,(m-5).*32+(n-28),i) = flag_meta_result;
else
% i==3,相应于K4型
% 对于K4型,因只设到五等奖,故仅5个变量了
Aeq=[1,1,1,0,0];
beq=1;
a_lb=[10,4,3,4];
b_ub=[233,54,17,20];
A=[ 0,0,0,-1,a_lb(4);
0,0,0,1,-b_ub(4)];
b=[0;0];
lb=[0.5;0;0;0;0];
ub=[0.8;1;1;inf;inf];
p_test = p_temp;
%随机生成多个初始值rx0_tmp,以避免局部最优
rx0_tmp = zeros(5,1);
rx_meta_result = zeros(5,1);
fval_meta_result = inf;
flag_meta_result = nan; %用以判断有没有得到过可行解
for j = 1:nums_test_of_initial_value
rx0_tmp(1) = rand*(0.8-0.5) + 0.5;
rx0_tmp(2) = rand*(1-rx0_tmp(1));
rx0_tmp(3) = 1 - rx0_tmp(1) - rx0_tmp(2);
rx0_tmp(4) = rand*1000;
rx0_tmp(5) = rand*100;
[rx_tmp,fval_tmp,flag_tmp]= ...
fmincon('cpiao',rx0_tmp,A,b,...
Aeq,beq,lb,ub,'nonlcon',...
[],4,p_test,a_lb,b_ub);
% 上式倒数第四个参数是为了区分彩票的类型(K1/K2/K3/K4)
% 最后三个是函数cpiao和nonlcon计算中可能要用到的量。
if (flag_tmp == 1) && (fval_meta_result > fval_tmp)
fval_meta_result = fval_tmp;
rx_meta_result = rx_tmp;
flag_meta_result = 1;
end
end
% 把求得的最好结果保存下来
rx_all(:,(m-5).*32+(n-28),i) = [rx_meta_result;0;0];
fval_all(1,(m-5).*32+(n-28),i) = fval_meta_result;
flag_all(1,(m-5).*32+(n-28),i) = flag_meta_result;
end
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 寻优结束,进行结果处理
% 在所有(K1、K2、K3、K4)求解结果中找目标函数最小的
% 判断(K1、K2、K3、K4)中哪一种的目标函数最小
ind_tmp = (flag_all >= 0);
if sum(sum(sum(ind_tmp))) ~= 0
% K2、K3、K4的求解中找到了可行解(或最优解)
val_tmp = fval_all.*ind_tmp;
[val_tmp2,ind_tmp2] = min(val_tmp);
[val_min,ind_tmp3] = min(val_tmp2);
if (flag_k1 < 0)
% K1的求解中没找到可行解
signal = 1; % 标志变量
else
if val_min < fval_k1
signal = 1;
elseif val_min > fval_k1
signal = 2;
else
signal = 3;
end
end
;
else
% K2、K3、K4的求解中没有找到了可行解
if (flag_k1 < 0)
% K1的求解中没找到可行解
disp('(K1、K2、K3、K4)所有的求解中')
disp('一个可行解都没有找到')
disp('(还并不意味着完全没有可行解,')
disp('也许是初值点选的不好因此没有找到)')
break;
else
signal = 2;
end
end
if (signal == 1)
ind_tmp4 = ind_tmp2(ind_tmp3);
rx_result = rx_all(:,ind_tmp4,ind_tmp3);
fval_result = fval_all(:,ind_tmp4,ind_tmp3);
fval_result =-fval_result;
n = (ind_tmp4 - floor(ind_tmp4 / 32) * 32) + 28;
m = floor(ind_tmp4 / 32) + 5;
p_tmp = p_all(:,ind_tmp4,ind_tmp3);
elseif signal == 2
rx_result = rx_k1;
fval_result =-fval_k1;
p_tmp = p_k1;
else %signal == 3
ind_tmp4 = ind_tmp2(ind_tmp3);
rx_result = rx_all(:,ind_tmp4,ind_tmp3);
fval_result = fval_all(:,ind_tmp4,ind_tmp3);
fval_result =-fval_result;
n = (ind_tmp4 - floor(ind_tmp4 / 32) * 32) + 28;
m = floor(ind_tmp4 / 32) + 5;
end
% 输出计算结果
if signal == 1 % 最优解在K2、K3、K4中时
if ind_tmp3 == 1
disp(sprintf('最优解为:K2型,%d选%d',n,m));
elseif ind_tmp3 == 2
disp(sprintf('最优解为:K3型,%d选%d+1',n,m));
elseif ind_tmp3 == 3
disp(sprintf('最优解为:K4型,%d选%d无特别号',n,m));
end
elseif signal == 2 % 最优解在K1中时
disp(sprintf('最优解为:K1型,10选6+1'));
else % K1的解和K2、K3、K4的解重合时
if ind_tmp3 == 1
disp(sprintf('10选6+1和K2型%d选%d同为最优解',n,m));
elseif ind_tmp3 == 2
disp(sprintf('10选6+1和K3型%d选%d+1同为最优解',n,m));
elseif ind_tmp3 == 3
disp(sprintf('10选6+1和K4型%d选%d无特别号同为最优解',n,m));
end
end
disp('对应的目标函数值为:')
disp(fval_result)
if signal ~= 3
disp('最终求解变量值为:')
disp(rx_result)
disp('各奖项的金额是:')
x=zeros(3,1);
x(1) = (1-p_tmp(4).*rx_result(4)-...
p_tmp(5).*rx_result(5)-...
p_tmp(6).*rx_result(6)-...
p_tmp(7).*rx_result(7)).*rx_result(1)./p_tmp(1);
x(2) = (1-p_tmp(4).*rx_result(4)-...
p_tmp(5).*rx_result(5)-...
p_tmp(6).*rx_result(6)-...
p_tmp(7).*rx_result(7)).*rx_result(2)./p_tmp(2);
x(3) = (1-p_tmp(4).*rx_result(4)-...
p_tmp(5).*rx_result(5)-...
p_tmp(6).*rx_result(6)-...
p_tmp(7).*rx_result(7)).*rx_result(3)./p_tmp(3);
rx_money=[x;rx_result(4:7)];
disp(rx_money)
else
disp('最终求解变量值为:')
disp('10选6+1时')
disp(rx_k1)
disp('K%d型时',ind_tmp3+1)
disp(rx_result)
end
%2.calculate_probability.m
function p_temp_sub = calculate_probability(m,n,type);
%n选m时各奖项的获奖概率
% type代表当前求解的彩票类型
% K1型是固定概率,无需在这里计算
if (type == 2)
% K2型的
p_temp_sub=zeros(7,1);
p_temp_sub(1)=1/mmmcomb(n,m);
p_temp_sub(2)=mmmcomb(m,m-1)./mmmcomb(n,m);
p_temp_sub(3)=mmmcomb(m,m-1).*mmmcomb(n-m-1,1)./mmmcomb(n,m);
p_temp_sub(4)=mmmcomb(m,m-2).*mmmcomb(n-m-1,1)./mmmcomb(n,m);
p_temp_sub(5)=mmmcomb(m,m-2).*mmmcomb(n-m-1,2)./mmmcomb(n,m);
p_temp_sub(6)=mmmcomb(m,m-3).*mmmcomb(n-m-1,2)./mmmcomb(n,m);
p_temp_sub(7)=mmmcomb(m,m-3).*mmmcomb(n-m-1,3)./mmmcomb(n,m);
elseif (type == 3)
% K3型的
p_temp_sub=zeros(7,1);
p_temp_sub(1)=1./mmmcomb(n,m+1);
p_temp_sub(2)=mmmcomb(n-m-1,1)./mmmcomb(n,m+1);
p_temp_sub(3)=mmmcomb(m,m-1).*mmmcomb(n-m-1,1)./mmmcomb(n,m+1);
p_temp_sub(4)=mmmcomb(m,m-1).*mmmcomb(n-m-1,2)./mmmcomb(n,m+1);
p_temp_sub(5)=mmmcomb(m,m-2).*mmmcomb(n-m-1,2)./mmmcomb(n,m+1);
p_temp_sub(6)=mmmcomb(m,m-2).*mmmcomb(n-m-1,3)./mmmcomb(n,m+1);
p_temp_sub(7)=mmmcomb(m,m-3).*mmmcomb(n-m-1,3)./mmmcomb(n,m+1);
elseif (type == 4)
% K4型的
p_temp_sub=zeros(7,1);
p_temp_sub(1)=1./mmmcomb(n,m);
p_temp_sub(2)=mmmcomb(m,m-1).*mmmcomb(n-m,1)./mmmcomb(n,m);
p_temp_sub(3)=mmmcomb(m,m-2).*mmmcomb(n-m,2)./mmmcomb(n,m);
p_temp_sub(4)=mmmcomb(m,m-3).*mmmcomb(n-m,3)./mmmcomb(n,m);
p_temp_sub(5)=mmmcomb(m,m-4).*mmmcomb(n-m,4)./mmmcomb(n,m);
p_temp_sub(6)=0;
p_temp_sub(7)=0;
else
error('Error in calculate_probability!');
end
function combi = mmmcomb(n,m)
%求从n个数中取出m个数的组合数
if (isscalar(n)) && (isscalar(m)) &&...
(isreal(n)) && (isreal(m)) && (n>=m) && (m>0)
combi=factorial(n)./factorial(m)./factorial(n-m);
else
error('A mistake occurs when calculating combinations.')
end
%3.cpiao.m
function f=cpiao(rx,type,p_test,a_lb,b_ub)
% type代表当前求解的彩票类型
% p_test是当前各奖项概率(当前彩票类型,当前m、n)
% a_lb,b_ub在本函数中用不到
% 注意:这里的目标函数是原目标函数乘以 -1;
global v
if (type == 1)
% 这是K1型的
rx_last3=rx(4:6);
p_last3=p_test(4:6);
p_last3=p_last3';
sum_last3=p_last3*rx_last3;
f= ...
-( p_test(1).*(1-exp(-(((1-sum_last3).*rx(1))./p_test(1)./v).^2))+...
p_test(2).*(1-exp(-(((1-sum_last3).*rx(2))./p_test(2)./v).^2))+...
p_test(3).*(1-exp(-(((1-sum_last3).*rx(3))./p_test(3)./v).^2))+...
p_test(4).*(1-exp(-(rx(4)./v).^2))+...
p_test(5).*(1-exp(-(rx(5)./v).^2))+...
p_test(6).*(1-exp(-(rx(6)./v).^2)) ...
);
elseif (type == 2) || (type == 3)
% 这是K2和K3的(K2、K3可合并处理,因奖项数目一样)
rx_last4=rx(4:7);
p_last4=p_test(4:7);
p_last4=p_last4';
sum_last4=p_last4*rx_last4;
f= ...
-( p_test(1).*(1-exp(-(((1-sum_last4).*rx(1))./p_test(1)./v).^2))+...
p_test(2).*(1-exp(-(((1-sum_last4).*rx(2))./p_test(2)./v).^2))+...
p_test(3).*(1-exp(-(((1-sum_last4).*rx(3))./p_test(3)./v).^2))+...
p_test(4).*(1-exp(-(rx(4)./v).^2))+...
p_test(5).*(1-exp(-(rx(5)./v).^2))+...
p_test(6).*(1-exp(-(rx(6)./v).^2))+...
p_test(7).*(1-exp(-(rx(7)./v).^2)) ...
);
elseif (type == 4)
% K4型
rx_last2=rx(4:5);
p_last2=p_test(4:5);
p_last2=p_last2';
sum_last2=p_last2 * rx_last2;
f= ...
-( p_test(1).*(1-exp(-(((1-sum_last2).*rx(1))./p_test(1)./v).^2))+...
p_test(2).*(1-exp(-(((1-sum_last2).*rx(2))./p_test(2)./v).^2))+...
p_test(3).*(1-exp(-(((1-sum_last2).*rx(3))./p_test(3)./v).^2))+...
p_test(4).*(1-exp(-(rx(4)./v).^2))+...
p_test(5).*(1-exp(-(rx(5)./v).^2)) ...
);
else
error('Error in function cpiao!')
end
%4.nonlcon.m
function [c,ceq]=nonlcon(rx,type,p_test,a_lb,b_ub)
% type代表当前求解的彩票类型
% p_test是当前各奖项概率(当前彩票类型,当前m、n)
% a_lb,b_ub是相邻两个奖项奖金之比的下限和上限
if (type == 1)
% 这是K1型的
c(1)= 6e5- ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(1)./p_test(1);
c(2)=-5e6+ ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(1)./p_test(1);
c(3)= a_lb(1).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(2)./p_test(2)-...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(1)./p_test(1);
c(4)= a_lb(2).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(3)./p_test(3)-...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(2)./p_test(2);
c(5)= a_lb(3).* rx(4)-...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(3)./p_test(3);
c(6)=-b_ub(1).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(2)./p_test(2)+...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(1)./p_test(1);
c(7)=-b_ub(2).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(3)./p_test(3)+...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(2)./p_test(2);
c(8)=-b_ub(3).* rx(4)+...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)).*rx(3)./p_test(3);
ceq=[];
elseif (type == 2) || (type == 3)
% 这是K2和K3的(K2、K3可合并处理,因奖项数目一样)
c(1)= 6e5- ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(1)./p_test(1);
c(2)=-5e6+ ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(1)./p_test(1);
c(3)= a_lb(1).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(2)./p_test(2)-...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(1)./p_test(1);
c(4)= a_lb(2).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(3)./p_test(3)-...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(2)./p_test(2);
c(5)= a_lb(3).* rx(4)-...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(3)./p_test(3);
c(6)=-b_ub(1).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(2)./p_test(2)+...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(1)./p_test(1);
c(7)=-b_ub(2).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(3)./p_test(3)+...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(2)./p_test(2);
c(8)=-b_ub(3).* rx(4)+...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)-...
p_test(6).*rx(6)-p_test(7).*rx(7)).*rx(3)./p_test(3);
if (rx(7) == 0)
c(9) = -1;
c(10)= -1;
else
c(9) = a_lb(6) .* rx(7) - rx(6);
c(10)=-b_ub(6) .* rx(7) + rx(6);
end
ceq=[];
elseif (type == 4)
% K4型
c(1)= 6e5- ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(1)./p_test(1);
c(2)=-5e6+ ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(1)./p_test(1);
c(3)= a_lb(1).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(2)./p_test(2)-...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(1)./p_test(1);
c(4)= a_lb(2).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(3)./p_test(3)-...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(2)./p_test(2);
c(5)= a_lb(3) .*rx(4)-...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(3)./p_test(3);
c(6)=-b_ub(1).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(2)./p_test(2)+...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(1)./p_test(1);
c(7)=-b_ub(2).* ...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(3)./p_test(3)+...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(2)./p_test(2);
c(8)=-b_ub(3) .* rx(4)+...
(1-p_test(4).*rx(4)-p_test(5).*rx(5)).*rx(3)./p_test(3);
ceq=[];
else
error('Error in function nonlcon!')
end
规划类问题;模型容易建立;求解困难;求解策略:分布求解、逐级优化。
文档:2003B.note
链接:http://note.youdao.com/noteshare?id=23e7fbdb69be60ab5cbea2e70680e596&sub=D3E871044979486BBE00FA49F2BF5E71
c=[5.26 5.19 4.21 4 2.95 2.74 2.46 1.9 0.64 1.27 1.9 0.99 1.9 1.13 1.27 2.25 1.48 2.04 3.09 3.51 4.42 3.86 3.72 3.16 2.25 2.81 0.78 1.62 1.27 0.5 5.89 5.61 5.61 4.56 3.51 3.65 2.46 2.46 1.06 0.57 0.64 1.76 1.27 1.83 2.74 2.6 4.21 3.72 5.05 6.1];
A=[0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 -0.0154 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0.005 -0.025 -0.015 0.015 0.005 0.025 0.015 0.005 0.025 0.005 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0.0104 0.0096 -0.0004 -0.0304 -0.0204 -0.0404 -0.0304 -0.0204 -0.0404 -0.0204 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 -0.005 -0.025 -0.015 0.015 0.005 0.025 0.015 0.005 0.025 0.005 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 -0.015 0.005 -0.005 -0.035 -0.025 -0.045 -0.035 -0.025 -0.045 -0.025 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.005 -0.025 -0.015 0.015 0.005 0.025 0.015 0.005 0.025 0.005 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.015 0.005 -0.005 -0.035 -0.025 -0.045 -0.035 -0.025 -0.045 -0.025 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
];
b=[1.2154 -1.2 1.3154 -1.3 1.3154 -1.3 0 0 0 0 0 0 61.68831169 68.18181818 64.93506494 68.18181818 71.42857143 81.16883117 68.18181818 84.41558442 87.66233766 81.16883117 81.16883117 71.42857143 87.66233766 68.18181818 74.67532468 87.66233766 68.18181818 74.67532468 87.66233766 81.16883117 160 160 160 160 160 96 96 96 96 96 96 96 96 96 96]';
Aeq=[];
beq=[];
lb=zeros(1,50);
for i=1 :50
ub(i)=inf;
end
[x,z]=linprog(c,A,b,Aeq,beq,lb,ub)
应用了规划问题的求解方法、模拟退火算法和遗传算法。
文档:2004A.note
链接:http://note.youdao.com/noteshare?id=015712e03d5867ddd36b67fecf128e8f&sub=3191E37676B7428E891BB3FBB02E9057
%大商圈的布局问题——模拟退火算法
%MYFSAPLP SOLVE THE PLP IN THE THIRD PROBLEM BY SA ALGORITHM.
%首先只考虑n为偶数的情况
%变量初始化
clc
clf
clear;
xmin = 0; xmax = 200; ymin = 0; ymax = 150;
r = 25; n =6;
fval_every=1; fval_best=fval_every; fval_pro=fval_every;
lamdao=1e30; fs_every=1;
t0=98; tf=3; a=0.98; t=t0; t_mid=50;
p=1;
dfo=0;
while(t>tf)
if p==1
%产生新解
for i=1:n./2
x(i.*2-1)=r+2*r*(i-1);
x(i*2)=r+2*r*(i-1);
y(2*i-1)=r;
y(2*i)=3*r;
end
for i=1:(n-1)
for j=(i+1):n
fs_every=fs_every.*sqrt((x(i)-x(j)).^2+(y(i)-y(j)).^2);
end
end
fs_every=fs_every.^(1./n);
fval_every=fs_every;
dfval=fval_pro-fval_every;
if dfval<0
if p~=1
x(i)=x0;
y(i)=y0;
fval_pro=fval_every;
fs_pro=fs_every;
dfo_pro=dfo;
else
fval_pro=fval_every;
fs_pro=fs_every;
dfo_pro=dfo;
end
else
rand_jud=rand;
if rand_jud>exp(-dfval./t)
x(i)=x0;
y(i)=y0;
fval_pro=fval_every;
fs_pro=fs_every;
dfo_pro=dfo;
else
fs_every=fs_pro;
fval_every=fval_pro;
dfo=dfo_pro;
end
end
if fval_every>fval_best
x_best=x;
y_best=y;
fval_best=fval_every;
fs_best=fs_every;
dfo_bestk=dfo;
end
p=p-1;
else
% keyboard
for k=1:500.*n
i=ceil(rand.*n);
x0=(xmin+r)+rand*((xmax-r)-(xmin+r));
y0=(ymin+r)+rand*((ymax-r)-(ymin+r));
for j=1:n
if j~=i
dis0=sqrt((x(j)-x(i)).^2+(y(j)-y(i)).^2);
dis1=sqrt((x(j)-x0).^2+(y(j)-y0).^2);
if dis0 < 2*r
dfo=dfo-1;
else
dfo=dfo+1;
end
if dis1 < 2*r
dfo=dfo+1;
else
dfo=dfo-1;
end
fs_every=fs_every./dis0.^(1./n);
fs_every=fs_every.*dis1.^(1./n);
end
end
dfo_tmp=dfo./2;
fval_every=fs_every-dfo_tmp.*lamdao./t;
dfval=fval_pro-fval_every;
if dfval<0
if p~=1
x(i)=x0;
y(i)=y0;
fval_pro=fval_every;
fs_pro=fs_every;
dfo_pro=dfo;
else
fval_pro=fval_every;
fs_pro=fs_every;
dfo_pro=dfo;
end
else
rand_jud=rand;
if rand_jud>exp(-dfval./t)
x(i)=x0;
y(i)=y0;
fval_pro=fval_every;
fs_pro=fs_every;
dfo_pro=dfo;
else
fs_every=fs_pro;
fval_every=fval_pro;
dfo=dfo_pro;
end
end
if fval_every>fval_best
x_best=x;
y_best=y;
fval_best=fval_every;
fs_best=fs_every;
dfo_bestk=dfo;
end
end
end
t=t.*a;
end
%求解结束
x_center = x_best;
y_center = y_best;
disp('圆心坐标分别为:')
circle_center = [x_center; y_center]';
disp(circle_center)
%绘图
hold on
for i = 1 : length(x_center)
x_plot_tmp = linspace(x_center(i)-r,x_center(i)+r);
y_plot_tmp_up = ...
sqrt(r.^2 - (x_plot_tmp - x_center(i)).^2) ...
+ y_center(i);
y_plot_tmp_down = ...
- sqrt(r.^2 - (x_plot_tmp - x_center(i)).^2) ...
+ y_center(i);
plot(x_plot_tmp,y_plot_tmp_up);
plot(x_plot_tmp,y_plot_tmp_down);
end
%商圈的布局问题——遗传算法
% GA main
% using toolbox of GAOT version 5
clc
clear
bounds=ones(12,2);
global r
xmin=0; ymin=0; xmax=200; ymax=150;
r=25; n=6;
bounds(:,1)=zeros(12,1) + r;
bounds(1:6,2)=ones(6,1).*xmax - r;
bounds(7:12,2)=ones(6,1).*ymax - r;
% [x,endPop] = ga(bounds,'myfGAPLP',[],[],[1e-6 1 1]);
% [x,endPop] = ga('myfGAPLP',bounds,[],[],[1e-6 1 1]);
[x,endPop]= ga(@fGAPLP,12,[],[],[],[],bounds(:,1),bounds(:,2))
%subplot(1,2,1)
myfplotcircleGA(x,r,xmax,ymax);
xlabel('横坐标/m')
ylabel('纵坐标/m')
title('遗传算法的结果')
%fGAPLP.m
function fval=fGAPLP(x)
% options is required by the format of GAOT ver 5.
fval=1; dfo=0;
r=25;
n=6;lamdao=1e30;
for i=1:(n-1)
for j=(i+1):n
rtmp=sqrt((x(i)-x(j)).^2+(x(n+i)-x(n+j)).^2);
if rtmp > 2*r
fval=fval*rtmp;
dfo=dfo+1;
end
end
end
fval=fval-dfo*lamdao;
%myfplotcircleGA.m
%% 以下为辅助函数的程序,放于独立的的m文件中
function y=myfplotcircleGA(xx,rtmp,xmax,ymax)
% plot circle
xtmp=xx(1:6);
ytmp=xx(7:12);
numlen=length(xtmp);
numsize=200;
t=linspace(0,2.*pi,numsize);
xplot=zeros(numsize,1);
yplot=zeros(numsize,1);
hold on
for j=1:numlen
for i=1:numsize
xplot(i)=xtmp(j)+rtmp*cos(t(i));
yplot(i)=ytmp(j)+rtmp*sin(t(i));
end
plot(xplot,yplot)
end
y=[];
xlim([0 xmax]);
ylim([0 ymax]);
处理大量数据、经典的最短路算法。
文档:2011B.note
链接:http://note.youdao.com/noteshare?id=722db129b099970671802c56bb1f44a6&sub=25357F9D3AAD45A7ADCEF83F19EC7311
%求解直观上用0-1整数规划
%针对该问题对Floyd算法进行处理,即为各路口找出距其最近的静态
%链接:%https://pan.baidu.com/s/1lGmW12NXwzoEYCrSDQ12eQ
%提取码:h3e2
%main.m
%% 最短路径的求解,以及现有的交巡警服务平台设置方案的合理性的判断
clc; clear all;
%% 数据准备
% 全市交通网络中路口节点节点坐标
A=xlsread('2011B_Table.xls', '全市交通路口节点数据','A2:C583');
% 全市交通路线
B=xlsread('2011B_Table.xls', '全市交通路口的路线','A2:B929');
% A区巡警台设置位置
PS_A=xlsread('2011B_Table.xls', '全市交巡警平台','B2:B21');
%% 计算最短距离矩阵
arn=size(A,1);
brn=size(B,1);
% 构建距离矩阵
D=ones(arn);
D(:)=inf;
for i=1:arn
D(i,i)=0;
end
for i=1:brn
m=B(i,1); % 起点标号
n=B(i,2); % 终点标号
d=sqrt((A(m,2)-A(n,2))^2+(A(m,3)-A(n,3))^2);
D(m,n)=d;
D(n,m)=d;
end
[dmin,path]=floyd(D);
%% 划分A区交巡警服务平台管辖范围
PN_A=A(1:92,1);
psn=size(PS_A, 1);
for i=1:92
SR(i,1)=i;
SR(i,2)=0;
SR(i,3)=inf;
SR(i,4)=0;
for j=1:psn
if SR(i,3)>dmin(i,j)
SR(i,3)=dmin(i,j);
SR(i,2)=j;
end
end
if SR(i,3)*100>3000
SR(i,4)=1;
end
end
%% 输出结果
disp('A区交巡警服务平台管辖范围划分方案为:')
SR
% floyd.m
function [d,path]=floyd(a)
% floyd - 最短路问题
% a - 距离矩阵是指i到j之间的距离可以是有向的
% d - 最短路的距离
% path - 最短路的路径
[n,lie]=size(a); % n为a的行数
d=a;
path=zeros(n,n);
% for i=1:n
% for j=1:n
% if d(i,j)~=inf
% path(i,j)=j; %j是i的后续点
% end
% end
% end
for k=1:n
for i=1:n
for j=1:n
if d(i,j)>d(i,k)+d(k,j)
d(i,j)=d(i,k)+d(k,j);
path(i,j)=path(i,k);
end
end
end
end
%% 最短路径的求解,以及现有的交巡警服务平台设置方案的合理性的判断
clc; clear all; close all
%% 数据准备
% 全市交通网络中路口节点节点坐标
A=xlsread('2011B_Table.xls', '全市交通路口节点数据','A2:C583');
% 全市交通路线
B=xlsread('2011B_Table.xls', '全市交通路口的路线','A2:B929');
% A区巡警台设置位置
%PS_A=xlsread('2011B_Table.xls', '全市交巡警平台','B2:B21');
%% 计算最短距离矩阵
arn=size(A,1);
brn=size(B,1);
% 构建距离矩阵
D=ones(arn);
D(:)=inf;
for i=1:arn
D(i,i)=0;
end
for i=1:brn
m=B(i,1); % 起点标号
n=B(i,2); % 终点标号
d=sqrt((A(m,2)-A(n,2))^2+(A(m,3)-A(n,3))^2);
D(m,n)=d;
D(n,m)=d;
end
[dmin,path]=floyd(D);
%% 确定最佳新增警台数
alt_sta=21:92;
ppsl=1:20;
min_n=ones(1,5)*6;
% %% 启用双核加速计算(多核计算机才可以采用)
% if parpool('local', 6) == 0
% parpoolopen 6
% end
if isempty(gcp('nocreate'))
parpool;
end
%% 计算各新增警台数与对应的不满足3分钟出警的路口数
for apsn=2:5
com_pat=nchoosek(alt_sta,apsn);
com_num=size(com_pat, 1);
tmin_un_num=6;
for k1=1:com_num
npsl=[ppsl, com_pat(k1,:)]; % 更新警台设置方案
%% 计算还有多少路口不满足3分钟出警
SR=zeros(92,4);
for i=1:92
i;
SR(i,1)=i;
SR(i,2)=0;
SR(i,3)=inf;
SR(i,4)=0;
for j=1:(20+apsn)
if SR(i,3)>dmin(i,npsl(j))
SR(i,3)=dmin(i,npsl(j));
SR(i,2)=npsl(j);
end
end
if SR(i,3)*100>3000
SR(i,4)=1;
end
end
tun_num=sum(SR(:,4));
if tun_num 0%2个核心
% parpool close
% end
% delete(gcp('nocreate'))
%% 显示结果
apn=[0, 2, 3, 4, 5]';
f_result=[apn, min_n']
figure(1)
bar(apn,min_n)
xlabel('新增交警平台的数量');
ylabel('不满足3分钟出警的路口数');
title('不满足三分钟出警的路口数与新增服务台数的关系图','fontsize',12);
for i=1:4
FT(1,i)=i+2*min_n(1,i+1);
end
opn=find(FT==min(FT));
disp(['最佳新增交警平台书:' num2str(opn+1)]);
T=2:5;
figure(2)
plot(T, FT,'-ko', 'LineWidth', 2);
xlabel('新增交警平台的数量');
ylabel('目标函数');
title('目标函数与新增交警平台的数关系图','fontsize',12);
% floyd算法的函数文件
function [d,path]=floyd(a)
% floyd - 最短路问题
% a - 距离矩阵是指i到j之间的距离可以是有向的
% d - 最短路的距离
% path - 最短路的路径
[n,lie]=size(a); % n为a的行数
d=a;
path=zeros(n,n);
for i=1:n
for j=1:n
if d(i,j)~=inf
path(i,j)=j; %j是i的后续点
end
end
end
for k=1:n
for i=1:n
for j=1:n
if d(i,j)>d(i,k)+d(k,j)
d(i,j)=d(i,k)+d(k,j);
path(i,j)=path(i,k);
end
end
end
end
%main.m
%% 最短路径的求解,以及现有的交巡警服务平台设置方案的合理性的判断
clc; clear all; close all
%% 数据准备
% 全市交通网络中路口节点节点坐标
A=xlsread('2011B_Table.xls', '全市交通路口节点数据','A2:C583');
% 全市交通路线
B=xlsread('2011B_Table.xls', '全市交通路口的路线','A2:B929');
% 每个路口发案率(次数)
owl=xlsread('2011B_Table.xls', '全市交通路口节点数据','E2:E93');
%% 计算最短距离矩阵
arn=size(A,1)
brn=size(B,1);
% 构建距离矩阵
D=ones(arn);
D(:)=inf;
for i=1:arn
D(i,i)=0;
end
for i=1:brn
m=B(i,1); % 起点标号
n=B(i,2); % 终点标号
d=sqrt((A(m,2)-A(n,2))^2+(A(m,3)-A(n,3))^2);
D(m,n)=d;
D(n,m)=d;
end
[dmin,path]=floyd(D);
%% 确定最佳新增警台数
alt_sta=21:92;
ppsl=1:20;
min_n=ones(1,5)*6;
% %% 启用双核加速计算(多核计算机才可以采用)
% if matlabpool('size') == 0
% matlabpool open 2
% end
if isempty(gcp('nocreate'))
parpool;
end
%% 计算各新增警台数与对应的不满足3分钟出警的路口数
apsn=4;
com_pat=nchoosek(alt_sta,apsn);
com_num=size(com_pat, 1);
avn=0;
bfair_f=inf;
for k1=1:com_num
npsl=[ppsl, com_pat(k1,:)]; % 更新警台设置方案
% 计算还有多少路口不满足3分钟出警
SR=zeros(92,4);
for i=1:92
i;
SR(i,1)=i;
SR(i,2)=0;
SR(i,3)=inf;
SR(i,4)=0;
for j=1:(20+apsn)
if SR(i,3)>dmin(i,npsl(j))
SR(i,3)=dmin(i,npsl(j));
SR(i,2)=npsl(j);
end
end
if SR(i,3)*100>3000
SR(i,4)=1;
end
end
tun_num=sum(SR(:,4));
if tun_num==0
avn=avn+1;
workload=zeros(1, 24);
for j=1:24
for u=1:92
if SR(u,2)==npsl(1,j)
workload(1,j)=workload(1,j)+owl(u,1);
end
end
end
fair_f=var(workload,1);
fair_r(avn,:)=[avn, fair_f, com_pat(k1,:)];
if fair_f 0
% matlabpool close
% end
%% 显示结果
abpn=0;
for i=1:avn
if fair_r(i,2)==bfair_f
abpn=abpn+1;
abps(abpn,:)=[abpn, fair_r(i,2:end)];
end
end
disp(['所有可行方案数' num2str(avn)]);
disp(['最佳方案数' num2str(abpn)]);
disp('所有最佳方案:')
abps
disp('最佳方案对应的工作均衡度:')
bfair_f
plot(fair_r(:,1),fair_r(:,2),'-ko', 'LineWidth', 2);
set(gca,'linewidth',2) ;
xlabel('可行方案编号'); ylabel('工作均衡度');
title('各可行方案的工作均衡度','fontsize',12);
%floyd.m
% floyd算法的函数文件
function [d,path]=floyd(a)
% floyd - 最短路问题
% a - 距离矩阵是指i到j之间的距离可以是有向的
% d - 最短路的距离
% path - 最短路的路径
[n,lie]=size(a); % n为a的行数
d=a;
path=zeros(n,n);
for i=1:n
for j=1:n
if d(i,j)~=inf
path(i,j)=j; %j是i的后续点
end
end
end
for k=1:n
for i=1:n
for j=1:n
if d(i,j)>d(i,k)+d(k,j)
d(i,j)=d(i,k)+d(k,j);
path(i,j)=path(i,k);
end
end
end
end
文档:2012A.note
链接:http://note.youdao.com/noteshare?id=7410452f1b1b54a5812c1bf54b49ffb1&sub=256456C2802D41E2AC2E9B2C71A9E543
%题1,2链接:https://pan.baidu.com/s/1JEJOHzXwM3Uw3N0uWnm9iw
%提取码:j4na
%题4链接:https://pan.baidu.com/s/1c5cKZh_WplpZpKKwSJXejA
%提取码:yixo
%酒样得分T检查
%% 2012A_question1_T evaluation
% 程序15-1
%--------------------------------------------------------------------------
%% 数据准备
% 清空环境变量
clear all
clc
%导入数据
X1=xlsread('2012A_T1_processed.xls', 'T1_red_grape', 'D3:M272');
X2=xlsread('2012A_T1_processed.xls', 'T2_red_grape', 'D3:M272');
X3=xlsread('2012A_T1_processed.xls', 'T1_white_grape', 'D3:M282');
X4=xlsread('2012A_T1_processed.xls', 'T2_white_grape', 'D3:M282');
%% 红葡萄酒T检验计算过程
[m1,n1]=size(X1);
K1=27;
% 计算每个样品的总得分
for i=1:K1
for j=1:n1
SX1(i,j)=sum(X1(10*i-9:10*i,j));
SX2(i,j)=sum(X2(10*i-9:10*i,j));
end
end
% 计算每组样品得分的均值
for i=1:K1
Mean1(i)=mean(SX1(i,:));
Mean2(i)=mean(SX2(i,:));
end
% 计算检验值
for i=1:K1
S1(1,i)=(sum((SX1(i,:)-Mean1(i)).^2)+sum((SX2(i,:)-Mean2(i)).^2))/(n1*(n1-1));
T1(1,i)=(Mean1(i)-Mean2(i))/(sqrt(S1(1,i)));
end
AT_R=abs(T1);
M_AT_R=mean(AT_R);
%% 白葡萄酒T检验计算过程
[m2,n2]=size(X3);
K2=28;
% 计算每个样品的总得分
for i=1:K2
for j=1:n2
SX3(i,j)=sum(X3(10*i-9:10*i,j));
SX4(i,j)=sum(X4(10*i-9:10*i,j));
end
end
% 计算每组样品得分的均值
for i=1:K2
Mean3(i)=mean(SX3(i,:));
Mean4(i)=mean(SX4(i,:));
end
% 计算检验值
for i=1:K2
S2(1,i)=(sum((SX3(i,:)-Mean3(i)).^2)+sum((SX4(i,:)-Mean4(i)).^2))/(n2*(n2-1));
T2(1,i)=(Mean3(i)-Mean4(i))/(sqrt(S2(1,i)));
end
AT_W=abs(T2);
M_AT_W=mean(AT_W);
%% 结果显示与比较
a=2.102; % T(0.05,2,18)=2.101
b=2.878; % T(0.01,2,18)=2.878
set(gca,'linewidth',2)
% 红酒结果
for i=1:K1
Ta1(i)=a;
Tb1(i)=b;
end
t1=1:K1;
subplot(2,1,1);
plot(t1,AT_R,'*k-',t1,Ta1,'r-',t1,Tb1,'-.b', 'LineWidth', 2)
title('红酒显著性检验结果','fontsize',14)
legend('T检验值', 'T(0.05)值', 'T(0.01)值')
xlabel('样品号'), ylabel('T检验值')
% 白酒结果
for i=1:K2
Ta2(i)=a;
Tb2(i)=b;
end
t2=1:K2;
subplot(2,1,2);
plot(t2,AT_W,'*k-',t2,Ta2,'r-',t2,Tb2,'-.b', 'LineWidth', 2)
title('白酒显著性检验结果','fontsize',14)
legend('T检验值', 'T(0.05)值', 'T(0.01)值')
xlabel('样品号'), ylabel('T检验值')
% 显示平均检验结果
disp(['两组品酒师对红酒的平均显著性T检验值:' num2str(M_AT_R)]);
disp(['两组品酒师对白酒的平均显著性T检验值:' num2str(M_AT_W)]);
%两组品酒师评价
%% 2012A_question1_T evaluation
% 程序16-2
%--------------------------------------------------------------------------
%% 数据准备
% 清空环境变量
clear all
clc
%导入数据(白葡萄酒)
% X1=xlsread('2012A_T1_processed.xls', 'T1_white_grape', 'D3:M282');
% X2=xlsread('2012A_T1_processed.xls', 'T2_white_grape', 'D3:M282');
%导入数据(红葡萄酒)
X1=xlsread('2012A_T1_processed.xls', 'T1_red_grape', 'D3:M272');
X2=xlsread('2012A_T1_processed.xls', 'T2_red_grape', 'D3:M272');
%% 计算每组品酒师对每个样品的方差
[m,n]=size(X1);
K=27;
% K=28 白葡萄酒
% 计算每个样品的总得分
for i=1:K
for j=1:n
SX1(i,j)=sum(X1(10*i-9:10*i,j));
SX2(i,j)=sum(X2(10*i-9:10*i,j));
end
u0(i)=mean([SX1(i,:), SX2(i,:)]);
end
% 计算方差
for i=1:K
SD1(i,:)=(SX1(i,:)-u0(i)).*(SX1(i,:)-u0(i));
SD2(i,:)=(SX2(i,:)-u0(i)).*(SX2(i,:)-u0(i));
end
%% 结果显示与比较
for i=1:K
TSD(1,i)=sum(SD1(i,:));
TSD(2,i)=sum(SD2(i,:));
end
t=1:K;
plot(t,TSD(1,:),'*k-',t,TSD(2,:),'ok--', 'LineWidth', 2)
set(gca,'linewidth',2);
legend('一组方差','二组方差')
xlabel('红葡萄酒样品编号'); ylabel('红葡萄酒评价方差');
TSD1=sum(TSD(1,:));
TSD2=sum(TSD(2,:));
disp(['一组对白葡萄酒总方差:' num2str(TSD1)]);
disp(['二组对白葡萄酒总方差:' num2str(TSD2)]);
%% 用聚类法确定葡萄酒分级
clc, clear all, close all
%% 需要聚类的数据
% 红葡萄酒质量评分数据
A=[79.95 75 80.45 78.15 76.25 71.95 75.85 71.85 76.65 77.05...
71.85 67.84 69.9 74.55 75.4 70.65 79.55 74.9 74.3 77.2...
77.8 75.2 76.65 74.7 78.3 77.8 70.9 80.45];
% 白葡萄酒质量评分数据
% A=[79.95 75 80.45 78.15 76.25 71.95 75.85 71.85 76.65 77.05...
% 71.85 67.85 69.9 74.55 75.4 70.65 79.55 74.9 74.3 77.2...
% 77.8 75.2 76.65 74.7 78.3 77.8 70.9]
%% 用k-Means聚类法确定最佳的聚类数
X=A';
numC=7;
for i=1:numC
kidx = kmeans(X,i);
silh = silhouette(X,kidx); %计算轮廓值
silh_m(i) = mean(silh); %计算平均轮廓值
end
figure
plot(1:numC,silh_m,'ko-', 'linewidth',2)
set(gca,'linewidth',2);
xlabel('类别数')
ylabel('平均轮廓值')
title(' 不同类别对应的平均轮廓值')
% 绘制2至5类时的轮廓值分布图
figure
set(gca,'linewidth',2);
for i=2:5
kidx = kmeans(X,i);
subplot(2,2,i-1);
[~,h] = silhouette(X,kidx);
set(gca,'linewidth',2);
title([num2str(i), '类时的轮廓值 ' ])
snapnow
xlabel('轮廓值');
ylabel('类别数');
end
%% K-means聚类过程,并将结果显示出来
[idx,ctr]=kmeans(A',4); % 用K-means法聚类
% 提取同一类别的样品号
c1=find(idx==1); c2=find(idx==2);
c3=find(idx==3); c4=find(idx==4);
figure
F1 = plot(find(idx==1), A(idx==1),'k:*', ...
find(idx==2), A(idx==2),'k:o', ...
find(idx==3), A(idx==3),'k:p', ...
find(idx==4), A(idx==4),'k:d');
set(gca,'linewidth',2);
set(F1,'linewidth',2, 'MarkerSize',8);
xlabel('编号','fontsize',12);
ylabel('得分','fontsize',12);
title('Kmeans方法聚类结果')
disp('聚类结果:');
disp(['第1类:' ,'中心点:',num2str(ctr(1)),' ','该类样品编号:', num2str(c1')]);
disp(['第2类:' ,'中心点:',num2str(ctr(2)),' ','该类样品编号:', num2str(c2')]);
disp(['第3类:' ,'中心点:',num2str(ctr(3)),' ','该类样品编号:', num2str(c3')]);
disp(['第4类:' ,'中心点:',num2str(ctr(4)),' ','该类样品编号:', num2str(c4')]);
%% 层次聚类
X=A';
Y=pdist(X); %计算样品间的欧式距离
Z=linkage(Y, 'average'); % 利用类平均法创建系统聚类树
cn=size(X);
clabel=1:cn;
clabel=clabel';
figure
F2 = dendrogram(Z); % 绘制聚类树形图
set(gca,'linewidth',2);
title('层次聚类法聚类结果')
set(F2,'linewidth',2);
ylabel('标准距离');
%% Fuzzy C-means聚类
X=A';
[center,U] = fcm(X,4);
Cid1 = find(U(1,:) ==max(U));
Cid2 = find(U(2,:) ==max(U));
Cid3 = find(U(3,:) ==max(U));
Cid4 = find(U(4,:) ==max(U));
figure
F3=plot(Cid1, A(Cid1),'k:*', ...
Cid2, A(Cid2),'k:o', ...
Cid3, A(Cid3),'k:p', ...
Cid4, A(Cid4),'k:d');
set(gca,'linewidth',2);
set(F3,'linewidth',2, 'MarkerSize',8);
xlabel('编号');
ylabel('得分');
title('Fuzzy C-means方法聚类结果')
%% 2012年全国赛A题第二问求解示例程序
为保持指标级别一致性,统一选择一级指标作为研究对象。
%% PCA-kmeans方法实现对葡萄的理化指标进行聚类
%--------------------------------------------------------------------------
%% 数据导入及处理
clc, clear all, close all
% A=xlsread('2012A_Table2.xls','葡萄酒指标汇总', 'C3:J29');% 红葡萄酒
A=xlsread('2012A_Table2.xls','葡萄酒指标汇总', 'C33:J60');% 白葡萄酒
% 数据标准化处理
a=size(A,1);
b=size(A,2);
for i=1:b
SA(:,i)=(A(:,i)-mean(A(:,i)))/std(A(:,i));
end
%% 计算相关系数矩阵的特征值和特征向量
CM=corrcoef(SA); % 计算相关系数矩阵(correlation matrix)
[V, D]=eig(CM); % 计算特征值和特征向量
for j=1:b
DS(j,1)=D(b+1-j, b+1-j); % 对特征值按降序进行排序
end
for i=1:b
DS(i,2)=DS(i,1)/sum(DS(:,1)); %贡献率
DS(i,3)=sum(DS(1:i,1))/sum(DS(:,1)); %累积贡献率
end
%% 选择主成分及对应的特征向量
T=0.8; % 主成分信息保留率.
for K=1:b
if DS(K,3)>=T
Com_num=K;
break;
end
end
% 提取主成分对应的特征向量
for j=1:Com_num
PV(:,j)=V(:,b+1-j);
end
%% 计算各评价对象的主成分得分
new_score=SA*PV;
for i=1:a
total_score(i,1)=sum(new_score(i,:));
total_score(i,2)=i;
end
result_report=[new_score, total_score]; % 将各主成分得分与总分放在同一个矩阵中
result_report=sortrows(result_report,(K+2)); % 按总分降序排序
%% Kmeans聚类及结果报告
A=result_report(:,(K+1));
[idx,ctr]=kmeans(A,4);
[m,n]=size(A);
t1=ones(1,n)*30;
c1=find(idx==1); c2=find(idx==2); c3=find(idx==3); c4=find(idx==4);
h=plot(t1,A,'ko',c1,A(idx==1),'k--*', c2,A(idx==2),'k--s', c3,A(idx==3),'k--d', c4,A(idx==4),'k--p');
xlabel('白葡萄酒样品编号','fontsize',12);
ylabel('主成分得分','fontsize',12);
title('白葡萄酒理化指标聚类图','fontsize',12)
set(h, 'MarkerSize',8, 'MarkerFaceColor','k');
set(gca,'linewidth',2) ;
disp('主成分得分(最后1列为样本编号,倒数第2列为总分,前面为各主成分得分)')
result_report
disp('分类结果:');
disp(['第1类:' ,'中心点:',num2str(ctr(1)),' ','该类样品编号:', num2str(c1')]);
disp(['第2类:' ,'中心点:',num2str(ctr(2)),' ','该类样品编号:', num2str(c2')]);
disp(['第3类:' ,'中心点:',num2str(ctr(3)),' ','该类样品编号:', num2str(c3')]);
disp(['第4类:' ,'中心点:',num2str(ctr(4)),' ','该类样品编号:', num2str(c4')]);