x=4.0时,为什么4*x>16 在循环里面结果总是为随机的?有时候为TRUE?
邪门了,我好歹也写了5年多的C代码了,怎么这个问题今天搞了一晚上还是没有搞明白啊?
留下邮箱,我把工程代码发给你,帮我调调,谢谢。
/*
* 函数说明:开始搜索过程
* 输入:x1,x2的范围和结果输出指针
* 本函数对于x1和x2的搜索间隔都使用interval,实际使用中可以对x1,x2都单独创建搜索间隔
* 输出:如果返回false,则说明没有找到一个合适约束条件的值,否则则求出该范围内的最合适的值。
*/
BOOL CSimplexDlg::StartSearching(double x1min, double x1max, //x1 range
double x2min, double x2max, //x2 range
double interval, //interval
double * x1Res,double *x2Res, //save x1,x2 fit value
double *maxz) //save result
{
double i,j;
double res;
BOOL finded=FALSE;
double x1,x2,maxres=0.0;
x1=*x1Res;
x2=*x2Res;
//循环检查测试所有约束范围内的值
for(i=x1min;i<=x1max;i=i+interval)
{
for(j=x2min;j<=x2max;j=j+interval)
{
//只对符合约束条件的值进行检测
if (CheckCondition(i,j))
{
res=2.0*i+3.0*j;
//如果当前值计算结果比所有的值都好,则记录下来
if (res>=maxres)
{
x1=i;
x2=j;
maxres=res;
finded=TRUE;
}
}
}
}
//记录结果
if (finded)
{
*x1Res=x1;
*x2Res=x2;
*maxz=maxres;
}
return finded;
}
/*
* 函数说明:约束条件检测
* 输入:x1,x2分别为检测值,本例子为示例程序,约束条件没有化简
* 输出:符合约束条件返回TRUE,otherwise return FALSE;
* 注意点:double类型的相等判断不能使用==,而应该使用fabs(val)<0.000001等自定义的精度。
*/
BOOL CSimplexDlg::CheckCondition(double x, double y)
{
TRACE("\nx=%6.2f,y=%6.2f",x,y);
//保证x1,x2都大于等于0
if (x*y<0.0)
{
TRACE("x*y<0");
return FALSE;
}
//其他各个分限制条件
if ((2*x+2*y)>12.0)
{
TRACE("\nError:(2*%f+2*%f)>12.0",x,y);
return FALSE;
}
if ((x+2*y)>8.0)
{
TRACE("\nError:(%f+2*%f)>8.0",x,y);
return FALSE;
}
if (4*x>16.0)
{
TRACE("\nError:4*%f>16.0",x);
return FALSE;
}
if (4*y>12)
{
TRACE("\nError:4*%f>12",y);
return FALSE;
}
TRACE("\nOK!!!!");
return TRUE;
}
测试条件:
x1: 0~6
x2: 0~4
在间隔为1.0的时候,能得出正确答案:x1=4,x2=2,res=14
在间隔为0.1的时候,得不出正确答案:x1=3.9,x2=2,res=13.8
x1=3.0 ~4.2
x2=1.7~2.2
间隔为1.0 时:得不出正确答案:x1=4,x2=1.7, res=13.1
间隔为0.1时:也得不出正确答案:x1=3.8,x2=2.1, res=13.9
真是邪门了。
留下邮箱,我把工程代码发给你,帮我调调,谢谢。
/*
* 函数说明:开始搜索过程
* 输入:x1,x2的范围和结果输出指针
* 本函数对于x1和x2的搜索间隔都使用interval,实际使用中可以对x1,x2都单独创建搜索间隔
* 输出:如果返回false,则说明没有找到一个合适约束条件的值,否则则求出该范围内的最合适的值。
*/
BOOL CSimplexDlg::StartSearching(double x1min, double x1max, //x1 range
double x2min, double x2max, //x2 range
double interval, //interval
double * x1Res,double *x2Res, //save x1,x2 fit value
double *maxz) //save result
{
double i,j;
double res;
BOOL finded=FALSE;
double x1,x2,maxres=0.0;
x1=*x1Res;
x2=*x2Res;
//循环检查测试所有约束范围内的值
for(i=x1min;i<=x1max;i=i+interval)
{
for(j=x2min;j<=x2max;j=j+interval)
{
//只对符合约束条件的值进行检测
if (CheckCondition(i,j))
{
res=2.0*i+3.0*j;
//如果当前值计算结果比所有的值都好,则记录下来
if (res>=maxres)
{
x1=i;
x2=j;
maxres=res;
finded=TRUE;
}
}
}
}
//记录结果
if (finded)
{
*x1Res=x1;
*x2Res=x2;
*maxz=maxres;
}
return finded;
}
/*
* 函数说明:约束条件检测
* 输入:x1,x2分别为检测值,本例子为示例程序,约束条件没有化简
* 输出:符合约束条件返回TRUE,otherwise return FALSE;
* 注意点:double类型的相等判断不能使用==,而应该使用fabs(val)<0.000001等自定义的精度。
*/
BOOL CSimplexDlg::CheckCondition(double x, double y)
{
TRACE("\nx=%6.2f,y=%6.2f",x,y);
//保证x1,x2都大于等于0
if (x*y<0.0)
{
TRACE("x*y<0");
return FALSE;
}
//其他各个分限制条件
if ((2*x+2*y)>12.0)
{
TRACE("\nError:(2*%f+2*%f)>12.0",x,y);
return FALSE;
}
if ((x+2*y)>8.0)
{
TRACE("\nError:(%f+2*%f)>8.0",x,y);
return FALSE;
}
if (4*x>16.0)
{
TRACE("\nError:4*%f>16.0",x);
return FALSE;
}
if (4*y>12)
{
TRACE("\nError:4*%f>12",y);
return FALSE;
}
TRACE("\nOK!!!!");
return TRUE;
}
测试条件:
x1: 0~6
x2: 0~4
在间隔为1.0的时候,能得出正确答案:x1=4,x2=2,res=14
在间隔为0.1的时候,得不出正确答案:x1=3.9,x2=2,res=13.8
x1=3.0 ~4.2
x2=1.7~2.2
间隔为1.0 时:得不出正确答案:x1=4,x2=1.7, res=13.1
间隔为0.1时:也得不出正确答案:x1=3.8,x2=2.1, res=13.9
真是邪门了。
...全文
相关推荐
Python中for循环和while循环的基本使用方法
例如:```python# 计算1到4之间每个数字的平方squares = [x * x for x in range(1, 5)]print(squares) # 输出 [1, 4, 9, 16]#
unicode编码汉字库(16*16点阵)
Unicode编码下的16*16点阵汉字库(先左后右先上后下),宋体12号或小4字体大小(简体)。取码范围0X4E00-0X9FFF
16*16点阵模块
= 0 && y < 16) { byte address = (y * 16) + x; // 将state设置到对应的存储位置 displayBuffer[address] = state ?
遗传算法求Y=X*X的值
在本问题中,我们使用遗传算法来寻找平方函数Y=X*X的最大值。
16*16点阵汉字库 32*32点阵汉字库
在显示或打印时,系统会根据这些点阵信息点亮或关闭像素,形成完整的汉字图形。HZK16和HZK32文件详解:HZK16和HZK32是两个具体的点阵汉字库文件,分别对应16*16和32*32的点阵格式。


