hdu 5017 模擬退火求最值

2021-07-05 08:31:22 字數 1703 閱讀 6558

題意:

給乙個橢圓:

然後求原點到這個橢圓距離最小的點的距離是多少。

解析:依舊用模擬退火。

修改了乙個地方,初始溫度從100改到了1,就行了。

之前的也修改了。

選z的時候,選離遠點近的那個點就行了。

**:

#pragma comment(linker, "/stack:1677721600")

#include #include #include #include #include #include #include #include #include #include #include #include #include #define pb push_back

#define mp make_pair

#define ll long long

#define lson lo,mi,rt<<1

#define rson mi+1,hi,rt<<1|1

#define min(a,b) ((a)

#define max(a,b) ((a)>(b)?(a):(b))

#define mem(a,b) memset(a,b,sizeof(a))

#define fin freopen("in.txt", "r", stdin)

#define fout freopen("out.txt", "w", stdout)

#define rep(i,a,b) for(int i=(a); i<=(b); i++)

#define dec(i,a,b) for(int i=(a); i>=(b); i--)

using namespace std;

const int mod = 1e9 + 7;

const double ee = exp(1.0);

const int inf = 0x3f3f3f3f;

const int maxn = 1e6 + 10;

const double pi = acos(-1.0);

const ll iinf = 0x3f3f3f3f3f3f3f3f;

int readt()

const double eps = 1e-8; //搜尋停止條件

const double delta = 0.98; //溫度下降速度

const int initt = 1; //初始溫度

int dir[2] = , , , };

// , , ,

double a, b, c, d, e, f;

struct point

point(double _x, double _y, double _z)

};double dist(point a)

double getz(double x, double y)

double z1 = (-b + sqrt(delta)) / 2 / a;

double z2 = (-b - sqrt(delta)) / 2 / a;

double res = (fabs(z1) < fabs(z2)) ? z1 : z2;

return res;

}double solve()}}

t *= delta;

}return ans;

}int main()

return 0;

}

HDU 5017 模擬退火

一步一步慢慢學習 模擬退火 好 include include include include include using namespace std const int n 30 5 double a,b,c,d,e,f double dist double x,double y,double z...

hdu 5017 Ellipsoid 模擬退火

hdu 5017 ellipsoid 給定乙個三維空間的橢球面方程,求橢球面上的點到原點 0,0,0 的最小距離。可以發現,橢球面上到原點的距離,具有乙個極大值點和乙個極小值點。用模擬退火的方法可以近似搜尋到全域性最小。這裡因為只有乙個極小值點,所以這裡也不需要以一定概率接受比當前更差的解了。可以說...

模擬退火演算法實現尋找函式最值

模擬退火的演算法思想 模擬退火演算法從某一較高初溫出發,伴隨溫度引數的不斷下降,結合概率突跳特性在解空間中隨機尋找目標函式的全域性最優解,即在區域性最優解能概率性地跳出並最終趨於全域性最優。模擬退火演算法模板 初始溫度 t 100 冷卻速率 rate 0.99 while t 1 隨機生成乙個解 x...