0-1规划中并行隐枚举法的实现方式
- 格式:pdf
- 大小:148.30 KB
- 文档页数:3
隐枚举法
一种特殊的分支定界法.对0-1规划问题.利用变量只能取0或1的两个值的特性,进行分支定界,以达到隐枚举的目的.基本思路是:通过变量的变换,使目标函数中的系数全为非正.首先令全部变量取0,因为目标函数的系数全非正,所以此解相应的目标函数值s=0就是上界.若可行,则此解为最优解,计算终止.否则,有选择地指定其中某个变量为0或1,并把它们固定下来(称为固定变量),将问题分解成两个子问题.然后,分别对它们进行检验,即对未被固定取值的变量(称为自由变量),令其全部为0,检查它们与固定变量所组成的解是否可行.若可行,则此解就是目前最好的可行解(不一定是最优解),不再分支,其相应的目标函数值就是原问题的一个下界;否则,在余下的自由变量中,继续上面的过程.经过检验,或者停止分支,修改下界,或者有选择地将某个自由变量转为固定变量,指定其为0或1,把子问题再分支.如此进行下去,直到全部子问题停止分支,或没有自由变量为止,而以其中最大的下界值所对应的可行解为最优解.。
0-1整数规划与隐枚举法-感受剪枝的魅力作者:llhthinker整数规划是线性规划的特殊情况,即当约束条件是变量为整数时,线性规划就变成了整数规划。
若要求所有变量都为整数,即为纯整数规划;若允许存在一部分变量不一定为整数,则称为混合整数规划。
而本文要讨论的0-1整数规划则是纯整数规划的特殊情况,即所有变量要么等于0,要么等于1,故这种变量又成为逻辑变量。
0-1整数规划在生活中还是很常见的,通常可以总结为“是”“否”问题。
例如,有n个产品销地x1,...,xn可供选择,为使得利润最大,那么每一个销地都面临是否选择的问题,通常还会有一些限制条件,由于销地xi与销地xj距离较近,所以规定若选择xi就不能选择xj等。
那么如何求解0-1规划问题?最朴素的方法是枚举,即将所有销地是否被选择的情况都考虑,那么就是从{0, ... ,0}枚举到{1, ... ,1},需要2的n次方的枚举次数。
显然,当n较大时,这种方式的效率就非常低。
本文要介绍的隐枚举法就可以提高求解出最优解的效率。
所谓隐枚举法,从字面上理解,就是隐去一些不需要枚举的情况,下面从一个例子出发,来给出隐枚举法的步骤。
【例】求解下列规划问题max z = 8*x1 + 2*x2 - 4*x3 - 7*x4 -5*x5;s.t.{3*x1 + 3*x2 + x3 + 2*x4 + 3*x5 <=>5*x1 + 3*x2 - 2*x3 - x4 + x5 <=>xi = 0或1,i = 1, ..., 5}1. 预处理首先需要对原问题进行预处理,至于为什么后文将会解释。
预处理的步骤如下:1) 将目标函数统一为求最小值,即'min', 同时将约束条件都化为'>='。
•若原约束条件为'<>•若原约束条件为'Ai * X = bi',则化为'Ai * X >= bi' 和'-Ai * X >= -bi',其中Ai为系数行向量,X为变量列向量。
0 前言化问题,可知最优解的目标函数一定不小于 5。
为此,在求最优解之前先增加一个约束条件,即过滤0- 1 型整数规划是整数规划的特例,其数学模型的目 条件:3x - 2x +5x !5##⊙ 标函数、约束条件与线性规划相同,不同的是其变量只能1 2 3 过滤条件的作用是:在检验一个解是否为可行解之取 0 和 1,分别表示两种截然相反的结果。
0- 1 型整数规前,先看目标函数是否不小于 5,若小于 5,则肯定不是最 划应用很广,如土木工程系统的最优工程配置问题,城建优解,其可行性无须再检验而直接被淘汰,可以大大减少规划中的居民点、给水点、加油站和商业网点的最优布局计算工作量。
问题,均可应用 0- 1 型整数规划求得最优解。
有了过滤条件,就可以列表计算。
对解集中的解逐个检0- 1 型整数规划的数学模型如下:验,先检验过滤条件,若不符合则直接淘汰该解;若符合条 目标函数:件⊙,再按①~④顺序检验每一个约束条件,当某一个约 束条件不满足时即行淘汰,其右边的约束条件再无检验 约束条件:的必要。
这样,计算工作量可大为减少。
本例中有 3 个变量,共有 23=8 个解需要检验,通过计 算求得的最优解为: .本例以 为初始可行解,通过建立过滤条1 求解 0- 1 型整数规划三种通用的方法 件,只计算了 18 次就找到了最优解,而用穷举法需要计算1.1 穷举法40 次,技术工作量大大减少了。
如在求解过程发现更好的 由于 0- 1 型整数规划的变量个数有限且取值非 0 即可行解及时更换过滤条件 ,计算工作量还可进一步减少。
1,所以不难将解的集合找出来,再检验每个解的可行性, 1.2.2 对隐枚法法 I 的评价 凡符合全部约束条件者均为可行解,通过比较目标函数 对隐枚举法 I 来说其数学模型无须转化为标准型,减的值便可找到最优解,这个解法称为穷举法。
当变量和约 少了人工处理的工作量,但它需要检验的方案较多,而且 束条件很多时,其工作量是非常大的。
(5)解 0—1 规划的隐枚举法解 0—1 规划的隐枚举法有其独特的工作程序,具体过程如下。
a.模型转化为求极小的问题b.变量替换。
极小问题模型的目标函数中所有变量系数为负的0—1变量,可利用变量替换x k=1-x'k (x'k是引入的新的0—1变量),将目标函数中所有变量系数化为正数。
c.目标函数中变量按系数大小排列,约束条件中变量排列顺序也相应调整。
d.按目标函数值由小到大的顺序依次排列可能的解,并予以可行性检验。
e.发现求极小问题的最优解并停止。
f.转化为原问题的最优解。
例4 用隐枚举法求解下列0—1规划问题Max Z=3x1+2x2-5x3-2x4+3x5x+x2+x3+2x4 +x5≤417x1 +3x3-4x4+3x5≤811x1-6x2 +3x4 +5x5≥3x=0, 1, j=1, 2, 3, 4, 5.j解:①转化为求极小的问题Min Z=-3x1-2x2+5x3+2x4-3x5-x1 -x2-x3-2x4 -x5≥-4-7x1 -3x3+4x4-3x5≥-811x1 -6x2 +3x4 +5x5≥3x=0, 1, j=1, 2, 3, 4, 5.j②令x'1=1-x1, x'2=1-x2, x'5=1-x5, 带入极小问题模型中,得Min Z=3 x'1+2 x'2+5x3+2x4+3 x'5-8x'+x'2-x3-2x4 +x'5≥-117x'1 -3x3+4x4+3x'5≥2-11x'1 +6x'2 +3x4-5x'5≥-7x=0, 1, j= 3, 4; x'j =0, 1, j= 1, 2, 5.j③目标函数中变量按系数大小排列,约束条件中变量排列顺序也相应调整,得Min Z=5x3+3 x'1+3 x'5+2 x'2+2x4-8-x3+x'1 +x'5+x'2-2x4 ≥-1 ①-3x3+ 7x'1 +3x'5 +4x4≥2②-11x'1 -5x'5+6x'2 +3x4≥-7 ③x=0, 1, j= 3, 4; x'j =0, 1, j= 1, 2, 5.j④按目标函数值由小到大的顺序排列可能的解,并予以可行性检验。
2013—2014(2)专业课程实践论文题目:0-1规划的隐枚举法一、算法理论 0—1规划在整数规划中占有重要地位,一方面因为许多实际问题,例如指派问题、选地问题、送货问题都可归结为此类规划,另一方面任何有界变量的整数规划都与0-1规划等价,用0—1规划方法还可以把多种非线性规划问题表示成整数规划问题,所以不少人致力于这个方向的研究.求解0—1规划的常用方法是分枝定界法,对各种特殊问题还有一些特殊方法.线性模型中,当变量的取值只能是“0”或“1”时,称之为“0-1规划问题”。
有种极其简单的解法,就是将变量取值为0或1的所有组合列出,然后分别代入目标函数,选出其中能使目标函数最优化的组合,即为最优解。
但是真的这样会做很多无用功,浪费大量资源,所以,需要改进方法.本文主要介绍隐枚举法的应用原理,意在剖析其“隐"在何处.从而帮助读者更好地应用这种方法。
和线性规划问题一样,首先需要将模型标准化。
标准化对0-1规划问题提出四点要求:1。
目标函数为最小优化2.目标函数中变量的系数都为正3。
在目标函数中,变量按系数值从小到大排列,则约束函数中,变量的排列次序也做相应改变。
4.所有变量均为0或10-1线性规划的基本形式是1min nj jj Z c x ==∑011,2,,..1,2,,j ij j j x j m s t a x b i n ==⋅⋅⋅⎧⎪⎨≤=⋅⋅⋅⎪⎩∑或function [intx,intf] = ZeroOneprog(c,A,b,x0)%目标函数系数向量,c%不等式约束矩阵,A%不等式约束右端向量,b%初始整数可行解,x0%目标函数取最小值时的自变量值,intx%目标函数的最小值,intfsz = size(A);if sz(2) < 3[intx,intf] = Allprog(c,A,b);%穷举法else[intx,intf] = Implicitprog(c,A,b,x0); %隐枚举法endfunction [intx,intf] = Allprog(c,A,b)sz_A = size(A);rw = sz_A(1);col = sz_A(2);minf = inf;for i=0:(2^(col)-1) %枚举空间x1 = myDec2Bin(i,col);%十进制转化为二进制if A*x1 >= b %是否满足约束条件f_tmp = c*x1;if f_tmp 〈 minfminf = f_tmp;intx = x1;intf = minf;elsecontinue;endelsecontinue;endendfunction[intx,intf] = Implicitprog(c,A,b,x0)%隐枚举法sz_A = size(A);rw = sz_A(1);col = sz_A(2);minf = c*x0;A = [A;—c];b = [b;-minf];%增加了一个限制分量for i=0:(2^(col)—1)x1 = myDec2Bin(i,col);if A*x1 >= bf_tmp = c*x1;if f_tmp 〈 minfminf = f_tmp;b(rw+1,1) = —minf;%隐枚举法与穷举法的区别在于此句 intx = x1;intf = minf;elsecontinue;endelsecontinue;endendfunction y = myDec2Bin(x,n) %十进制转化为二进制str = dec2bin(x,n);for j=1:ny(j) = str2num(str(j));endy = transpose(y);四、算法实现例1.求解下面0—1规划()⎪⎩⎪⎨⎧=≥++++≥++++++++=105224287453232min 54321543215432154321或,x ,x ,x ,x x x x x x x x x x x x ,s.t.x x x x x x f解:在MATLAB 命令框在输入下列命令:〉〉 c=[1 2 3 1 1];>> A=[2 3 5 4 7;1 1 4 2 2];>〉 b=[8;5];>〉 x0=[1;1;1;1;1];>> [intx,intf]=ZeroOneprog (c ,A,b,x0)所得结果如下:1231231231213123max 3252244..346,,01z x x x x x x x x x s t x x x x x x x =-++-≤⎧⎪++≤⎪⎪+≤⎨⎪+≤⎪⎪⎩为或 解:在MATLAB 命令框在输入下列命令:>> c=[—3,2,—5];〉> A=[—1,—2,1;-1,—4,—1;-1,—1,0;—4,0,-1]; >> b=[-2;-4;—3;-6];〉> x0=[1;0;0];>〉 [intx,intf]=ZeroOneprog (c ,A ,b,x0)123412341234124min 3721648..53501,1,2,3,4j z x x x x x x x x x x x x s t x x x x j =+-+-+-≥⎧⎪-++≥⎪⎨++≥⎪⎪==⎩或 解:在MATLAB 命令框在输入下列命令: >〉 c=[3,7,-1,1];A=[2,-1,1,-1;1,—1,6,4;5,3,0,1]; b=[1;8;5];>> x0=[1;1;1;1];〉〉 [intx,intf]=ZeroOneprog (c,A,b ,x0)123123123123max 62323352..2401,1,2,3j z x x x x x x x x x s t x x x x j =++++≤⎧⎪-+≥⎪⎨++≤⎪⎪==⎩或解:在MATLAB 命令框在输入下列命令: 〉> c=[-6,—2,-3];A=[-1,-2,—1;3,—5,1;—2,-1,—1]; b=[-3;2;-4];x0=[1;0;0];[intx ,intf ]=ZeroOneprog (c ,A ,b,x0)。
隐枚举法
一种特殊的分支定界法.对0-1规划问题.利用变量只能取0或1的两个值的特性,进行分支定界,以达到隐枚举的目的.基本思路是:通过变量的变换,使目标函数中的系数全为非正.首先令全部变量取0,因为目标函数的系数全非正,所以此解相应的目标函数值s=0就是上界.若可行,则此解为最优解,计算终止.否则,有选择地指定其中某个变量为0或1,并把它们固定下来(称为固定变量),将问题分解成两个子问题.然后,分别对它们进行检验,即对未被固定取值的变量(称为自由变量),令其全部为0,检查它们与固定变量所组成的解是否可行.若可行,则此解就是目前最好的可行解(不一定是最优解),不再分支,其相应的目标函数值就是原问题的一个下界;否则,在余下的自由变量中,继续上面的过程.经过检验,或者停止分支,修改下界,或者有选择地将某个自由变量转为固定变量,指定其为0或1,把子问题再分支.如此进行下去,直到全部子问题停止分支,或没有自由变量为止,而以其中最大的下界值所对应的可行解为最优解.。
0—1型整数规划问题的求解方法1、一般来说,碰到了0-1规划的问题,怎么办?枚举,比较每个解对应的目标函数值。
为什么要枚举,是把每一个解都拿出来比较。
因此,有的叫法是显枚举法?2、有显枚举法,就有隐枚举法。
如果说,显枚举法是显式的枚举法,那么隐枚举法就是隐式的枚举法。
都是枚举法,都是要把所有的解带入到目标函数进行比较,对不对?理论上是这样的,可以参考其他的讲解。
但是,其他的地方讲解似乎没有把这个讲解到位,为什么叫隐枚举法。
有一种说法是:设计一种方法,只检查0-1变量组合的一部分,就能得到问题的最优解。
3、首先,如果你不把所有的解都判断一下,我怎么知道那个解是不是最优的解呢?回顾一下LP问题的求解,发现线性规划并不需要判断所有的解,确切的说,是所有的可行解。
只需要在所有的基本可行解里面去寻找最优的解。
因此,0-1规划求解的思路也是一样,是在所有的0-1可行解里面去寻找。
这样,就需要在约束条件里面去一个一个的判断,这个0-1组合是否可行。
所以,隐枚举法的思路,还是枚举法,但是我并不是要把每个解都要进行约束条件的判断,判断他是不是可行,可以只检查所有0-1变量组合的一部分约束条件的判断,这样还是可以得到问题的最优解。
4、接着,那怎么减少约束条件的检查判断呢?设置一个过滤条件,叫做过滤约束,如果这个不满足,那么其他的约束就不用判断了。
因此,隐的意思应该在这里。
问题来了,怎么添加这个过滤约束呢?通过一种方法(试探法),找到一个可行解,然后代入目标函数,得到目标值,这个就得到了一个过滤约束。
求最大值的时候,如果一个可行解的目标值不大于这个约束,那么直接排除。
5、继续。
怎么得到这个过滤约束。
比如下面的例子:一种说法是试探法,随便试探?或者可以从某一个解开始(比如0,0,0)开始递增,直到得到一个可行解,然后就得到了这个过滤约束了,比如上面的例子,我们可以从1,0,0开始递增,先看看这个解是不是可行解。
是在可行解,因此看目标函数值是3,因此得到一个约束,3x1-2x2+5x3>=3过滤约束。
华北电力大学数理系邵森using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace zhengshuguihuayinmeijufa{public class Program{public static int Min(int[] V){int min = V[0];for (int i = 0; i < V.Length-1 ; i++)for (int j = 1; j < V.Length ; j++){if (min > V[j])min = V[j];}return min;}public static int Max(int[] V){int max = V[0];for (int i = 0; i < V.Length - 1; i++)for (int j = 1; j < V.Length; j++){if (max<V[j])max = V[j];}return max;}public static int PaiDing(int [,] T,int a, int b, int c,int d,int e,int f,int g,int t,int L,int H,int U,int []M) {if (U == 3){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] <= T[i, 3]))m++;}if (m == H )t = a * M[0] + b * M[1] + c * M[2];}if (U == 4){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] + d * T[i, 3] <= T[i, 4]))m++;}if (m == H )t = a * M[0] + b * M[1] + c * M[2] + d * M[3];}if (U == 5){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] +d* T[i, 3]+e*T[i,4]<=T[i,5]))m++;}if (m == H )t = a*M[0]+b*M[1]+c*M[2]+d*M[3]+e*M[4];}if (U == 6){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] + d * T[i, 3] + e * T[i, 4] +f*T[i, 5]<=T[i,6]))m++;}if (m == H )t = a*M[0]+b*M[1]+c*M[2]+d*M[3]+e*M[4]+f*M[5];}if (U == 7){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] + d * T[i, 3] + e * T[i, 4] + f * T[i, 5] +g*T[i, 6]<=T[i,7]))m++;}if (m == H)t = a*M[0]+b*M[1]+c*M[2]+d*M[3]+e*M[4]+f*M[5]+g*M[6];}return t;}public static int PaiDing1(int[,] T, int a, int b, int c, int d, int e, int f, int g, int t, int L, int H, int U, int[] M){if (U == 3){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] >= T[i, 3]))m++;}if (m == H)t = a * M[0] + b * M[1] + c * M[2];elset = t + 10000;}if (U == 4){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] + d * T[i, 3] >= T[i, 4]))m++;}if (m == H)t = a * M[0] + b * M[1] + c * M[2] + d * M[3];elset = t + 10000;}if (U == 5){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] + d * T[i, 3] + e * T[i, 4] >= T[i, 5]))m++;}if (m == H)t = a * M[0] + b * M[1] + c * M[2] + d * M[3] + e * M[4];elset = t + 10000;}if (U == 6){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] + d * T[i, 3] + e * T[i, 4] + f * T[i, 5] >= T[i, 6]))m++;}if (m == H)t = a * M[0] + b * M[1] + c * M[2] + d * M[3] + e * M[4] + f * M[5];elset = t + 10000;}if (U == 7){int m = 0;for (int i = 0; i < H; i++){int j = 0;if ((a * T[i, j] + b * T[i, j + 1] + c * T[i, j + 2] + d * T[i, 3] + e * T[i, 4] + f * T[i, 5] + g * T[i, 6] >=T[i, 7]))m++;}if (m == H)t = a * M[0] + b * M[1] + c * M[2] + d * M[3] + e * M[4] + f * M[5] + g * M[6];elset = t + 10000;}return t;}public static string FH(int[,] T, int[] M, int U, int Z, int L, int H,string str)//T为a传ä?入¨?的Ì?矩?阵¨®V为a记?录?所¨´求¨®解a的Ì?值¦ÌM目?标À¨º函¡¥数ºy的Ì?数ºy组Á¨¦//U变À?元a的Ì?个?数ºyZ为a最Á?优®?值¦Ì{if (U == 3){int N = 8;int[] K = new int[N];string[] str1 = new string[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[0] = "000";K[1] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[1] = "001";K[2] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[2] = "010";str1[3] = "011";str1[4] = "100";K[3] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[5] = "101";K[4] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[6] = "110";K[5] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[7] = "111";K[6] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M);K[7] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M);Z = Max(K);int j=0;for (int i = 0; i < N; i++){if (K[i] == Z)j = i;}str = str1[j];}if (U == 4){int N = 16;int[] K = new int[N];string[] str1 = new string[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[0] = "0000";K[1] = PaiDing(T, 0, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[1] = "0001";K[2] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[2] = "0010";K[3] = PaiDing(T, 0, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[3] = "0011";K[4] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[4] = "0100";K[5] = PaiDing(T, 0, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[5] = "0101";K[6] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[6] = "0110";K[7] = PaiDing(T, 0, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[7] = "0111";K[8] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[8] = "1000";K[9] = PaiDing(T, 1, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[9] = "1001";K[10] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[10] = "1010";K[11] = PaiDing(T, 1, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[11] = "1011";K[12] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[12] = "1100";K[13] = PaiDing(T, 1, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[13] = "1101";K[14] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[14] = "1110";K[15] = PaiDing(T, 1, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[15] = "1111";Z = Max(K);int j = 0;for (int i = 0; i < N; i++){if (K[i] == Z)j = i;}str = str1[j];}if (U == 5){int N = 32;int[] K = new int[N];string[] str1 = new string[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[0] = "00000";K[1] = PaiDing(T, 0, 0, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[1] = "00001";K[2] = PaiDing(T, 0, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[2] = "00010";K[3] = PaiDing(T, 0, 0, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[3] = "00011";K[4] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[4] = "00100";K[5] = PaiDing(T, 0, 0, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[5] = "00101";K[6] = PaiDing(T, 0, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[6] = "00110";K[7] = PaiDing(T, 0, 0, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[7] = "00111";K[8] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[8] = "01000";K[9] = PaiDing(T, 0, 1, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[9] = "01001";K[10] = PaiDing(T, 0, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[10] = "01010";K[11] = PaiDing(T, 0, 1, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[11] = "01011";K[12] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[12] = "01100";K[13] = PaiDing(T, 0, 1, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[13] = "01101";K[14] = PaiDing(T, 0, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[14] = "01110";K[15] = PaiDing(T, 0, 1, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[15] = "01111";K[16] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[16] = "10000";K[17] = PaiDing(T, 1, 0, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[17] = "10001";K[18] = PaiDing(T, 1, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[18] = "10010";K[19] = PaiDing(T, 1, 0, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[19] = "10011";K[20] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[20] = "10100";K[21] = PaiDing(T, 1, 0, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[21] = "10101";K[22] = PaiDing(T, 1, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[22] = "10110";K[23] = PaiDing(T, 1, 0, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[23] = "10111";K[24] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[24] = "11000";K[25] = PaiDing(T, 1, 1, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[25] = "11001";K[26] = PaiDing(T, 1, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[26] = "11010";K[27] = PaiDing(T, 1, 1, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[27] = "11011";K[28] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[28] = "11100";K[29] = PaiDing(T, 1, 1, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[29] = "11101";K[30] = PaiDing(T, 1, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[30] = "11110";K[31] = PaiDing(T, 1, 1, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[31] = "11111";Z = Max(K);int j = 0;for (int i = 0; i < N; i++){if (K[i] == Z)j = i;}str = str1[j];}if (U == 6){int N = 64;int[] K = new int[N];string[] str1 = new string[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[0] = "000000";K[1] = PaiDing(T, 0, 0, 0, 0, 0, 1, 0, 0, L, H, U, M); str1[1] = "000001";K[2] = PaiDing(T, 0, 0, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[2] = "000010";K[3] = PaiDing(T, 0, 0, 0, 0, 1, 1, 0, 0, L, H, U, M); str1[3] = "000011";K[4] = PaiDing(T, 0, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[4] = "000100";K[5] = PaiDing(T, 0, 0, 0, 1, 0, 1, 0, 0, L, H, U, M); str1[5] = "000101";K[6] = PaiDing(T, 0, 0, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[6] = "000110";K[7] = PaiDing(T, 0, 0, 0, 1, 1, 1, 0, 0, L, H, U, M); str1[7] = "000111"; K[8] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[8] = "001000"; K[9] = PaiDing(T, 0, 0, 1, 0, 0, 1, 0, 0, L, H, U, M); str1[9] = "001001"; K[10] = PaiDing(T, 0, 0, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[10] = "001010"; K[11] = PaiDing(T, 0, 0, 1, 0, 1, 1, 0, 0, L, H, U, M); str1[11] = "001011"; K[12] = PaiDing(T, 0, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[12] = "001100"; K[13] = PaiDing(T, 0, 0, 1, 1, 0, 1, 0, 0, L, H, U, M); str1[13] = "001101"; K[14] = PaiDing(T, 0, 0, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[14] = "001110"; K[15] = PaiDing(T, 0, 0, 1, 1, 1, 1, 0, 0, L, H, U, M); str1[15] = "001111"; K[16] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[16] = "010000"; K[17] = PaiDing(T, 0, 1, 0, 0, 0, 1, 0, 0, L, H, U, M); str1[17] = "010001"; K[18] = PaiDing(T, 0, 1, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[18] = "010010"; K[19] = PaiDing(T, 0, 1, 0, 0, 1, 1, 0, 0, L, H, U, M); str1[19] = "010011"; K[20] = PaiDing(T, 0, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[20] = "010100"; K[21] = PaiDing(T, 0, 1, 0, 1, 0, 1, 0, 0, L, H, U, M); str1[21] = "010101"; K[22] = PaiDing(T, 0, 1, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[22] = "010110"; K[23] = PaiDing(T, 0, 1, 0, 1, 1, 1, 0, 0, L, H, U, M); str1[23] = "010111"; K[24] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[24] = "011000"; K[25] = PaiDing(T, 0, 1, 1, 0, 0, 1, 0, 0, L, H, U, M); str1[25] = "011001"; K[26] = PaiDing(T, 0, 1, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[26] = "011010"; K[27] = PaiDing(T, 0, 1, 1, 0, 1, 1, 0, 0, L, H, U, M); str1[27] = "011011"; K[28] = PaiDing(T, 0, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[28] = "011100"; K[29] = PaiDing(T, 0, 1, 1, 1, 0, 1, 0, 0, L, H, U, M); str1[29] = "011101"; K[30] = PaiDing(T, 0, 1, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[30] = "011110"; K[31] = PaiDing(T, 0, 1, 1, 1, 1, 1, 0, 0, L, H, U, M); str1[31] = "011111"; K[32] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[32] = "100000"; K[33] = PaiDing(T, 1, 0, 0, 0, 0, 1, 0, 0, L, H, U, M); str1[33] = "100001"; K[34] = PaiDing(T, 1, 0, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[34] = "100010"; K[35] = PaiDing(T, 1, 0, 0, 0, 1, 1, 0, 0, L, H, U, M); str1[35] = "100011"; K[36] = PaiDing(T, 1, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[36] = "100100"; K[37] = PaiDing(T, 1, 0, 0, 1, 0, 1, 0, 0, L, H, U, M); str1[37] = "100101"; K[38] = PaiDing(T, 1, 0, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[38] = "100110"; K[39] = PaiDing(T, 1, 0, 0, 1, 1, 1, 0, 0, L, H, U, M); str1[39] = "100111"; K[40] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[40] = "101000"; K[41] = PaiDing(T, 1, 0, 1, 0, 0, 1, 0, 0, L, H, U, M); str1[41] = "101001"; K[42] = PaiDing(T, 1, 0, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[42] = "101010"; K[43] = PaiDing(T, 1, 0, 1, 0, 1, 1, 0, 0, L, H, U, M); str1[43] = "101011"; K[44] = PaiDing(T, 1, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[44] = "101100"; K[45] = PaiDing(T, 1, 0, 1, 1, 0, 1, 0, 0, L, H, U, M); str1[45] = "101101"; K[46] = PaiDing(T, 1, 0, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[46] = "101110"; K[47] = PaiDing(T, 1, 0, 1, 1, 1, 1, 0, 0, L, H, U, M); str1[47] = "101111"; K[48] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[48] = "110000"; K[49] = PaiDing(T, 1, 1, 0, 0, 0, 1, 0, 0, L, H, U, M); str1[49] = "110001"; K[50] = PaiDing(T, 1, 1, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[50] = "110010"; K[51] = PaiDing(T, 1, 1, 0, 0, 1, 1, 0, 0, L, H, U, M); str1[51] = "110011"; K[52] = PaiDing(T, 1, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[52] = "110100"; K[53] = PaiDing(T, 1, 1, 0, 1, 0, 1, 0, 0, L, H, U, M); str1[53] = "110101"; K[54] = PaiDing(T, 1, 1, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[54] = "110110"; K[55] = PaiDing(T, 1, 1, 0, 1, 1, 1, 0, 0, L, H, U, M); str1[55] = "110111"; K[56] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[56] = "111000"; K[57] = PaiDing(T, 1, 1, 1, 0, 0, 1, 0, 0, L, H, U, M); str1[57] = "111001"; K[58] = PaiDing(T, 1, 1, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[58] = "111010"; K[59] = PaiDing(T, 1, 1, 1, 0, 1, 1, 0, 0, L, H, U, M); str1[59] = "111011"; K[60] = PaiDing(T, 1, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[60] = "111100"; K[61] = PaiDing(T, 1, 1, 1, 1, 0, 1, 0, 0, L, H, U, M); str1[61] = "111101"; K[62] = PaiDing(T, 1, 1, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[62] = "111110"; K[63] = PaiDing(T, 1, 1, 1, 1, 1, 1, 0, 0, L, H, U, M); str1[63] = "111111"; Z = Max(K);int j = 0;for (int i = 0; i < N; i++){if (K[i] == Z)j = i;}str = str1[j];}return str;}public static string FH1(int[,] T, int[] M, int U, int Z, int L, int H, string str)//T为a传ä?入¨?的Ì?矩?阵¨®V为a记?录?所¨´求¨®解a的Ì?值¦ÌM目?标À¨º函¡¥数ºy的Ì?数ºy组Á¨¦//U变À?元a的Ì?个?数ºyZ为a最Á?优®?值¦Ì{if (U == 3){int N = 8;int[] K = new int[N];string[] str1 = new string[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[0] = "000";K[1] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[1] = "001";K[2] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[2] = "010";str1[3] = "011";str1[4] = "100";K[3] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[5] = "101";K[4] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[6] = "110";K[5] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[7] = "111";K[6] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M);K[7] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M);Z = Min(K);int j = 0;for (int i = 0; i < N; i++){if (K[i] == Z)j = i;}str = str1[j];}if (U == 4){int N = 16;int[] K = new int[N];string[] str1 = new string[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[0] = "0000";K[1] = PaiDing(T, 0, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[1] = "0001";K[2] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[2] = "0010";K[3] = PaiDing(T, 0, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[3] = "0011";K[4] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[4] = "0100";K[5] = PaiDing(T, 0, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[5] = "0101";K[6] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[6] = "0110";K[7] = PaiDing(T, 0, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[7] = "0111";K[8] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[8] = "1000";K[9] = PaiDing(T, 1, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[9] = "1001";K[10] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[10] = "1010";K[11] = PaiDing(T, 1, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[11] = "1011";K[12] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[12] = "1100";K[13] = PaiDing(T, 1, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[13] = "1101";K[14] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[14] = "1110";K[15] = PaiDing(T, 1, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[15] = "1111";Z = Min(K);int j = 0;for (int i = 0; i < N; i++){if (K[i] == Z)j = i;}str = str1[j];}if (U == 5){int N = 32;int[] K = new int[N];string[] str1 = new string[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[0] = "00000";K[1] = PaiDing(T, 0, 0, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[1] = "00001";K[2] = PaiDing(T, 0, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[2] = "00010";K[3] = PaiDing(T, 0, 0, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[3] = "00011";K[4] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[4] = "00100";K[5] = PaiDing(T, 0, 0, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[5] = "00101";K[6] = PaiDing(T, 0, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[6] = "00110";K[7] = PaiDing(T, 0, 0, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[7] = "00111";K[8] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[8] = "01000";K[9] = PaiDing(T, 0, 1, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[9] = "01001";K[10] = PaiDing(T, 0, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[10] = "01010";K[11] = PaiDing(T, 0, 1, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[11] = "01011";K[12] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[12] = "01100";K[13] = PaiDing(T, 0, 1, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[13] = "01101";K[14] = PaiDing(T, 0, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[14] = "01110";K[15] = PaiDing(T, 0, 1, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[15] = "01111";K[16] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[16] = "10000";K[17] = PaiDing(T, 1, 0, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[17] = "10001";K[18] = PaiDing(T, 1, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[18] = "10010";K[19] = PaiDing(T, 1, 0, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[19] = "10011";K[20] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[20] = "10100";K[21] = PaiDing(T, 1, 0, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[21] = "10101";K[22] = PaiDing(T, 1, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[22] = "10110";K[23] = PaiDing(T, 1, 0, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[23] = "10111";K[24] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[24] = "11000";K[25] = PaiDing(T, 1, 1, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[25] = "11001";K[26] = PaiDing(T, 1, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[26] = "11010";K[27] = PaiDing(T, 1, 1, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[27] = "11011";K[28] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[28] = "11100";K[29] = PaiDing(T, 1, 1, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[29] = "11101";K[30] = PaiDing(T, 1, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[30] = "11110";K[31] = PaiDing(T, 1, 1, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[31] = "11111";Z = Min(K);int j = 0;for (int i = 0; i < N; i++){if (K[i] == Z)j = i;}str = str1[j];}if (U == 6){int N = 64;int[] K = new int[N];string[] str1 = new string[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[0] = "000000"; K[1] = PaiDing(T, 0, 0, 0, 0, 0, 1, 0, 0, L, H, U, M); str1[1] = "000001"; K[2] = PaiDing(T, 0, 0, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[2] = "000010"; K[3] = PaiDing(T, 0, 0, 0, 0, 1, 1, 0, 0, L, H, U, M); str1[3] = "000011"; K[4] = PaiDing(T, 0, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[4] = "000100"; K[5] = PaiDing(T, 0, 0, 0, 1, 0, 1, 0, 0, L, H, U, M); str1[5] = "000101"; K[6] = PaiDing(T, 0, 0, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[6] = "000110"; K[7] = PaiDing(T, 0, 0, 0, 1, 1, 1, 0, 0, L, H, U, M); str1[7] = "000111"; K[8] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[8] = "001000"; K[9] = PaiDing(T, 0, 0, 1, 0, 0, 1, 0, 0, L, H, U, M); str1[9] = "001001"; K[10] = PaiDing(T, 0, 0, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[10] = "001010"; K[11] = PaiDing(T, 0, 0, 1, 0, 1, 1, 0, 0, L, H, U, M); str1[11] = "001011"; K[12] = PaiDing(T, 0, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[12] = "001100"; K[13] = PaiDing(T, 0, 0, 1, 1, 0, 1, 0, 0, L, H, U, M); str1[13] = "001101"; K[14] = PaiDing(T, 0, 0, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[14] = "001110"; K[15] = PaiDing(T, 0, 0, 1, 1, 1, 1, 0, 0, L, H, U, M); str1[15] = "001111"; K[16] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[16] = "010000"; K[17] = PaiDing(T, 0, 1, 0, 0, 0, 1, 0, 0, L, H, U, M); str1[17] = "010001"; K[18] = PaiDing(T, 0, 1, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[18] = "010010"; K[19] = PaiDing(T, 0, 1, 0, 0, 1, 1, 0, 0, L, H, U, M); str1[19] = "010011"; K[20] = PaiDing(T, 0, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[20] = "010100"; K[21] = PaiDing(T, 0, 1, 0, 1, 0, 1, 0, 0, L, H, U, M); str1[21] = "010101"; K[22] = PaiDing(T, 0, 1, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[22] = "010110"; K[23] = PaiDing(T, 0, 1, 0, 1, 1, 1, 0, 0, L, H, U, M); str1[23] = "010111"; K[24] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[24] = "011000"; K[25] = PaiDing(T, 0, 1, 1, 0, 0, 1, 0, 0, L, H, U, M); str1[25] = "011001"; K[26] = PaiDing(T, 0, 1, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[26] = "011010"; K[27] = PaiDing(T, 0, 1, 1, 0, 1, 1, 0, 0, L, H, U, M); str1[27] = "011011"; K[28] = PaiDing(T, 0, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[28] = "011100"; K[29] = PaiDing(T, 0, 1, 1, 1, 0, 1, 0, 0, L, H, U, M); str1[29] = "011101"; K[30] = PaiDing(T, 0, 1, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[30] = "011110"; K[31] = PaiDing(T, 0, 1, 1, 1, 1, 1, 0, 0, L, H, U, M); str1[31] = "011111"; K[32] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[32] = "100000"; K[33] = PaiDing(T, 1, 0, 0, 0, 0, 1, 0, 0, L, H, U, M); str1[33] = "100001"; K[34] = PaiDing(T, 1, 0, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[34] = "100010"; K[35] = PaiDing(T, 1, 0, 0, 0, 1, 1, 0, 0, L, H, U, M); str1[35] = "100011"; K[36] = PaiDing(T, 1, 0, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[36] = "100100"; K[37] = PaiDing(T, 1, 0, 0, 1, 0, 1, 0, 0, L, H, U, M); str1[37] = "100101"; K[38] = PaiDing(T, 1, 0, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[38] = "100110"; K[39] = PaiDing(T, 1, 0, 0, 1, 1, 1, 0, 0, L, H, U, M); str1[39] = "100111"; K[40] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[40] = "101000"; K[41] = PaiDing(T, 1, 0, 1, 0, 0, 1, 0, 0, L, H, U, M); str1[41] = "101001"; K[42] = PaiDing(T, 1, 0, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[42] = "101010"; K[43] = PaiDing(T, 1, 0, 1, 0, 1, 1, 0, 0, L, H, U, M); str1[43] = "101011"; K[44] = PaiDing(T, 1, 0, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[44] = "101100"; K[45] = PaiDing(T, 1, 0, 1, 1, 0, 1, 0, 0, L, H, U, M); str1[45] = "101101"; K[46] = PaiDing(T, 1, 0, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[46] = "101110"; K[47] = PaiDing(T, 1, 0, 1, 1, 1, 1, 0, 0, L, H, U, M); str1[47] = "101111"; K[48] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M); str1[48] = "110000"; K[49] = PaiDing(T, 1, 1, 0, 0, 0, 1, 0, 0, L, H, U, M); str1[49] = "110001"; K[50] = PaiDing(T, 1, 1, 0, 0, 1, 0, 0, 0, L, H, U, M); str1[50] = "110010"; K[51] = PaiDing(T, 1, 1, 0, 0, 1, 1, 0, 0, L, H, U, M); str1[51] = "110011"; K[52] = PaiDing(T, 1, 1, 0, 1, 0, 0, 0, 0, L, H, U, M); str1[52] = "110100"; K[53] = PaiDing(T, 1, 1, 0, 1, 0, 1, 0, 0, L, H, U, M); str1[53] = "110101"; K[54] = PaiDing(T, 1, 1, 0, 1, 1, 0, 0, 0, L, H, U, M); str1[54] = "110110"; K[55] = PaiDing(T, 1, 1, 0, 1, 1, 1, 0, 0, L, H, U, M); str1[55] = "110111"; K[56] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M); str1[56] = "111000"; K[57] = PaiDing(T, 1, 1, 1, 0, 0, 1, 0, 0, L, H, U, M); str1[57] = "111001";K[58] = PaiDing(T, 1, 1, 1, 0, 1, 0, 0, 0, L, H, U, M); str1[58] = "111010";K[59] = PaiDing(T, 1, 1, 1, 0, 1, 1, 0, 0, L, H, U, M); str1[59] = "111011";K[60] = PaiDing(T, 1, 1, 1, 1, 0, 0, 0, 0, L, H, U, M); str1[60] = "111100";K[61] = PaiDing(T, 1, 1, 1, 1, 0, 1, 0, 0, L, H, U, M); str1[61] = "111101";K[62] = PaiDing(T, 1, 1, 1, 1, 1, 0, 0, 0, L, H, U, M); str1[62] = "111110";K[63] = PaiDing(T, 1, 1, 1, 1, 1, 1, 0, 0, L, H, U, M); str1[63] = "111111";Z = Min(K);int j = 0;for (int i = 0; i < N; i++){if (K[i] == Z)j = i;}str = str1[j];}return str;}public static int YM(int[,] T, int[] M, int U,int Z, int L,int H)//T为a传ä?入¨?的Ì?矩?阵¨®V为a记?录?所¨´求¨®解a的Ì?值¦ÌM目?标À¨º函¡¥数ºy的Ì?数ºy组Á¨¦//U变À?元a的Ì?个?数ºyZ为a最Á?优®?值¦Ì{if(U==3){int N = 8;int[] K = new int[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M);K[1] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M);K[2] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M);K[3] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M);K[4] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M);K[5] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M);K[6] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M);K[7] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M);Z = Max(K);}if (U == 4){int N = 16;int[] K = new int[N];K[0] = PaiDing(T, 0, 0, 0, 0, 0, 0, 0, 0, L, H, U, M);K[1] = PaiDing(T, 0, 0, 0, 1, 0, 0, 0, 0, L, H, U, M);K[2] = PaiDing(T, 0, 0, 1, 0, 0, 0, 0, 0, L, H, U, M);K[3] = PaiDing(T, 0, 0, 1, 1, 0, 0, 0, 0, L, H, U, M);K[4] = PaiDing(T, 0, 1, 0, 0, 0, 0, 0, 0, L, H, U, M);K[5] = PaiDing(T, 0, 1, 0, 1, 0, 0, 0, 0, L, H, U, M);K[6] = PaiDing(T, 0, 1, 1, 0, 0, 0, 0, 0, L, H, U, M);K[7] = PaiDing(T, 0, 1, 1, 1, 0, 0, 0, 0, L, H, U, M);K[8] = PaiDing(T, 1, 0, 0, 0, 0, 0, 0, 0, L, H, U, M);K[9] = PaiDing(T, 1, 0, 0, 1, 0, 0, 0, 0, L, H, U, M);K[10] = PaiDing(T, 1, 0, 1, 0, 0, 0, 0, 0, L, H, U, M);K[11] = PaiDing(T, 1, 0, 1, 1, 0, 0, 0, 0, L, H, U, M);K[12] = PaiDing(T, 1, 1, 0, 0, 0, 0, 0, 0, L, H, U, M);K[13] = PaiDing(T, 1, 1, 0, 1, 0, 0, 0, 0, L, H, U, M);K[14] = PaiDing(T, 1, 1, 1, 0, 0, 0, 0, 0, L, H, U, M);K[15] = PaiDing(T, 1, 1, 1, 1, 0, 0, 0, 0, L, H, U, M);Z = Max(K);}。
0—1型整数规划问题的求解方法0-1型整数规划问题是一类特殊的整数规划问题,其中变量只能取0或1,即变量是二进制的。
这类问题在实际应用中具有广泛的应用,如装配线平衡、员工调度、货物装载等。
求解0-1型整数规划问题可以使用多种方法,下面将介绍几种常用的方法。
1.枚举法:枚举法是最朴素的解法,它列举出了所有可能解,并通过穷举所有解的方式找到最优解。
这种方法适用于问题规模较小且没有明显的约束条件,但对于大规模问题不适用。
2.分支定界法:分支定界法是一种广泛应用于整数规划的方法。
它从原问题形成一个目标函数较小的松弛问题开始,通过分支操作将问题分解为一系列子问题,每次选择一个变量分支,并根据问题的特性设置相应的约束条件。
通过逐步分解问题,最终获得最优解。
3.动态规划法:动态规划法通过构建状态转移方程的方式,将问题分解为多个子问题,并利用子问题之间的关系求解最优解。
对于0-1型整数规划问题,可以使用动态规划来解决。
首先定义一个二维数组dp[i][j],其中dp[i][j]表示在前i个物品中选择一些物品放入背包容量为j的情况下的最大价值。
然后根据背包容量逐步求解,最后得到最优解。
4.启发式算法:启发式算法是一类基于经验和直觉的算法,通过评估当前解的优劣性来寻找最优解。
对于0-1型整数规划问题,可以使用启发式算法如遗传算法、模拟退火算法、粒子群算法等进行求解。
这些算法通过随机和逐步优化的方式,可以在较短时间内找到较好的解。
以上是常用的几种0-1型整数规划问题的求解方法,根据问题的规模、约束条件和求解的要求选择合适的方法。
在实际应用中,通常会根据问题的特性选择相应的算法,并结合数学模型和计算机编程进行求解。
枚举算法及程序实现枚举算法是一种解决问题的方法,通过枚举所有可能的解决方案来找到最优解。
它通常用于解决那些问题的解空间相对较小的情况,因为枚举算法需要穷举所有可能的解决方案,时间复杂度较高。
枚举算法的基本思想是从可能的解空间中逐个取出可能的解进行验证,直至找到满足问题要求的解或者枚举完所有可能的解为止。
下面将介绍一些常见的枚举算法及其程序实现。
一、全排列算法全排列算法用于解决“给定n个元素,将其排列成一行”这类问题。
其基本思想是采用递归的方式,每次固定一个元素,然后对剩余的元素进行全排列,最后得到所有可能的排列。
伪代码如下:```void permute(int[] nums, int start, List<List<Integer>> result)if (start == nums.length - 1)List<Integer> permutation = new ArrayList<>(;for (int num : nums)permutation.add(num);}result.add(permutation);} elsefor (int i = start; i < nums.length; i++)swap(nums, start, i);permute(nums, start + 1, result);swap(nums, start, i); // 回溯}}void swap(int[] nums, int i, int j)int temp = nums[i];nums[i] = nums[j];nums[j] = temp;```该算法的时间复杂度为O(n!)。
二、子集枚举算法子集枚举算法用于解决“对于给定的n个元素,找出其所有可能的子集”这类问题。
基本思想是通过逐个选取元素的方式,得到所有可能的子集。
伪代码如下:void subsets(int[] nums, List<List<Integer>> result)int n = nums.length;for (int i = 0; i < (1 << n); i++)List<Integer> subset = new ArrayList<>(;for (int j = 0; j < n; j++)if ((i & (1 << j)) != 0)subset.add(nums[j]);}}result.add(subset);}```该算法的时间复杂度为O(2^n)。
0–1型整数规划的解法
解0-1 型整数规划最容易想到的方法,和一般整数规划的情形一样,就是穷举法,即检查变量取值为0 或1 的每一种组合,比较目标函数值以求得最优解,这就需要检查变量取值的2的n次方个组合。
对于变量个数n 较大(例如
n>100),这几乎是不可能的。
因此常设计一些方法,只检查变量取值的组合的一部分,就能求到问题的最优解。
这样的方法称为隐枚举法(implicit enumeration ),分枝定界法也是一种隐枚举法。
当然,对有些问题隐枚举法并不适用,所以有时穷举法还是必要的。
下面举例说明一种解0-1 型整数规划的隐枚举法。
求解思路及改进措施:
(i )先试探性求一个可行解,易看出满足约束条件,故为一
个可行解,且z=3。
(ii )因为是求极大值问题,故求最优解时,凡是目标值z<3 的解不必检验是否满足约束条件即可删除,因它肯定不是最优解,于是应增加一个约束条件(目标值下界).
(iii )改进过滤条件。
(iv )由于对每个组合首先计算目标值以验证过滤条件,故应优先计算目标值z 大的组合,这样可提前抬高过滤门槛,以减少计算量。