cf2c(シミュレーテッドアニーリングステップサイズ制御

https://www.luogu.org/problem/CF2C

問題の意味:3は、3つの円の接線角度の上面を与えるために必要と同等の共通円、なし平面部です。答えは条件を満たすようにされていない場合は(、印刷されません。

アイデア:シミュレーテッドアニーリングアルゴリズムは、解答のポイントを列挙するために使用することができ、持っていたことができ、しかし、正の解すべきではありません。まず、最適解と初期の段階を設定し、その溶液は、答えを更新することができない場合は、ステップサイズが半分になり、最適な答えを更新してから、アルゴリズムの精度要件の終わりまで検索するために、現在のステップの検索を続行します。

#include <cstdioを> 
する#include <cmath> 
CONST =ダブルEPS-1E 5; //制御精度
のstruct {ポイント
    ダブルX、Y、
    ダブルR&LT; 
}のP [3]; 
ダブル取得(ダブルX、Yダブル、ポイントCONST B){// 2点間の距離を見つける
    ((xb.x)*(xb.x)+(yb.y)*(yb.y))SQRTを返す; 
} 
ダブルチェック(ダブルX、Yダブル) {//評価関数
    ダブルT [3]、[デルタ 3]、RET = 0.0; // T 現在の視点のためには、デルタエラー値表す
    ために(INT I = 0;私は<3; ++ I)
        T [I] =(X、Y、P [I])/ P [I] .R取得し; 
    (; I <3; I = 0をint型Iは++)のために{ 
        デルタ[I] = T [I] -t [(Iは+ +1)%3]; 
        RET =デルタ+ [I] *デルタ[I]; 
    } 
    戻りRET; //戻り誤差二乗和
} 
int型のmain(){  
    BOOLマーク。
    ダブルX = 0.0、Y = 0.0。
    {(; I <3。++ Iは、I = 0の整数)のための
        scanfの( "%LFの%のLFの%のLF"、&P [I] .X、&P [I]・Y、&P [I]は.R); 
        X + P = [I] .X / 3; 
        Y = P + [I]・Y / 3; //セット3ラウンド心臓形成される三角形の近似解の重心
    } 
    (ダブルT = 1.0、デルタ; T> EPS ;){//初期ステップサイズ1 
        マーク= 0; //タグ探索
        デルタ=チェック(X、Y); 
        IF(チェック(X + T、Y)<デルタ){//よりよいソリューションを検索
            X + = T ; 
            マーク= 1; 
        } 
        そうでなければ(チェック(XT、Y)<デルタ){IF 
            X- = T; マルコ= 1; 
        } 
        そうIF(チェック(X、Y + T)<デルタ){ 
            Y + = T、
            マーク= 。1; 
        }
        {他(チェック(X、YT)<デルタ)IF
            T = Y-; 
            マーク= 1; 
        } 
        //検索ステップサイズより小さい場合(マーク!)は、
            T / 2 =; 
    } 
    IF(FABS(チェック(X、Y))<EPS)//空
        のprintf(「% %.5lf .5lf」、X、Y); 
    戻り0; 
}

 

おすすめ

転載: www.cnblogs.com/wzgg/p/11518734.html