石家庄各区划分图:哪位能帮我把这个c#程序转化为c++的?

来源:百度文库 编辑:神马品牌网 时间:2024/04/29 15:10:59
using System;

namespace SimulateAnnealing

{

class Class1

{

// 要求最优值的目标函数

static double ObjectFunction( double x, double y )

{

double z = 0.0;

z = 5.0 * Math.Sin(x*y) + x*x + y*y;

return z;

}

[STAThread]

static void Main(string[] args)

{

// 搜索的最大区间

const double XMAX = 4;

const double YMAX = 4;

// 冷却表参数

int MarkovLength = 10000; // 马可夫链长度

double DecayScale = 0.95; // 衰减参数

double StepFactor = 0.02; // 步长因子

double Temperature = 100; // 初始温度

double Tolerance = 1e-8; // 容差

double PreX,NextX; // prior and next value of x

double PreY,NextY; // prior and next value of y

double PreBestX, PreBestY; // 上一个最优解

double BestX,BestY; // 最终解

double AcceptPoints = 0.0; // Metropolis过程中总接受点

Random rnd = new Random();

// 随机选点

PreX = -XMAX * rnd.NextDouble() ;

PreY = -YMAX * rnd.NextDouble();

PreBestX = BestX = PreX;

PreBestY = BestY = PreY;

// 每迭代一次退火一次(降温), 直到满足迭代条件为止

do

{

Temperature *=DecayScale;

AcceptPoints = 0.0;

// 在当前温度T下迭代loop(即MARKOV链长度)次

for (int i=0;i<MarkovLength;i++)

{

// 1) 在此点附近随机选下一点

do

{

NextX = PreX + StepFactor*XMAX*(rnd.NextDouble()-0.5);

NextY = PreY + StepFactor*YMAX*(rnd.NextDouble()-0.5);

}

while ( !(NextX >= -XMAX && NextX <= XMAX && NextY >= -YMAX && NextY <= YMAX) );

// 2) 是否全局最优解

if (ObjectFunction(BestX,BestY) > ObjectFunction(NextX,NextY))

{

// 保留上一个最优解

PreBestX =BestX;

PreBestY = BestY;

// 此为新的最优解

BestX=NextX;

BestY=NextY;

}

// 3) Metropolis过程

if( ObjectFunction(PreX,PreY) - ObjectFunction(NextX,NextY) > 0 )

{

// 接受, 此处lastPoint即下一个迭代的点以新接受的点开始

PreX=NextX;

PreY=NextY;

AcceptPoints++;

}

else

{

double change = -1 * ( ObjectFunction(NextX,NextY) - ObjectFunction(PreX,PreY) ) / Temperature ;

if( Math.Exp(change) > rnd.NextDouble() )

{

PreX=NextX;

PreY=NextY;

AcceptPoints++;

}

// 不接受, 保存原解

}

}

Console.WriteLine("{0},{1},{2},{3}",PreX, PreY, ObjectFunction ( PreX, PreY ), Temperature);

}while( Math.Abs( ObjectFunction( BestX,BestY) – ObjectFunction (PreBestX, PreBestY)) > Tolerance );

Console.WriteLine("最小值在点:{0},{1}",BestX, BestY);

Console.WriteLine( "最小值为:{0}",ObjectFunction(BestX, BestY) );

}

}

}

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
static double ObjectFunction( double x, double y )
{
double z = 0.0;
z = 5.0 * sin(x*y) + x*x + y*y;
return z;
}

void main()
{
// 搜索的最大区间
const double XMAX = 4;
const double YMAX = 4;
// 冷却表参数
int MarkovLength = 10000; // 马可夫链长度
double DecayScale = 0.95; // 衰减参数
double StepFactor = 0.02; // 步长因子
double Temperature = 100; // 初始温度
double Tolerance = 1e-8; // 容差
double PreX,NextX; // prior and next value of x
double PreY,NextY; // prior and next value of y
double PreBestX, PreBestY; // 上一个最优解
double BestX,BestY; // 最终解
double AcceptPoints = 0.0; // Metropolis过程中总接受点
// 随机选点
PreX = -XMAX * rand()*1.0/RAND_MAX;
PreY = -YMAX * rand()*1.0/RAND_MAX;
PreBestX = BestX = PreX;
PreBestY = BestY = PreY;
// 每迭代一次退火一次(降温), 直到满足迭代条件为止
do
{
Temperature *=DecayScale;
AcceptPoints = 0.0;
// 在当前温度T下迭代loop(即MARKOV链长度)次
for (int i=0;i<MarkovLength;i++)
{
// 1) 在此点附近随机选下一点
do
{
NextX = PreX + StepFactor*XMAX*(rand()*1.0/RAND_MAX-0.5);
NextY = PreY + StepFactor*YMAX*(rand()*1.0/RAND_MAX-0.5);
}
while ( !(NextX >= -XMAX && NextX <= XMAX && NextY >= -YMAX && NextY <= YMAX) );
// 2) 是否全局最优解
if (ObjectFunction(BestX,BestY) > ObjectFunction(NextX,NextY))
{
// 保留上一个最优解
PreBestX =BestX;
PreBestY = BestY;
// 此为新的最优解
BestX=NextX;
BestY=NextY;
}
// 3) Metropolis过程
if( ObjectFunction(PreX,PreY) - ObjectFunction(NextX,NextY) > 0 )
{
// 接受, 此处lastPoint即下一个迭代的点以新接受的点开始
PreX=NextX;
PreY=NextY;
AcceptPoints++;
}
else
{
double change = -1 * ( ObjectFunction(NextX,NextY) - ObjectFunction(PreX,PreY) ) / Temperature ;
if(exp(change) > rand()*1.0/RAND_MAX )
{
PreX=NextX;
PreY=NextY;
AcceptPoints++;
}
// 不接受, 保存原解
}
}
printf("%lf,%lf,%lf,%lf\n",PreX, PreY, ObjectFunction ( PreX, PreY ), Temperature);
}while( fabs( ObjectFunction( BestX,BestY)-ObjectFunction (PreBestX, PreBestY)) > Tolerance );
printf("最小值在点:%lf,%lf",BestX, BestY);
printf("最小值为:%lf",ObjectFunction(BestX, BestY) );
}
//最小值在点:-1.076698,1.076727最小值为:-2.264017