我正在研究一个图表配对问题(分子内的化学功能组)。 原始代码由另一个学生撰写(视像C++,没有专门的管理图书馆),并在Windows上课。 之后,我增加了该方案的新职能,但没有改变分行配对的算法,也没有改变根据gcc4.2/MacOS X汇编的罚款新方案。 我在任职期间陷入了奇怪的问题!
标的;其成员:
Atom: 包含ID、Element、Bons(对质物体的点子)清单、搜索标记(bool)。 获取变量和确定检索功能——标识为真实或虚假。
债券:包含A和B原子的2个点,以及回归原子的职能* A when calls with para amount atom* B, 相反。
分子:使用原子识别或病媒内的位置,含有向原子照射的矢量,并具有接触原子*的功能。
原子的子级:HammettAtom。 它的其他成员是相关分子原子的原子点。
This is the algorithm of the recursion function: For every atom in an array A, compare to an atom in array B(the Hammett group, typically about 10-20 atoms in size). If the element is the same, obtain the list of connected atoms of each, and repeat. The tested atoms are marked along the way, so at one point there will be no more unmarked connected atoms.
Here is the code (unaltered, only the cout bits are added by me for testing). When the function is first called, the first vector is a single atom from a test molecule, the second vector is the 2nd atom of a Hammett group molecule. (The 1st atom in Hammett has ID X and can be anything.)
bool HammettCheck::checkSubproblem(vector<Atom*> bonded_atoms, vector<Atom*> my_list)
{
unsigned int truth=0;
vector<Atom*> unmarked_bonded;
vector<Atom*> unmarked_list;
cout << "
size of Hammett array: " <<my_list.size()<< " size of mol array: "<< bonded_atoms.size() << endl; //for testing
//If number of connected atoms is different, return false.
if( bonded_atoms.size() != my_list.size() ){
return false;
}
//Create new lists.
for(unsigned int i=0; i < bonded_atoms.size() ; i++){
//Create list of unmarked connected atoms in molecule.
if( !bonded_atoms[i]->isMarked() ){
unmarked_bonded.push_back(bonded_atoms[i]);
}
//Create list of unmarked connected atoms in hammett.
if( !my_list[i]->isMarked() ){
unmarked_list.push_back( my_list[i] );
}
}
cout << "size of unmarked Hammett array: " << unmarked_list.size() << " size of unmarked mol array: "<< unmarked_bonded.size() <<endl; //for testing
//If number of unmarked connected atoms is different, return false.
if( unmarked_bonded.size() != unmarked_list.size() ){
return false;
}
//Check each unmarked atom connected in the molecule against possible atoms it could be in the hammett group.
for(unsigned int i=0; i < unmarked_bonded.size(); i++){
cout<< "atom in um_mol array considered ID: " << unmarked_bonded[i]->getID() << " Ele: " << unmarked_bonded[i]->getEle()<< endl;
/*Unmarked hammett assigned in reverse order so that the undefined "X" atom is only
assigned if a connected atom can not possibly be any other atom.*/
for(int j=(unmarked_list.size()-1); j > -1; j--){
cout << "atom in um_h_array considered ID: " << unmarked_list[j]->getID() << endl;
//If hammett atom has already been assigned to a connected atom, it cannot be assigned to another
if(!unmarked_list[j]->isMarked()){
cout << unmarked_list[j]->getID() << "is unmarked" <<endl;
/*If connected atom could only be hammett group s connection
to the rest of the molecule, assign it as such.*/
if( !strcmp(unmarked_list[j]->getEle().c_str(), "X") ){
unmarked_bonded[i]->mark();
unmarked_list[j]->mark(unmarked_bonded[i]);
truth++;
cout<< "mol atom ID "<< unmarked_bonded[i]->getID() <<" marked as X, current truth: "<< truth << endl;
cout << unmarked_list[j]->getID() << "is now marked(1)/unmarked(0) " << unmarked_list[j]->isMarked() << " and break loop "<<endl;
break;
}
/*If connected atom is the same element as a possible hammett atom,
check that atoms connections by running them through the subproblem.*/
if( !strcmp(unmarked_bonded[i]->getEle().c_str(), unmarked_list[j]->getEle().c_str()) ){
unmarked_bonded[i]->mark();
unmarked_list[j]->mark(unmarked_bonded[i]);
cout<<"found same ele between mol_id "<< unmarked_bonded[i]->getID() <<" and ham_id " << unmarked_list[j]->getID() <<endl;
vector<Atom*> new_bonded = getAttachedAtoms( unmarked_bonded[i] );
vector<Atom*> new_list = getAttachedAtoms( unmarked_list[j] );
if( checkSubproblem( new_bonded, new_list ) ){
cout<<"found same atom"<<endl;
truth++;
break;
/*If only the elements are the same do not assign
the hammett atom to this connected atom.*/
}else{
unmarked_bonded[i]->demark();
unmarked_list[j]->demark();
}
}
}
}
}
//Return true if all connected atoms can be assigned atoms of the hammett group.
if( truth == unmarked_bonded.size() ){
return true;
}else{
return false;
}
}
我以29个原子的测试分子操作所汇编的方案,与两个哈姆特群体相比。 它应当包含第2组,而不是第2组。 1. 然而,它已经归还了真正的WHENEVER I, 开始的是具有相同成分的2个原子。 下面是产出样本(分子实际上并不含有哈姆特集团的原子)。
currently at molecule atom ID 1
size of Hammett array: 1 size of mol array: 1
size of unmarked H array: 1 size of unmarked mol array: 1
atom in um_mol array considered ID: 1 Ele: N
atom in um_h_array considered ID: N1
N1is unmarked
found same ele between mol_id 1 and ham_id N1
size of Hammett array: 3 size of mol array: 3
size of unmarked H array: 3 size of unmarked mol array: 3
atom in um_mol array considered ID: 2 Ele: H
atom in um_h_array considered ID: O2
O2is unmarked
atom in um_h_array considered ID: O1
O1is unmarked
atom in um_h_array considered ID: X
X is unmarked
mol atom ID 2 marked as X, current truth: 1
X is now marked(1)/unmarked(0) 128 and break loop
atom in um_mol array considered ID: 8 Ele: C
atom in um_h_array considered ID: O2
O2is unmarked
atom in um_h_array considered ID: O1
O1is unmarked
atom in um_h_array considered ID: X
X is unmarked
mol atom ID 8 marked as X, current truth: 2
X is now marked(1)/unmarked(0) 160 and break loop
atom in um_mol array considered ID: 17 Ele: C
atom in um_h_array considered ID: O2
O2is unmarked
atom in um_h_array considered ID: O1
O1is unmarked
atom in um_h_array considered ID: X
X is unmarked
mol atom ID 17 marked as X, current truth: 3
X is now marked(1)/unmarked(0) 128 and break loop
found same atom
Hammet group 2 checkSubproblem true
Hammett added to atom 1
如果是很长的,则会问。 But:在我打上X原子(位于哈穆特分子的原子)并试图取用标识 b后,该物体的价值大于1。 因此,X被错误地打上了几次标记,而真相反台站出来,直到达到条件真理=无标志的渗透。
I am not sure what the actual problem is? The value 128 suggest some mixed up memory/pointer issue, but am unsure how to find that out. I am not even sure if it has anything to do with the recursion function!
如果任何人能够提出我可以尝试的东西,我将非常感谢。 提前感谢!
P.S. 原子级功能守则。
string Atom::getID()
{
return id;
}
string Atom::getEle()
{
return ele;
}
void Atom::mark()
{
search_mark = true;
}
void Atom::demark()
{
search_mark = false;
}
void HammettAtom::mark(Atom* assigned)
{
search_mark = true;
related_mol_atom = assigned;
}
bool Atom::isMarked()
{
return search_mark;
}