宁波 上海 大连 北京 厦门 天津 呼和浩特 常州 长沙 沈阳 南京 青岛 济南 武汉 成都
1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 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 1 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 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
G=17.6671
此时在H矩阵中1代表城市的带动关系,0则为无关。
6.模型优缺点评价
6.1优点:
(1) 给出了城市经济规模因素带动效益系数,产业结构因素带动效益系数,地理
因素带动效益系数评价,以及城市带动效益量化值综合评价指标函数,能够对任意一对给定的城市量化出带动效应。 (2) 根据原有A,B组城市模型,利用匈牙利算法求得最优城市对,即总效益最大。 (3) 通过对现实情况分析,根据一般分配模型重新建立对应关系,使得经济带动
总效应达到最大值。
6.2缺点:
(1)基本假设中只考虑城市GDP规模,产业同工系数,地理距离。未将城市的政治职能,交通便利程度考虑进去,不能完全衡量城市之间各个影响的因素。 (2)量化模型采取线性差值法,过于简单。
7、参考文献:
[1] 张杰,周硕等,运筹学模型与实验,北京:中国电力出版社,2007年8月。 [2]《运筹学》教材编写组,运筹学,北京:清华大学出版社,2005年6月。 [3] 陈鹏,成渝城市经济空间发展研究,成都:82-83,2008。
[4] 姜启源,谢金星,叶俊,数学模型(第三版)北京:高等教育出版社,2003年3月。
8.附录
MATLAB关键代码如下:
%问题三代码(匈牙利算法实现代码) function [z,ans]=fenpei(marix);
%输入效率矩阵 marix 为方阵;
%若效率矩阵中有 M,则用一充分大的数代替;%输出z为最优解,ans为 最优分配矩阵; marix=[0.1302 0.1422 0.0976 0.0906 0.1768 0.1584 0.0847 0.08910.1057 0.1101 0.0912 0.0796 0.0887 0.0927 0.0981 0.0827 0.12600.0885 0.1214 0.1499
0.2730 0.3089 0.2322 0.2343 0.3756 0.2274 0.2495 0.2310 0.22650.2342 0.2101 0.2278 0.2255 0.2706 0.2307 0.2289 0.2303 0.23530.2446 0.2803
0.3033 0.3492 0.2618 0.2650 0.4004 0.2568 0.2871 0.2617 0.25420.2608 0.2373 0.2490 0.2535 0.3106 0.2599 0.2586 0.2575 0.26180.2733 0.3072
0.1898 0.2017 0.1792 0.1517 0.2501 0.1589 0.1474 0.1824 0.16920.1596 0.1475 0.1379 0.1468 0.1607 0.1553 0.1430 0.1578 0.18460.1705 0.1983
0.2001 0.2207 0.1856 0.1606 0.2518 0.1644 0.1595 0.1879 0.17200.1673 0.1534 0.1471 0.1536 0.1685 0.1650 0.1501 0.1631 0.21850.1764 0.2051
0.1737 0.1898 0.1532 0.1359 0.2162 0.1388 0.1337 0.1523 0.14290.1433 0.1272 0.1240 0.1299 0.1436 0.1389 0.1265 0.1391 0.16790.1511 0.1759
0.4043 0.4255 0.3820 0.3627 0.4768 0.3681 0.3609 0.3780 0.37660.3717 0.3559 0.3458 0.3553 0.3686 0.3697 0.3507 0.3652 0.39390.3823 0.4155
0.1770 0.1856 0.1383 0.1355 0.2021 0.1542 0.1276 0.1306 0.14080.1437 0.1345 0.1222 0.1316 0.1428 0.1507 0.1278 0.1461 0.13230.1548 0.1761
0.4451 0.4906 0.3665 0.3704 0.5473 0.4405 0.3612 0.3593 0.38520.3787 0.4024 0.3433 0.3491 0.3656 0.3846 0.3418 0.3690 0.35950.4014 0.4557
0.1333 0.1576 0.1013 0.0926 0.2085 0.0922 0.0965 0.0934 0.09100.0980 0.0731 0.0776 0.0851 0.1101 0.0926 0.0849 0.0941 0.1036
0.1079 0.1384
0.2408 0.2559 0.2071 0.1996 0.2134 0.2488 0.1891 0.1979 0.2240 0.2538
0.1575 0.1752 0.1090 0.1085 0.1204 0.1053 0.0881 0.1011 0.1320 0.1637
0.1367 0.1536 0.1304 0.1000 0.1103 0.1001 0.0865 0.0954 0.1175 0.1433
0.1684 0.1931 0.1864 0.1474 0.1399 0.1234 0.1244 0.1360 0.1483 0.1780
0.1791 0.1930 0.1384 0.1360 0.1481 0.1373 0.1250 0.1308 0.1558 0.1801
0.1856 0.2075 0.1865 0.1453 0.1538 0.1466 0.1322 0.1417 0.1676 0.1985
0.1917 0.2070 0.1584 0.1509 0.1618 0.1742 0.1368 0.1459 0.1697 0.1949
0.1713 0.1880 0.1414 0.1272 0.1371 0.2078 0.1134 0.1234 0.1509 0.1770
0.1955 0.2123 0.5328 0.1606 0.1606 0.1568 0.1413 0.1519 0.1725 0.2052
0.1986 0.2099 0.1516 0.1749 0.1666 0.1356 0.1572 0.1674 0.1763 0.2045 ];
a=marix; b=a;
%确定矩阵维数 s=length(a);
%确定矩阵行最小值,进行行减 ml=min(a'); for i=1:s
a(i,:)=a(i,:)-ml(i); end
%确定矩阵列最小值,进行列减 mr=min(a); for j=1:s
0.2988 0.2527 0.2054 0.2177 0.1997 0.2039 0.1089 0.1142 0.1806 0.1084 0.1092 0.1032 0.2344 0.1360 0.1653 0.1314 0.2202 0.1568 0.1397 0.1624 0.2405 0.1533 0.1534 0.1514 0.2316 0.1734 0.1572 0.1583 0.2083 0.1657 0.1357 0.1365 0.2506 0.1639 0.1719 0.1556 0.2298 0.1550 0.1692 0.1510 0.1967 0.2036 0.1906 0.2166 0.0993 0.0989 0.0917 0.1324 0.0983 0.1216 0.0917 0.1067 0.1661 0.1585 0.1316 0.1404 0.1313 0.1308 0.1271 0.1435 0.1430 0.1835 0.1340 0.1536 0.1472 0.1558 0.1421 0.1597 0.1232 0.1360 0.1189 0.1412 0.1615 0.2863 0.1471 0.1634 0.1493 0.1455 0.1472 0.1778 0.22150.20420.11880.09740.12190.12090.14360.15300.14260.13280.17460.17680.17280.15460.19390.13350.18560.17770.15050.1415
a(:,j)=a(:,j)-mr(j); end
% start working num=0;
while(num~=s) %终止条件是“(0)”的个数与矩阵的维数相同
%index用以标记矩阵中的零元素,若a(i,j)=0,则index(i,j)=1,否则index(i,j)=0 index=ones(s); index=a&index; index=~index;
%flag用以标记划线位,flag=0 表示未被划线, %flag=1 表示有划线过,flag=2 表示为两直线交点 %ans用以记录 a 中“(0)”的位置 %循环后重新初始化flag,ans flag = zeros(s); ans = zeros(s);
%一次循环划线全过程,终止条件是所有的零元素均被直线覆盖, %即在flag>0位,index=0 while(sum(sum(index))) %按行找出“(0)”所在位置,并对“(0)”所在列划线, %即设置flag,同时修改index,将结果填入ans for i=1:s t=0; l=0; for j=1:s
if(flag(i,j)==0&&index(i,j)==1) l=l+1; t=j; end end if(l==1)
flag(:,t)=flag(:,t)+1; index(:,t)=0; ans(i,t)=1; end end
%按列找出“(0)”所在位置,并对“(0)”所在行划线, %即设置flag,同时修改index,将结果填入ans for j=1:s t=0; r=0; for i=1:s
if(flag(i,j)==0&&index(i,j)==1) r=r+1; t=i;
end end if(r==1)
flag(t,:)=flag(t,:)+1; index(t,:)=0; ans(t,j)=1; end end
end %对 while(sum(sum(index))) %处理过程
%计数器:计算ans中1的个数,用num表示 num=sum(sum(ans));
% 判断是否可以终止,若可以则跳出循环 if(s==num) break; end
%否则,进行下一步处理
%确定未被划线的最小元素,用m表示 m=max(max(a)); for i=1:s for j=1:s
if(flag(i,j)==0) if(a(i,j) %未被划线,即flag=0处减去m;线交点,即flag=2处加上m for i=1:s for j=1:s if(flag(i,j)==0) a(i,j)=a(i,j)-m; end if(flag(i,j)==2) a(i,j)=a(i,j)+m; end end end end %对while(num~=s) %计算最优(min)值 zm=ans.*b; z=0; z=sum(sum(zm)); ans %问题四代码 function d=hehe(a,b,c) a为正文表3,b为正文表4,c为正文表6 for i=1:20 for j=1:20 if(a(i,j)>=b(i,j)) if(a(i,j)>=c(i,j)) d(i,j)=1; else d(i,j)=2; end else if(b(i,j)>=c(i,j)) d(i,j)=3; else d(i,j)=2; end end end end %问题五代码 f为表6对应矩阵 A为表2对应矩阵 %i可以取0到19,可以求出1到20列的数据,和每列的最优值 i=1 f=f(i*20+1:(i+1)*20); A=A(i+1,1:20); b=ones(1,1); ib=zeros(20,1); ub=ones(20,1); [x,feval]=linprog(-f,A,b,[],[],ib,ub)