/* 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的更多相关文章

  1. 多目标遗传算法 ------ NSGA-II (部分源码解析)介绍

    NSGA(非支配排序遗传算法).NSGA-II(带精英策略的快速非支配排序遗传算法),都是基于遗传算法的多目标优化算法,是基于pareto最优解讨论的多目标优化. 在官网: http://www.ii ...

  2. 多目标遗传算法 ------ NSGA-II (部分源码解析) 交叉操作 crossover.c

    遗传算法中的交叉操作是 对NSGA-II  源码分析的  最后一部分, 这一部分也是我 从读该算法源代码和看该算法论文理解偏差最大的  函数模块. 这里,首先提一下,遗传算法的  交叉操作.变异操作都 ...

  3. 多目标遗传算法 ------ NSGA-II (部分源码解析)状态报告 打印 report.c

    /* Routines for storing population data into files */ # include <stdio.h> # include <stdlib ...

  4. 多目标遗传算法 ------ NSGA-II (部分源码解析) 拥挤距离计算 crowddist.c

    /* Crowding distance computation routines */ # include <stdio.h> # include <stdlib.h> # ...

  5. 多目标遗传算法 ------ NSGA-II (部分源码解析)README 算法的部分英文解释

    This is the Readme file for NSGA-II code. About the Algorithm--------------------------------------- ...

  6. 多目标遗传算法 ------ NSGA-II (部分源码解析) 实数、二进制编码的变异操作 mutation.c

    遗传算法的变异操作 /* Mutation routines */ # include <stdio.h> # include <stdlib.h> # include < ...

  7. 多目标遗传算法 ------ NSGA-II (部分源码解析)两个个体支配判断 dominance.c

    /* Domination checking routines */ # include <stdio.h> # include <stdlib.h> # include &l ...

  8. 多目标遗传算法 ------ NSGA-II (部分源码解析)二元锦标赛选择 tourselect.c

    tourselect.c  文件中共有两个函数: selection (population *old_pop, population *new_pop) individual* tournament ...

  9. 多目标遗传算法 ------ NSGA-II (部分源码解析) 临时种群生成新父代种群 fillnds.c

    /* Nond-domination based selection routines */ # include <stdio.h> # include <stdlib.h> ...

随机推荐

  1. 阅读<构建之法>第10、11、12章

    第10章 典型用户和场景 10.2 规格说明书 10.3 功能驱动的设计 问题:怎样写好spec?功能驱动设计的功能设计阶段怎样实现一个具体的功能? 第11章 软件设计与实现 11.2开发阶段的日常管 ...

  2. Linux入门笔记

    1.Linux常用快捷键 按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s  暂停当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl ...

  3. 06-java学习-方法的学习

    方法定义 方法类型 方法涉及的知识: 修饰符.返回类型,命名规则,参数列表 方法常见错误 方法概念的深入理解 为什么会有方法? 方法帮助解决哪些问题? 方法可以简化复杂问题的解决

  4. react 动态获取数据

    如果reander()里面的dom元素是动态获取的,就要将函数放到setSTATE()里面执行

  5. shell脚本第一课

    shell脚本的文件名一般是以.sh结尾,也可以以其他格式如.txt,甚至不加后缀. 脚本的第一行的#!/bin/bash表示指定脚本执行时的解析器. #!/bin/bash #文件名:test.sh ...

  6. [转帖]以Windows服务方式运行.NET Core程序

    以Windows服务方式运行.NET Core程序 原作者blog:https://www.cnblogs.com/guogangj/p/10093102.html 里面使用了NSSM 工具 但是自己 ...

  7. Linux下安装oracle的过程

    1. Linux 安装 主要不要将home分区设置的特别大 2. 安装必须的一些包. yum install -y \ binutils.x86_64 \ elfutils-libelf-devel. ...

  8. 在保存Bitmap的时候出现“GDI出现一般性错误”

    今天开发的时候出现过一个非常奇怪的问题,在保存最终的Bitmap图片的时候,明明使用Directory.Exist(filePath)函数判断当前路径的时候,这些路径都是有用的并且都是合法的,但是就是 ...

  9. spring学习总结(一)_Ioc基础(上)

    最近经历了许许多多的事情,学习荒废了很久.自己的目标成了摆设.现在要奋起直追了.最近发现了张果的博客.应该是一个教师.看了他写的spring系列的博客,写的不错.于是本文的内容参考自他的博客,当然都是 ...

  10. Highcharts之折线图

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...