How to convert this C++ code into Matlab or How can I run this into Matlab

8 views (last 30 days)
The following is a C++ code of CRO. How can we convert this into Matlab code or how can we run it in Matlab?
#include "CRO.h"
#include "Molecule.h"
#include <bits/stdc++.h>
#define PI 3.14
using namespace std;
int cnt = 0;
double limit = 5000, KELossRate = 0.2, mole_coll = 0.2;
double alpha = 100, beta = 100, buffer = 0, init_ke = 100;
vector<Molecule> pop;
CRO::CRO(vector<pair<int,int>>& p)
{
int is_first_molecule = 0;
for(vector<pair<int,int>>::iterator it = p.begin(); it != p.end(); ++it)
{
Molecule m(*it);
pop.push_back(m);
}
for(vector<Molecule>::iterator it = pop.begin(); it != pop.end(); ++it)
{
it->pe = this->fit_func(*it);
it->ke = 100;
it->update();
if(!is_first_molecule)
{
optimal = *it;
}
else if(it->pe < optimal.pe)
{
optimal = *it;
}
}
}
CRO::~CRO()
{
//dtor
}
float CRO::random1()
{
return static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
}
void CRO::run()
{
Molecule m1, m2;
while(cnt < limit)
{
cnt += 1;
if(random1() > mole_coll or pop.size() < 2)
{
Molecule m = pop[rand()%pop.size()];
if(m.num_of_hits > alpha)
decomposition(m);
else
on_wall(m);
}else
{
m1 = pop[rand()%pop.size()];
m2 = pop[rand()%pop.size()];
if(m1.ke <= beta and m2.ke <= beta)
synthesis(m1, m2);
else
interaction(m1, m2);
}
}
}
void CRO::update(Molecule m)
{
if(m.pe < optimal.pe)
optimal = m;
}
void CRO::decomposition(Molecule m)
{
m.num_of_hits += 1;
Molecule new1 , new2 ;
pair<Molecule, Molecule> pm;
pm = dec(m);
new1 = pm.first;
new2 = pm.second;
new1.pe = fit_func(new1);
new2.pe = fit_func(new2);
double tmp = m.pe + m.ke - new1.pe - new2.pe;
if(tmp >= 0 or tmp + buffer >= 0)
{
if(tmp >= 0)
{
double q = random1();
new1.ke = tmp * q;
new2.ke = tmp * (1 - q);
}else
{
new1.ke = (tmp + buffer) * random1() * random1();
new2.ke = (tmp + buffer - new1.ke) * random1() * random1();
buffer = buffer + tmp - new1.ke - new2.ke ;
}
new1.update();
new2.update();
//iterate two same tree for equality check
erase_molecule(pop, m);
pop.push_back(new1);
pop.push_back(new2);
update(new1);
update(new2);
}
}
void CRO::on_wall(Molecule m)
{
m.num_of_hits += 1;
Molecule m1 = wall(m);
m1.pe = fit_func(m1);
double tmp = m.pe + m.ke - m1.pe;
if(tmp >= 0)
{
//double q = random.uniform in range KELossRate to 1;
double q = KELossRate + static_cast <double> (rand()) /( static_cast <double> (RAND_MAX/(1-KELossRate)));
m1.ke = tmp * q;
m1.update();
buffer += tmp * (1 - q);
erase_molecule(pop, m);
pop.push_back(m1);
update(m1);
}
}
void CRO::interaction(Molecule m1, Molecule m2)
{
m1.num_of_hits += 1;
m2.num_of_hits += 1;
pair<Molecule, Molecule> pm;
pm = inter(m1, m2);
Molecule new1, new2;
new1 = pm.first;
new2 = pm.second;
new1.pe = fit_func(new1);
new2.pe = fit_func(new2);
double tmp = m1.pe + m2.pe + m1.ke + m2.ke - new1.pe - new2.pe;
if(tmp >= 0)
{
double q = rand();
new1.ke = tmp * q;
new2.ke = tmp * (1 - q);
new1.update();
new2.update();
erase_molecule(pop, m1);
erase_molecule(pop, m2);
pop.push_back(new1);
pop.push_back(new2);
update(new1);
update(new2);
}
}
void CRO::erase_molecule(vector<Molecule>& population, Molecule& m)
{
for(vector<Molecule>::iterator it = population.begin(); it != population.end(); it++)
{
if((it->structure.first == m.structure.first) && (it->structure.second == m.structure.second))
{
population.erase(it);
break;
}
}
}
void CRO::synthesis(Molecule m1, Molecule m2)
{
m1.num_of_hits += 1;
m2.num_of_hits += 1;
Molecule new1 = syn(m1, m2);
new1.pe = fit_func(new1);
double tmp = m1.pe + m2.pe + m1.ke + m2.ke - new1.pe;
if(tmp >= 0)
{
new1.ke = tmp;
new1.update();
erase_molecule(pop, m1);
erase_molecule(pop, m2);
pop.push_back(new1);
update(new1);
}
}
Molecule CRO::syn(Molecule m1, Molecule m2)
{
Molecule new1 = m1;
if (random1() < 0.5){
new1.structure.first = m2.structure.first;
}else{
new1.structure.second = m2.structure.second;
}
return new1;
}
pair<Molecule, Molecule> CRO::inter(Molecule m1, Molecule m2)
{
Molecule new1 = m1;
Molecule new2 = m2;
new1.structure.first = m2.structure.first;
new1.structure.second = m1.structure.second;
new2.structure.first = m1.structure.first;
new2.structure.second = m2.structure.second;
pair<Molecule, Molecule> pm;
pm = make_pair(new1, new2);
return pm;
}
Molecule CRO::wall(Molecule m)
{
Molecule new1 = m;
swap(new1.structure.first, new1.structure.second);
return new1;
}
pair<Molecule,Molecule> CRO::dec(Molecule m)
{
pair<Molecule, Molecule> pm;
Molecule new1 = m;
Molecule new2 = m;
new1.structure.first += random();
new2.structure.second += random();
pm = make_pair(new1, new2);
return pm;
}
float CRO::fit_func(Molecule m){
//return sin(m.structure.first*PI /180.0) + cos(m.structure.second*PI / 180.0);
return tan(m.structure.first*PI /180.0);
}

Accepted Answer

Darshan Ramakant Bhat
Darshan Ramakant Bhat on 20 Mar 2021
  1 Comment
Sadiq Akbar
Sadiq Akbar on 20 Mar 2021
Ok I accept your answer but I don't have Matlab2021a. I have Matlab 2016b. However thank you very much for your response dear Darshsn Ramakant Bhat.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!