多目标遗传算法 ------ NSGA-II (部分源码解析)目标函数 problemdef.c
/* Test problem definitions */ # include <stdio.h>
# include <stdlib.h>
# include <math.h> # include "global.h"
# include "rand.h" # define sch1
/* # define sch2 */
/* # define fon */
/* # define kur */
/* # define pol */
/* # define vnt */
/* # define zdt1 */
/* # define zdt2 */
/* # define zdt3 */
/* # define zdt4 */
/* # define zdt5 */
/* # define zdt6 */
/* # define bnh */
/* # define osy */
/* # define srn */
/* # define tnk */
/* # define ctp1 */
/* # define ctp2 */
/* # define ctp3 */
/* # define ctp4 */
/* # define ctp5 */
/* # define ctp6 */
/* # define ctp7 */
/* # define ctp8 */ /* Test problem SCH1
# of real variables = 1
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef sch1
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[] = pow(xreal[],2.0);
obj[] = pow((xreal[]-2.0),2.0);
return;
}
#endif /* Test problem SCH2
# of real variables = 1
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef sch2
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
if (xreal[]<=1.0)
{
obj[] = -xreal[];
obj[] = pow((xreal[]-5.0),2.0);
return;
}
if (xreal[]<=3.0)
{
obj[] = xreal[]-2.0;
obj[] = pow((xreal[]-5.0),2.0);
return;
}
if (xreal[]<=4.0)
{
obj[] = 4.0-xreal[];
obj[] = pow((xreal[]-5.0),2.0);
return;
}
obj[] = xreal[]-4.0;
obj[] = pow((xreal[]-5.0),2.0);
return;
}
#endif /* Test problem FON
# of real variables = n
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef fon
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double s1, s2;
int i;
s1 = s2 = 0.0;
for (i=; i<nreal; i++)
{
s1 += pow((xreal[i]-(1.0/sqrt((double)nreal))),2.0);
s2 += pow((xreal[i]+(1.0/sqrt((double)nreal))),2.0);
}
obj[] = 1.0 - exp(-s1);
obj[] = 1.0 - exp(-s2);
return;
}
#endif /* Test problem KUR
# of real variables = 3
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef kur
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
int i;
double res1, res2;
res1 = -0.2*sqrt((xreal[]*xreal[]) + (xreal[]*xreal[]));
res2 = -0.2*sqrt((xreal[]*xreal[]) + (xreal[]*xreal[]));
obj[] = -10.0*( exp(res1) + exp(res2));
obj[] = 0.0;
for (i=; i<; i++)
{
obj[] += pow(fabs(xreal[i]),0.8) + 5.0*sin(pow(xreal[i],3.0));
}
return;
}
#endif /* Test problem POL
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef pol
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double a1, a2, b1, b2;
a1 = 0.5*sin(1.0) - 2.0*cos(1.0) + sin(2.0) - 1.5*cos(2.0);
a2 = 1.5*sin(1.0) - cos(1.0) + 2.0*sin(2.0) - 0.5*cos(2.0);
b1 = 0.5*sin(xreal[]) - 2.0*cos(xreal[]) + sin(xreal[]) - 1.5*cos(xreal[]);
b2 = 1.5*sin(xreal[]) - cos(xreal[]) + 2.0*sin(xreal[]) - 0.5*cos(xreal[]);
obj[] = 1.0 + pow((a1-b1),2.0) + pow((a2-b2),2.0);
obj[] = pow((xreal[]+3.0),2.0) + pow((xreal[]+1.0),2.0);
return;
}
#endif /* Test problem VNT
# of real variables = 2
# of bin variables = 0
# of objectives = 3
# of constraints = 0
*/ #ifdef vnt
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[] = 0.5*(xreal[]*xreal[] + xreal[]*xreal[]) + sin(xreal[]*xreal[] + xreal[]*xreal[]);
obj[] = (pow((3.0*xreal[] - 2.0*xreal[] + 4.0),2.0))/8.0 + (pow((xreal[]-xreal[]+1.0),2.0))/27.0 + 15.0;
obj[] = 1.0/(xreal[]*xreal[] + xreal[]*xreal[] + 1.0) - 1.1*exp(-(xreal[]*xreal[] + xreal[]*xreal[]));
return;
}
#endif /* Test problem ZDT1
# of real variables = 30
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef zdt1
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = xreal[];
g = 0.0;
for (i=; i<; i++)
{
g += xreal[i];
}
g = 9.0*g/29.0;
g += 1.0;
h = 1.0 - sqrt(f1/g);
f2 = g*h;
obj[] = f1;
obj[] = f2;
return;
}
#endif /* Test problem ZDT2
# of real variables = 30
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef zdt2
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = xreal[];
g = 0.0;
for (i=; i<; i++)
{
g += xreal[i];
}
g = 9.0*g/29.0;
g += 1.0;
h = 1.0 - pow((f1/g),2.0);
f2 = g*h;
obj[] = f1;
obj[] = f2;
return;
}
#endif /* Test problem ZDT3
# of real variables = 30
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef zdt3
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = xreal[];
g = 0.0;
for (i=; i<; i++)
{
g += xreal[i];
}
g = 9.0*g/29.0;
g += 1.0;
h = 1.0 - sqrt(f1/g) - (f1/g)*sin(10.0*PI*f1);
f2 = g*h;
obj[] = f1;
obj[] = f2;
return;
}
#endif /* Test problem ZDT4
# of real variables = 10
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef zdt4
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = xreal[];
g = 0.0;
for (i=; i<; i++)
{
g += xreal[i]*xreal[i] - 10.0*cos(4.0*PI*xreal[i]);
}
g += 91.0;
h = 1.0 - sqrt(f1/g);
f2 = g*h;
obj[] = f1;
obj[] = f2;
return;
}
#endif /* Test problem ZDT5
# of real variables = 0
# of bin variables = 11
# of bits for binvar1 = 30
# of bits for binvar2-11 = 5
# of objectives = 2
# of constraints = 0
*/ #ifdef zdt5
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
int i, j;
int u[];
int v[];
double f1, f2, g, h;
for (i=; i<; i++)
{
u[i] = ;
}
for (j=; j<; j++)
{
if (gene[][j] == )
{
u[]++;
}
}
for (i=; i<; i++)
{
for (j=; j<; j++)
{
if (gene[i][j] == )
{
u[i]++;
}
}
}
f1 = 1.0 + u[];
for (i=; i<; i++)
{
if (u[i] < )
{
v[i] = + u[i];
}
else
{
v[i] = ;
}
}
g = ;
for (i=; i<; i++)
{
g += v[i];
}
h = 1.0/f1;
f2 = g*h;
obj[] = f1;
obj[] = f2;
return;
}
#endif /* Test problem ZDT6
# of real variables = 10
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/ #ifdef zdt6
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = 1.0 - (exp(-4.0*xreal[]))*pow((sin(4.0*PI*xreal[])),6.0);
g = 0.0;
for (i=; i<; i++)
{
g += xreal[i];
}
g = g/9.0;
g = pow(g,0.25);
g = 1.0 + 9.0*g;
h = 1.0 - pow((f1/g),2.0);
f2 = g*h;
obj[] = f1;
obj[] = f2;
return;
}
#endif /* Test problem BNH
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/ #ifdef bnh
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[] = 4.0*(xreal[]*xreal[] + xreal[]*xreal[]);
obj[] = pow((xreal[]-5.0),2.0) + pow((xreal[]-5.0),2.0);
constr[] = 1.0 - (pow((xreal[]-5.0),2.0) + xreal[]*xreal[])/25.0;
constr[] = (pow((xreal[]-8.0),2.0) + pow((xreal[]+3.0),2.0))/7.7 - 1.0;
return;
}
#endif /* Test problem OSY
# of real variables = 6
# of bin variables = 0
# of objectives = 2
# of constraints = 6
*/ #ifdef osy
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[] = -(25.0*pow((xreal[]-2.0),2.0) + pow((xreal[]-2.0),2.0) + pow((xreal[]-1.0),2.0) + pow((xreal[]-4.0),2.0) + pow((xreal[]-1.0),2.0));
obj[] = xreal[]*xreal[] + xreal[]*xreal[] + xreal[]*xreal[] + xreal[]*xreal[] + xreal[]*xreal[] + xreal[]*xreal[];
constr[] = (xreal[]+xreal[])/2.0 - 1.0;
constr[] = 1.0 - (xreal[]+xreal[])/6.0;
constr[] = 1.0 - xreal[]/2.0 + xreal[]/2.0;
constr[] = 1.0 - xreal[]/2.0 + 3.0*xreal[]/2.0;
constr[] = 1.0 - (pow((xreal[]-3.0),2.0))/4.0 - xreal[]/4.0;
constr[] = (pow((xreal[]-3.0),2.0))/4.0 + xreal[]/4.0 - 1.0;
return;
}
#endif /* Test problem SRN
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/ #ifdef srn
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[] = 2.0 + pow((xreal[]-2.0),2.0) + pow((xreal[]-1.0),2.0);
obj[] = 9.0*xreal[] - pow((xreal[]-1.0),2.0);
constr[] = 1.0 - (pow(xreal[],2.0) + pow(xreal[],2.0))/225.0;
constr[] = 3.0*xreal[]/10.0 - xreal[]/10.0 - 1.0;
return;
}
#endif /* Test problem TNK
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/ #ifdef tnk
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[] = xreal[];
obj[] = xreal[];
if (xreal[] == 0.0)
{
constr[] = -1.0;
}
else
{
constr[] = xreal[]*xreal[] + xreal[]*xreal[] - 0.1*cos(16.0*atan(xreal[]/xreal[])) - 1.0;
}
constr[] = 1.0 - 2.0*pow((xreal[]-0.5),2.0) + 2.0*pow((xreal[]-0.5),2.0);
return;
}
#endif /* Test problem CTP1
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/ #ifdef ctp1
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
g = 1.0 + xreal[];
obj[] = xreal[];
obj[] = g*exp(-obj[]/g);
constr[] = obj[]/(0.858*exp(-0.541*obj[]))-1.0;
constr[] = obj[]/(0.728*exp(-0.295*obj[]))-1.0;
return;
}
#endif /* Test problem CTP2
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/ #ifdef ctp2
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.2*PI;
a = 0.2;
b = 10.0;
c = 1.0;
d = 6.0;
e = 1.0;
g = 1.0 + xreal[];
obj[] = xreal[];
obj[] = g*(1.0 - sqrt(obj[]/g));
exp1 = (obj[]-e)*cos(theta) - obj[]*sin(theta);
exp2 = (obj[]-e)*sin(theta) + obj[]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[] = exp1/exp2 - 1.0;
return;
}
#endif /* Test problem CTP3
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/ #ifdef ctp3
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.2*PI;
a = 0.1;
b = 10.0;
c = 1.0;
d = 0.5;
e = 1.0;
g = 1.0 + xreal[];
obj[] = xreal[];
obj[] = g*(1.0 - sqrt(obj[]/g));
exp1 = (obj[]-e)*cos(theta) - obj[]*sin(theta);
exp2 = (obj[]-e)*sin(theta) + obj[]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[] = exp1/exp2 - 1.0;
return;
}
#endif /* Test problem CTP4
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/ #ifdef ctp4
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.2*PI;
a = 0.75;
b = 10.0;
c = 1.0;
d = 0.5;
e = 1.0;
g = 1.0 + xreal[];
obj[] = xreal[];
obj[] = g*(1.0 - sqrt(obj[]/g));
exp1 = (obj[]-e)*cos(theta) - obj[]*sin(theta);
exp2 = (obj[]-e)*sin(theta) + obj[]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[] = exp1/exp2 - 1.0;
return;
}
#endif /* Test problem CTP5
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/ #ifdef ctp5
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.2*PI;
a = 0.1;
b = 10.0;
c = 2.0;
d = 0.5;
e = 1.0;
g = 1.0 + xreal[];
obj[] = xreal[];
obj[] = g*(1.0 - sqrt(obj[]/g));
exp1 = (obj[]-e)*cos(theta) - obj[]*sin(theta);
exp2 = (obj[]-e)*sin(theta) + obj[]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[] = exp1/exp2 - 1.0;
return;
}
#endif /* Test problem CTP6
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/ #ifdef ctp6
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = 0.1*PI;
a = 40.0;
b = 0.5;
c = 1.0;
d = 2.0;
e = -2.0;
g = 1.0 + xreal[];
obj[] = xreal[];
obj[] = g*(1.0 - sqrt(obj[]/g));
exp1 = (obj[]-e)*cos(theta) - obj[]*sin(theta);
exp2 = (obj[]-e)*sin(theta) + obj[]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[] = exp1/exp2 - 1.0;
return;
}
#endif /* Test problem CTP7
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/ #ifdef ctp7
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.05*PI;
a = 40.0;
b = 5.0;
c = 1.0;
d = 6.0;
e = 0.0;
g = 1.0 + xreal[];
obj[] = xreal[];
obj[] = g*(1.0 - sqrt(obj[]/g));
exp1 = (obj[]-e)*cos(theta) - obj[]*sin(theta);
exp2 = (obj[]-e)*sin(theta) + obj[]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[] = exp1/exp2 - 1.0;
return;
}
#endif /* Test problem CTP8
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/ #ifdef ctp8
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
g = 1.0 + xreal[];
obj[] = xreal[];
obj[] = g*(1.0 - sqrt(obj[]/g));
theta = 0.1*PI;
a = 40.0;
b = 0.5;
c = 1.0;
d = 2.0;
e = -2.0;
exp1 = (obj[]-e)*cos(theta) - obj[]*sin(theta);
exp2 = (obj[]-e)*sin(theta) + obj[]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[] = exp1/exp2 - 1.0;
theta = -0.05*PI;
a = 40.0;
b = 2.0;
c = 1.0;
d = 6.0;
e = 0.0;
exp1 = (obj[]-e)*cos(theta) - obj[]*sin(theta);
exp2 = (obj[]-e)*sin(theta) + obj[]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[] = exp1/exp2 - 1.0;
return;
}
#endif
以上, 为NSGA-II 源码中给出的几个测试函数, 其中无限制条件的测试函数不需解释, 对有限制条件的做一定说明。
根据比对, 可以直到算法中, 将所有的约束条件都转换为 >=0 。
所以, 违反限制条件的 约束函数值 均小于 0 。
TNK 测试函数有一定特殊性, 因为其中存在 无意义的个体, 即 X2 为0 , 这里对该情况下的 约束 函数1 直接赋值为 -1 。
代码,如下:
if (xreal[] == 0.0)
{
constr[] = -1.0;
}
多目标遗传算法 ------ NSGA-II (部分源码解析)目标函数 problemdef.c的更多相关文章
- 多目标遗传算法 ------ NSGA-II (部分源码解析)介绍
NSGA(非支配排序遗传算法).NSGA-II(带精英策略的快速非支配排序遗传算法),都是基于遗传算法的多目标优化算法,是基于pareto最优解讨论的多目标优化. 在官网: http://www.ii ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析) 交叉操作 crossover.c
遗传算法中的交叉操作是 对NSGA-II 源码分析的 最后一部分, 这一部分也是我 从读该算法源代码和看该算法论文理解偏差最大的 函数模块. 这里,首先提一下,遗传算法的 交叉操作.变异操作都 ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析)状态报告 打印 report.c
/* Routines for storing population data into files */ # include <stdio.h> # include <stdlib ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析) 拥挤距离计算 crowddist.c
/* Crowding distance computation routines */ # include <stdio.h> # include <stdlib.h> # ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析)README 算法的部分英文解释
This is the Readme file for NSGA-II code. About the Algorithm--------------------------------------- ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析) 实数、二进制编码的变异操作 mutation.c
遗传算法的变异操作 /* Mutation routines */ # include <stdio.h> # include <stdlib.h> # include < ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析)两个个体支配判断 dominance.c
/* Domination checking routines */ # include <stdio.h> # include <stdlib.h> # include &l ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析)二元锦标赛选择 tourselect.c
tourselect.c 文件中共有两个函数: selection (population *old_pop, population *new_pop) individual* tournament ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析) 临时种群生成新父代种群 fillnds.c
/* Nond-domination based selection routines */ # include <stdio.h> # include <stdlib.h> ...
随机推荐
- Java实现小学四则运算练习系统(UI)
github项目地址 :https://github.com/feser-xuan/Arithmetic_test3_UI 小伙伴的博客链接:http://www.cnblogs.com/fukang ...
- Glace:generator-jhipster, adding User entity enhancement management
https://github.com/jhipster/generator-jhipster/issues/2538 jhipster,很好用的开发工具.国外知名度高,国内未普及,国外大公司在用. j ...
- 面象对象设计原则之二:开放封闭原则(Open-Closed Principle, OCP)
开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则.开闭原则由Bertrand Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed Principle, ...
- windows上面链接使用linux上面的docker daemon
1. 修改linux 上面的 docker的 配置文件. vim /usr/lib/systemd/system/docker.service 注意 这个是centos的路径 发现ubuntu的路径不 ...
- SourceTree 如何下载git 管理的代码-如何创建分支,删除分支,提交代码,回退代码
把用户给的链接拿过来,然后输入浏览器,然后在左侧会有Actions 中有个Clone;点击Clone之后,有个 Clone in Source Tree 点击,打开你的本地Source Tree,然后 ...
- python之OrderedDict类
# OrderedDict类使用举例 # OrderedDict类的使用与字典相似,不同的是OrderedDict类会记录键值对的添加顺序 from collections import Ordere ...
- Lodop图片输出ADD_PRINT_IMAGE 有白边
ADD_PRINT_IMAGE输出图片,如果使用img标签(即超文本<img标签),是超文本,无论是相对路径,网络图片,还是base64,都可能有白边,这可能和超文本解析有关.ADD_PRINT ...
- codeforces1045B
CF1045B 自己瞎鸡巴yy了一下,可知若一个数X不能被表示出来,那么X所有的表示方法都在A集合中,如a1,a2,a3······an-1,an-2中若a1+ai不能被表示出来,那么如果a1到ai是 ...
- Hibernate事务以及一级缓存02
一. Hibernate中的事务 1. 事务的回顾 1.1 什么是事务(Transaction)(面试重点) 是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的 ...
- Sightseeing tour HDU - 1956(混合欧拉回路)
题意: 有n个点,m条边,其中有单向边和双向边,求是否存在欧拉回路 解析: 刚开始想...判断一下每个点的度数不就好了...emm..还是年轻啊.. 判断是解决不了问题的,因为可能会有某两个点冲突,比 ...