Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2012, 15:33   #1
андрей зелиг
Новичок
Джуниор
 
Регистрация: 29.05.2012
Сообщений: 3
По умолчанию Задача о ферзяф алгоритмом отжига

Здраствуйте фуромчане...Передомной стоит задача о размещении 30 ферзей на шафматной доске размером 30*30. Использовать при это мнужно алгорит отжига...Вот немного информации об алгоритме http://www.abashin.ru/conferences/st...Kartashov2.pdf
..Код я взял из книги...тым было описанно всё кроме функций getRand и getsRand....но написано что getRand должно случайно выбирать либо 1 либо 0....всё вроде написал правилно но программа зацикливается=(....помогите плиз.....вот собственно код...
Код:
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<fstream.h>
#include<iostream.h>
#include<iomanip.h>
#include<conio.h>

#define  MAX_LENGTH 30
typedef int solutionType[MAX_LENGTH];
	typedef struct
		{
		 solutionType solution;
		 float energy;
		} memberType;
#define INITIAL_TEMPERATURE  30.0
#define FINAL_TEMPERATURE    0.5
#define ALPHA                0.98
#define STEPS_PER_CHANGE     100

//=============PROTOTYPE============
void tweakSolution(memberType *member);
void initializiSolution(memberType *member);
void computeEnergy(memberType *member);
void copySolution(memberType *dest,memberType *src);
void emitSolution(memberType *member);
int getRand(int t);
int getsRand();
//==================================

int main()
{
 clrscr();
 int timer=0,step,solution=0,useNew,accepted;
 float temperature=INITIAL_TEMPERATURE;
 memberType current, working, best;
 //FILE *fp;

 //fp=fopen("stats.txt", "w");
 ofstream fp("stats.txt");
 srand(time(NULL));

 initializiSolution( &current);
 computeEnergy( &current);
 best.energy=100.0;

 copySolution( &working,&current);

 while(temperature>FINAL_TEMPERATURE)
 {
  cout<<"Temperature"<<endl<<temperature;
  accepted=0;

  //izmena reshenija sluchajnym obrazom
  for(step=0; step<STEPS_PER_CHANGE;step++)
  {
	useNew=0;
	tweakSolution(&working);
	computeEnergy(&working);

	if(working.energy<=current.energy)
	   useNew=1;
	else
	   {
	    float test=getsRand();
	    float delta=working.energy-current.energy;
	    float calc=exp(-delta/temperature);

	       if(calc>test)
		{
		 accepted++;
		 useNew=1;
		}
	   }
     if(useNew)
     {
       useNew=0;
       copySolution( &current,&working);

       if(current.energy<best.energy)
       {
	copySolution( &best, &current);
	solution=1;
       }
     }
     else
	copySolution( &working,&current);
  }
 }//while

 fp<<"hjk";//timer++<<temperature<<best.energy<<accepted<<endl;
 //printf(fp, "%d %f %f %d \n",timer++,temperature,best.energy,accepted);
 //printf("best energy = %f\n", best.energy);

 temperature *=ALPHA;
 fp.close();

	if(solution)
	   emitSolution(&best);
//getch();
return 0;
}

//=============FUNCTION============
 void tweakSolution(memberType *member)
 {
  int temp,x,y;

   x=getRand(MAX_LENGTH);
   do
    {
	y=getRand(MAX_LENGTH);
    }
   while(x==y);
   temp=member->solution[x];
   member->solution[x]=member->solution[y];
   member->solution[y]=temp;
 }

 void initializiSolution(memberType *member)
 {
  int i;
  //nachalnaya inicializacyja reshenija
    for(i=0;i<MAX_LENGTH;i++)
	member->solution[i]=i;

  //izmenenie reshenija sluchajnim obrazom
    for(i=0;i<MAX_LENGTH;i++)
	tweakSolution(member);
 }

 void computeEnergy(memberType *member)
 {
  int i,j,x,y,tempx,tempy;
  char board[MAX_LENGTH][MAX_LENGTH];
  int conflicts;
  const int dx[4]={-1,1,-1,1};
  const int dy[4]={-1,1,1,-1};

  //standartnaja funczija ochistki pamjati
 memset( (void *)board, 0  ,MAX_LENGTH*MAX_LENGTH);

    for(i=0;i<MAX_LENGTH;i++)
	board[i][member->solution[i]]='Q';

  conflicts=0;

  for(i=0;i<MAX_LENGTH;i++)
	{ x=i;  y=member->solution[i];

  //proverjaem diagonali
   for(j=0;j<MAX_LENGTH;j++)
   {
	tempx=x;
	tempy=y;
    while(1)
      {
	tempx+=dx[j];
	tempy+=dy[j];
		if((tempx<0) || (tempx<=MAX_LENGTH) ||
		  (tempy<0) || (tempy<=MAX_LENGTH))
		break;
		if(board[tempx][tempy]=='Q') conflicts++;

      }
   }
  }
  member->energy=(float) conflicts;
 }

 void copySolution(memberType *dest,memberType *src)
 {
  int i;

   for(i=0;i<MAX_LENGTH;i++)
	dest->solution[i]=src->solution[i];

   dest->energy=src->energy;
 }

 void emitSolution(memberType *member)
 {
  char board[MAX_LENGTH][MAX_LENGTH];
  int x,y;

  memset( (void *)board, 0  ,MAX_LENGTH*MAX_LENGTH);

	for(x=0;x<MAX_LENGTH;x++)
		board[x][member->solution[x]]='Q';

  cout<<"board: "<<endl;

	for(y=0;y<MAX_LENGTH;y++)
	{
		for(x=0;x<MAX_LENGTH;x++)
		{
			if(board[x][y]=='Q')
			   cout<<"Q";
			else
			   cout<<".";
		}
		cout<<endl;
	 }
	 cout<<endl<<endl;
 }

 int getRand(int t)
 {
  int i;
  randomize;
  i=random(2);
  return i;
 }

 int getsRand()
 {
  int i;
  randomize;
  i=random(2);
  return i;
 }

Последний раз редактировалось андрей зелиг; 29.05.2012 в 15:57.
андрей зелиг вне форума Ответить с цитированием
Старый 29.05.2012, 15:35   #2
андрей зелиг
Новичок
Джуниор
 
Регистрация: 29.05.2012
Сообщений: 3
По умолчанию

у меня ещё в файл ничё записываться не хотелло...вот и написал fp<<"hjk";....не записывается почему то ничего=(
андрей зелиг вне форума Ответить с цитированием
Старый 29.05.2012, 15:55   #3
андрей зелиг
Новичок
Джуниор
 
Регистрация: 29.05.2012
Сообщений: 3
По умолчанию

понял...в файл не записывается потому что зацикливается и до туда не доходит..
андрей зелиг вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с алгоритмом VKorablev Общие вопросы C/C++ 4 22.12.2011 20:20
Задача с жадным алгоритмом vale4ka Паскаль, Turbo Pascal, PascalABC.NET 0 21.04.2011 20:38
Проблема с Алгоритмом!!!! sir.andrey Помощь студентам 1 06.11.2010 11:14
Траблы с Алгоритмом!) LtB Помощь студентам 4 01.11.2010 01:09
Помогите с алгоритмом xxxNeXxxx Помощь студентам 3 18.10.2009 19:58