題意:
給乙個橢圓:
然後求原點到這個橢圓距離最小的點的距離是多少。
解析:依舊用模擬退火。
修改了乙個地方,初始溫度從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...