📄 programchromosome.java
字号:
if (num < 0) {
break;
}
}
else {
return -1;
}
}
return num;
}
/**
* Gets the a_child'th child of the a_index'th node in this chromosome. This
* is the same as the a_child'th node whose depth is one more than the depth
* of the a_index'th node.
*
* @param a_index the node number of the parent
* @param a_child the child number (starting from 0) of the parent
* @return the node number of the child, or -1 if not found
*
* @author Klaus Meffert
* @since 3.01
*/
public int getChild(int a_index, int a_child) {
/**@todo speedup*/
int len = getFunctions().length;
for (int i = a_index + 1; i < len; i++) {
if (m_depth[i] <= m_depth[a_index]) {
return -1;
}
if (m_depth[i] == m_depth[a_index] + 1) {
if (--a_child < 0) {
return i;
}
}
}
throw new RuntimeException("Bad child "
+ a_child
+ " of node with index = "
+ a_index);
}
public int getChild(CommandGene a_node, int a_child) {
/**@todo speedup*/
int len = getFunctions().length;
int index = -1;
for (int i = 0; i < len; i++) {
if (m_genes[i] == a_node) {
index = i;
break;
}
}
if (index == -1) {
return -2;
}
for (int i = index + 1; i < len; i++) {
if (m_depth[i] <= m_depth[index]) {
return -1;
}
if (m_depth[i] == m_depth[index] + 1) {
if (--a_child < 0) {
return i;
}
}
}
throw new RuntimeException("Bad child " + a_child +
" of node with index = " + index);
}
public CommandGene[] getFunctionSet() {
return m_functionSet;
}
public void setFunctionSet(CommandGene[] a_functionSet) {
m_functionSet = a_functionSet;
}
public CommandGene[] getFunctions() {
return m_genes;
}
public void setFunctions(CommandGene[] a_functions)
throws InvalidConfigurationException {
m_genes = a_functions;
}
/**
* Gets the number of nodes in the branch starting at the a_index'th node.
*
* @param a_index the index of the node at which to start counting
* @return the number of nodes in the branch starting at the a_index'th node
*
* @author Klaus Meffert
* @since 3.0
*/
public int getSize(int a_index) {
int i;
// Get the node at which the depth is <= depth[n].
// -----------------------------------------------
for (i = a_index + 1; i < m_genes.length && m_genes[i] != null; i++) {
if (m_depth[i] <= m_depth[a_index]) {
break;
}
}
return i - a_index;
}
/**
* Gets the depth of the branch starting at the a_index'th node.
*
* @param a_index the index of the node at which to check the depth
* @return the depth of the branch starting at the a_index'th node
*
* @author Klaus Meffert
* @since 3.0
*/
public int getDepth(int a_index) {
int maxdepth = m_depth[a_index];
for (int i = a_index + 1; i < m_genes.length && m_genes[i] != null; i++) {
if (m_depth[i] <= m_depth[a_index]) {
break;
}
if (m_depth[i] > maxdepth) {
maxdepth = m_depth[i];
}
}
return maxdepth - m_depth[a_index];
}
/**
* Gets the node which is the parent of the given node in this chromosome. If
* the child is at depth d then the parent is the first function at depth d-1
* when iterating backwards through the function list starting from the child.
*
* @param a_child the child node
* @return the parent node, or null if the child is the root node
*
* @author Klaus Meffert
* @since 3.0
*/
public int getParentNode(int a_child) {
if (a_child >= m_genes.length || m_genes[a_child] == null) {
return -1;
}
for (int i = a_child - 1; i >= 0; i--) {
if (m_depth[i] == m_depth[a_child] - 1) {
return i;
}
}
return -1;
}
/**
* Checks whether a node with a given type is contained in the program.
*
* @param a_type the type to look for
* @param a_exactMatch true: look for exactly the given type: false: also look
* for sub types
* @return true specific node found
*
* @author Klaus Meffert
* @since 3.2.1
*/
public CommandGene getNode(Class a_type, boolean a_exactMatch) {
return getNode(a_type, a_exactMatch, 0);
}
public CommandGene getNode(Class a_type, boolean a_exactMatch,
int a_startIndex) {
int size = m_genes.length;
for (int i = a_startIndex; i < size; i++) {
if (m_genes[i] != null) {
if (a_exactMatch) {
if (m_genes[i].getClass() == a_type) {
m_genes[i].nodeIndex = i; /**@todo work over*/
return m_genes[i];
}
}
else {
if (a_type.isAssignableFrom(m_genes[i].getClass())) {
m_genes[i].nodeIndex = i; /**@todo work over*/
return m_genes[i];
}
}
}
else {
break;
}
}
return null;
}
/**
* Executes this node as a boolean.
*
* @param args the arguments for execution
* @return the boolean return value of this node
* @throws UnsupportedOperationException if the type of this node is not
* boolean
*
* @author Klaus Meffert
* @since 3.0
*/
public boolean execute_boolean(Object[] args) {
boolean rtn = m_genes[0].execute_boolean(this, 0, args);
cleanup();
return rtn;
}
/**
* Executes this node as a boolean.
*
* @param n the index of the parent node
* @param child the child number of the node to execute
* @param args the arguments for execution
* @return the boolean return value of this node
* @throws UnsupportedOperationException if the type of this node is not
* boolean
*
* @author Klaus Meffert
* @since 3.0
*/
public boolean execute_boolean(int n, int child, Object[] args) {
if (child == 0) {
return m_genes[n + 1].execute_boolean(this, n + 1, args);
}
int other = getChild(n, child);
return m_genes[other].execute_boolean(this, other, args);
}
/**
* Executes this node, returning nothing.
*
* @param args the arguments for execution
* @throws UnsupportedOperationException if the type of this node is not void
*
* @author Klaus Meffert
* @since 3.0
*/
public void execute_void(Object[] args) {
m_genes[0].execute_void(this, 0, args);
cleanup();
}
public void execute_void(int n, int child, Object[] args) {
if (child == 0) {
m_genes[n + 1].execute_void(this, n + 1, args);
}
else {
int other = getChild(n, child);
m_genes[other].execute_void(this, other, args);
}
}
/**
* Executes this node as an integer.
*
* @param args the arguments for execution
* @return the integer return value of this node
* @throws UnsupportedOperationException if the type of this node is not
* integer
*
* @author Klaus Meffert
* @since 3.0
*/
public int execute_int(Object[] args) {
int rtn = m_genes[0].execute_int(this, 0, args);
cleanup();
return rtn;
}
public int execute_int(int n, int child, Object[] args) {
if (child == 0) {
return m_genes[n + 1].execute_int(this, n + 1, args);
}
else {
int other = getChild(n, child);
return m_genes[other].execute_int(this, other, args);
}
}
/**
* Executes this node as a long.
*
* @param args the arguments for execution
* @return the long return value of this node
* @throws UnsupportedOperationException if the type of this node is not long
*
* @author Klaus Meffert
* @since 3.0
*/
public long execute_long(Object[] args) {
long rtn = m_genes[0].execute_long(this, 0, args);
cleanup();
return rtn;
}
public long execute_long(int n, int child, Object[] args) {
if (child == 0) {
return m_genes[n + 1].execute_long(this, n + 1, args);
}
int other = getChild(n, child);
return m_genes[other].execute_long(this, other, args);
}
/**
* Executes this node as a float.
*
* @param args the arguments for execution
* @return the float return value of this node
* @throws UnsupportedOperationException if the type of this node is not float
*
* @author Klaus Meffert
* @since 3.0
*/
public float execute_float(Object[] args) {
float rtn = m_genes[0].execute_float(this, 0, args);
cleanup();
return rtn;
}
public float execute_float(int n, int child, Object[] args) {
if (child == 0) {
return m_genes[n + 1].execute_float(this, n + 1, args);
}
int other = getChild(n, child);
return m_genes[other].execute_float(this, other, args);
}
/**
* Executes this node as a double.
*
* @param args the arguments for execution
* @return the double return value of this node
* @throws UnsupportedOperationException if this node's type is not double
*
* @author Klaus Meffert
* @since 3.0
*/
public double execute_double(Object[] args) {
double rtn = m_genes[0].execute_double(this, 0, args);
cleanup();
return rtn;
}
public double execute_double(int n, int child, Object[] args) {
if (child == 0) {
return m_genes[n + 1].execute_double(this, n + 1, args);
}
int other = getChild(n, child);
return m_genes[other].execute_double(this, other, args);
}
/**
* Executes this node as an object.
*
* @param args the arguments for execution
* @return the object return value of this node
* @throws UnsupportedOperationException if the type of this node is not
* of type Object
*
* @author Klaus Meffert
* @since 3.0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -