- 注册时间
- 2009-5-22
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 38578
- 在线时间
- 小时
|
楼主 |
发表于 2010-11-3 00:58:50
|
显示全部楼层
经过随机撒点试验,答案确实会收敛到$18#$的方案去。
代码如下:- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
-
- double xa,ya,xb,yb,tmp,min;
-
- double f() //计算平均距离
- {
- double x,y,a,b,s;
- s=0;
- for(x=1e-4;x<1;x+=2e-3)
- for(y=1e-4;y<1;y+=2e-3)
- {
- a=(x-xa)*(x-xa)+(y-ya)*(y-ya);
- b=(x-xb)*(x-xb)+(y-yb)*(y-yb);
- if(a<b)s+=sqrt(a);
- else s+=sqrt(b);
- }
- return s/25e4;
- }
-
- int main()
- {
- min=1e9;
- while(1) //死循环,不断地随机撒点试验
- {
- xa=rand()/32768.0;
- ya=rand()/32768.0;
- xb=1-xa;
- yb=1-ya;
- tmp=f(); //计算平均距离
- if(tmp<min) //与最优结果比较
- {
- min=tmp; //更新最优结果
- printf("(%lf,%lf),(%lf,%lf): %lf\n",xa,ya,xb,yb,min); //输出当前的最优结果
- }
- }
- return 0;
- }
复制代码 输出如下:- (0.001251,0.563568),(0.998749,0.436432): 0.384276
- (0.193298,0.808716),(0.806702,0.191284): 0.346670
- (0.584991,0.479858),(0.415009,0.520142): 0.334438
- (0.822815,0.746582),(0.177185,0.253418): 0.333470
- (0.710480,0.513519),(0.289520,0.486481): 0.298872
- (0.462067,0.235321),(0.537933,0.764679): 0.297309
- (0.743713,0.468445),(0.256287,0.531555): 0.296855
- (0.747314,0.496887),(0.252686,0.503113): 0.296630
- (0.247711,0.497955),(0.752289,0.502045): 0.296626
- (0.505096,0.749603),(0.494904,0.250397): 0.296623
- (0.502930,0.250977),(0.497070,0.749023): 0.296621
- (0.500458,0.750427),(0.499542,0.249573): 0.296618
复制代码 所以$19#$的疑问已经解开:
$1$. 把车站设在两个等腰三角形的$Fans$心上,答案不优,为$0.301221$。
$2$. 将正方形分成两个直角梯形,分别找这两个直角梯形的$Fans$心,那么当这两个直角梯形退化成矩形时,答案最优,为$0.29662$。
如下图所示:
|
|