线性规划_铁人三项
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=0;i<2*M+3;i++)
{
if((c[i]>0)&&(c[i]>c[K]))
max=i;
else if((c[i]<0)||(c[i]==0))
count1++;
}
K=max;
定位第R行,在第K列中找出 的元素,并且对比 的值,得到最小值,并定位该最小值对应的行,该行即为所求的第R行,具体代码实现如下:
printf(" %7.4lf %7.4lf %7.4lf\n",v[i][0],v[i][1],v[i][2]);
printf("请输入想要获取方案的运动员编号:");
scanf("%d",&N);
其中,M为输入的运动员个数。速度读取后,便进行起始矩阵的建立,第一行为模型中的人工变量 ,剩下的M行,2*M+3列为模型中的约束矩阵,最后一列为b,即约束方程中的 ,将起始矩阵输出如下:
{
a[i][j]=1.0/v[i][j]-1.0/v[N-1][j];
b[i]+=1.0/v[N-1][j]-1.0/v[i][j];
}
}
3.2
程序设计时,把定位转轴元,即定位第K列旋转列和第R行旋转行,单独定义了一个函数。
定位第K列,通过求第一列人工变量中的最大值来得到,通过一个int型变量来记录该列,具体代码实现如下:
因此,整个程序的时间复杂度大约是M3数量级。
printf("读取的运动员速度如下(从上到下顺序读取):\n");
fin = fopen("v.txt","r");
for(i=0;i<M;i++)
fscanf(fin,"%lf %lf %lf", &v[i][0], &v[i][1], &v[i][2]);
fclose(fin);
for(i=0;i<M;i++)
1
铁人三项比赛,给出n个人进行每一项的速度 (i=1,2,…,n表示参赛选手;j=1,2,3表示三个项目),对每个人进行判断,通过改变3项比赛的路程,能否得到该人获胜的方案。
2
通过以上描述可知,只需要得到对于每个人是否存在让其获胜的方案,并不需要得到具体的方案,也不需要得到最优的方案,则在线性规划中只需要得到可行解,并不要求得到最优解。
为解决问题,除了已给出的 外,另设每个项目的路程为 。此处使用单纯形中的两阶段法,因此,引入人工变量 ,然而我们并不需要把该问题完全解出来,只需要进行第一阶段即可,通过第一阶段结束后判断 是否为0,即可判断是否存在题中所求的方案,线性规划表示如下。
3
3.1
将运动员的速度存储在一个txt文件中,通过输入函数来读入速度,并通过用户输入,决定选择几个运动员进行规划以及想要得到哪个运动员获胜的方案是否存在,具体代码实现如下:
for(j=0;j<=2*M+3;j++)
a[R][j]=a[R][j]/a[R][K];
for(iຫໍສະໝຸດ Baidu0;i<M;i++)
{
for(j=0;j<=2*M+3;j++)
{
if(i!=R)
a[i][j]=a[i][j]-a[i][K]*a[R][j];
else
continue;
}
}
4
主函数调用了一次输入函数,调用了M次定位转轴元函数和进基出基函数。其中,初始化a[i][j]数组的时间复杂度是M2数量级,对人工变量的初始化操作时间复杂度也是M2数量级;在寻找转轴元函数中的操作的时间复杂度都是M数量级;进基出基函数进行行变换的时间复杂度是M2数量级。
for(i=0;i<M;i++)
{
if(a[i][K]>0)
th[i]=b[i]/a[i][K];
}
for(min=i=0;i<M;i++)
{
if(th[i+1]<th[i])
min=i+1;
}
R=min;
3.3
将进基出基操作定义为一个函数,其中进基和出基的列是由K和R决定的。 中第K列进基,即 ,对于出基的列,是基中的第R列,而不是 中第R列。第R行都除以a[R][K],其他所有行a[i][j]=a[i][j]-a[i][K]*a[R][j],具体代码实现如下:
此处输出的矩阵第一行已做预处理,即将第一行与下所有行进行相加,为使得第一行中人工变量对应的元素变为0。
其中,关键的是 和 的计算,要根据用户输入的N,即要得到第N个运动员获胜的方案是否存在,进行不同的计算,主要体现在计算公式中数组下标的变换,具体代码实现如下:
for(i=0;i<M;i++)
{
for(j=0;j<3;j++)
{
if((c[i]>0)&&(c[i]>c[K]))
max=i;
else if((c[i]<0)||(c[i]==0))
count1++;
}
K=max;
定位第R行,在第K列中找出 的元素,并且对比 的值,得到最小值,并定位该最小值对应的行,该行即为所求的第R行,具体代码实现如下:
printf(" %7.4lf %7.4lf %7.4lf\n",v[i][0],v[i][1],v[i][2]);
printf("请输入想要获取方案的运动员编号:");
scanf("%d",&N);
其中,M为输入的运动员个数。速度读取后,便进行起始矩阵的建立,第一行为模型中的人工变量 ,剩下的M行,2*M+3列为模型中的约束矩阵,最后一列为b,即约束方程中的 ,将起始矩阵输出如下:
{
a[i][j]=1.0/v[i][j]-1.0/v[N-1][j];
b[i]+=1.0/v[N-1][j]-1.0/v[i][j];
}
}
3.2
程序设计时,把定位转轴元,即定位第K列旋转列和第R行旋转行,单独定义了一个函数。
定位第K列,通过求第一列人工变量中的最大值来得到,通过一个int型变量来记录该列,具体代码实现如下:
因此,整个程序的时间复杂度大约是M3数量级。
printf("读取的运动员速度如下(从上到下顺序读取):\n");
fin = fopen("v.txt","r");
for(i=0;i<M;i++)
fscanf(fin,"%lf %lf %lf", &v[i][0], &v[i][1], &v[i][2]);
fclose(fin);
for(i=0;i<M;i++)
1
铁人三项比赛,给出n个人进行每一项的速度 (i=1,2,…,n表示参赛选手;j=1,2,3表示三个项目),对每个人进行判断,通过改变3项比赛的路程,能否得到该人获胜的方案。
2
通过以上描述可知,只需要得到对于每个人是否存在让其获胜的方案,并不需要得到具体的方案,也不需要得到最优的方案,则在线性规划中只需要得到可行解,并不要求得到最优解。
为解决问题,除了已给出的 外,另设每个项目的路程为 。此处使用单纯形中的两阶段法,因此,引入人工变量 ,然而我们并不需要把该问题完全解出来,只需要进行第一阶段即可,通过第一阶段结束后判断 是否为0,即可判断是否存在题中所求的方案,线性规划表示如下。
3
3.1
将运动员的速度存储在一个txt文件中,通过输入函数来读入速度,并通过用户输入,决定选择几个运动员进行规划以及想要得到哪个运动员获胜的方案是否存在,具体代码实现如下:
for(j=0;j<=2*M+3;j++)
a[R][j]=a[R][j]/a[R][K];
for(iຫໍສະໝຸດ Baidu0;i<M;i++)
{
for(j=0;j<=2*M+3;j++)
{
if(i!=R)
a[i][j]=a[i][j]-a[i][K]*a[R][j];
else
continue;
}
}
4
主函数调用了一次输入函数,调用了M次定位转轴元函数和进基出基函数。其中,初始化a[i][j]数组的时间复杂度是M2数量级,对人工变量的初始化操作时间复杂度也是M2数量级;在寻找转轴元函数中的操作的时间复杂度都是M数量级;进基出基函数进行行变换的时间复杂度是M2数量级。
for(i=0;i<M;i++)
{
if(a[i][K]>0)
th[i]=b[i]/a[i][K];
}
for(min=i=0;i<M;i++)
{
if(th[i+1]<th[i])
min=i+1;
}
R=min;
3.3
将进基出基操作定义为一个函数,其中进基和出基的列是由K和R决定的。 中第K列进基,即 ,对于出基的列,是基中的第R列,而不是 中第R列。第R行都除以a[R][K],其他所有行a[i][j]=a[i][j]-a[i][K]*a[R][j],具体代码实现如下:
此处输出的矩阵第一行已做预处理,即将第一行与下所有行进行相加,为使得第一行中人工变量对应的元素变为0。
其中,关键的是 和 的计算,要根据用户输入的N,即要得到第N个运动员获胜的方案是否存在,进行不同的计算,主要体现在计算公式中数组下标的变换,具体代码实现如下:
for(i=0;i<M;i++)
{
for(j=0;j<3;j++)