solving np complete problems using ga

Post on 01-Jan-2016

75 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Solving NP Complete Problems using GA. Mubasher Baig Asif Jamshed Umar Faiz. Solving NP Complete Problems using GA. Two basic steps to solving the traveling salesman problem using a GA. Solving NP Complete Problems using GA and FT. First step - PowerPoint PPT Presentation

TRANSCRIPT

Mubasher Baig

Asif Jamshed

Umar Faiz

Solving NP Complete Problems using GA

• Two basic steps to solving the traveling salesman problem using a GA.

Solving NP Complete Problems using GA

• First step– Create a group of many random tours in what

is called a population. • These tours are stored as a sequence of numbers.

Solving NP Complete Problems using GA and FT

• Second step– Randomly select tours for crossover– Crossover creates 2 new solutions children

in the hope that they create an even better solution. (single point crossover?)

Solving NP Complete Problems using GA and FT

• Size of the population may be changed by changing CONST variable (POP_SIZE) in the code

• Maximum distance between two cities may be controlled by changing the value of associated CONST (MAX_DIST).

Implementation

• Take input on the number of cities from the user

• Generate a (symmetric) square distance matrix representing the distance between each city.

Implementation

• Generate the initial population – generating random permutations is a difficult

since we have to be careful that an older number is not repeated.

• Both the distance matrix and the initial population is displayed to the user.

• Run the genetic algorithm

Implementation

/*The general form of a genetic algorithm:t := 0;initialize(P(0));evaluate(P(0));while not done do P'(t) := propotional_selection(P(t)); P'(t) := crossover(P'(t)); P'(t) := mutation(P'(t)); evaluate(P'(t)); P(t + 1) := P'(t); t := t + 1;od*/

Implementation

#include<stdlib.h>

#include<iostream.h>

#include<time.h>

const int MAX_DISTANCE = 30;

const int POP_SIZE = 100;

Implementation

– //initiate a symmetric matrix with random distances– short int** generateDistanceMatrix(short int);

– //display the distance matrix– void display(short int** matrix, short int size);

– //free the allocated memory– void deleteMatrix(short int** matrix, short int size);

– //returns a permutation of [1,n]– short int* generateRandomPermutation(short int n,

bool*);

Implementation

– //initialize the population with random tours– short int** initialize(short int cities);

– void displayPopulation(short int**, short int);

– //evaluation function returns the shortest permutation– short int* evaluate(short int** pop, short int**

distances, int n);

– //calculates the length of the supplied tour– int tourLength(short int* tour, short int** distances,

short int n);

Implementation

void displayTour(short int* tour, short int n);

int main(){

//give a seed for random number generationsrand(time(NULL));short int cities;cout << "Enter the number of cities: ";cin >> cities;

//randomly assign distances between citiesshort int** distanceMatrix = generateDistanceMatrix(cities);

cout << "\nThe Distance Matrix:" << endl;display(distanceMatrix, cities);}

Implementation

short int** generateDistanceMatrix(short int cities){

int i, j;

short int** matrix = new short int* [cities];for(i = 0; i < cities; i++)

matrix[i] = new short int[cities];

//assign random weights to upper half and copy to lower halffor(i = 0; i < cities; i++){

for(j = i; j < cities; j++){

matrix[i][j] = rand() % MAX_DISTANCE + 1;matrix[j][i] = matrix[i][j];

}}//distance to itself is 0for(i = 0; i < cities; i++)

matrix[i][i] = 0return matrix;

}

Implementation

void display(short int** matrix, short int size){

int i, j;

for(i = 0; i < size; i++){

for(j = 0; j < size; j++){

//for formattingif(matrix[i][j] < 10)

cout << " ";cout << matrix[i][j] << " ";

}

cout << endl;}return;

}

Implementation

void deleteMatrix(short int** matrix, short int size){

for(int i = 0; i < size; i++)delete matrix[i];

delete matrix;

return;}short int** initialize(short int cities){

short int** tour = new short int* [POP_SIZE];bool* node = new bool[cities];

//assign random permutationsfor(int i = 0; i < POP_SIZE; i++)

tour[i] = generateRandomPermutation(cities, node);

delete node;return tour;

}

Implementation

short int* generateRandomPermutation(short int n, bool* node){

short int* permutation = new short int[n];int i;

//flags for the numbers already usedfor(i = 0; i < n; i++)

node[i] = true;

int pointer = 0;int jump = 0;for(i = 0; i < n; i++){

//jump size determined randomlyjump = (rand() % (n - 1));

//find the number not yet used which is at//a distance 'jump' with wrap aroundwhile(jump >= 0){

pointer = (pointer + 1) % n;if(node[pointer])

jump--;

}//assign that number to the position//and mark it 'used' in then odes arraypermutation[i] = pointer + 1;node[pointer] = false;

}return permutation;

}

Implementation

short int* generateRandomPermutation(short int n, bool* node){

short int* permutation = new short int[n];int i;

//flags for the numbers already usedfor(i = 0; i < n; i++)

node[i] = true;

int pointer = 0;int jump = 0;for(i = 0; i < n; i++){

//jump size determined randomlyjump = (rand() % (n - 1));

//find the number not yet used which is at//a distance 'jump' with wrap aroundwhile(jump >= 0){

pointer = (pointer + 1) % n;if(node[pointer])

jump--;

}//assign that number to the position//and mark it 'used' in then odes arraypermutation[i] = pointer + 1;node[pointer] = false;

}return permutation;

}

Implementation

void displayPopulation(short int** tours, short int n){

for(int i = 0; i < POP_SIZE; i++){

for(int j = 0; j < n; j++){

//for formattingif(tours[i][j] < 10)

cout << " ";cout << tours[i][j] << " ";

}cout << endl;

}return;

}

Implementation

short int* evaluate(short int** pop, short int** distances, int n){

//set the best permutation to the first oneshort int* best = pop[0];

//then iterate through all of the population//to fnd the shotest tourfor(int i = 0; i < POP_SIZE; i++){

if(tourLength(pop[i], distances, n) < tourLength(best, distances, n))

best = pop[i];}

return best;}

Implementation

//calculate the tour length

int tourLength(short int* best, short int** distances, short int n)

{

int length = 0;

//find the length of the shortest cycle

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

length += distances[i][(i+1) % n];

return length;

}

Implementation

void displayTour(short int* tour, short int n){

for(int i = 0; i < n; i++){

//for formattingif(tour[i] < 10)

cout << " ";cout << tour[i] << " ";

}cout << "\b";return;

}

Implementation

top related