我的项目是关于在java中实现hyperGraph。
根据我所拥有的顶点类型,我的hyperGraph包含各种类型的hyperEdge。
顶点类型:图像,标签..。
HyperEdge =齐次(同类型的相关顶点)/Heterogeneous(不同类型的相关顶点)
同质HyperEdge=图像-图像超边缘/标签标记hyperEdge
这是一个快速绘制UML图。


这是我的密码
public interface HomogenousHyperedge< T extends Vertex<L>, L> extends Hyperedge {
public abstract List<T> searchNearstNeighborsVertex(
Hypergraph hypergraph, T vertex);
}public class ImageImageHyperedge implements
HomogenousHyperedge<ImageVertex, Map<String,Instance>> {
@Override
public List<ImageVertex> searchNearstNeighborsVertex(Hypergraph hypergraph,
ImageVertex vertex) {
return null;
}
}问题是在ImageImageHyperEdge类中,我应该知道基于它的特性的类型,我将搜索ImageVertex最近的邻居,我不能将它传递给超级接口的抽象方法,因为TagTagHyperEdge类不需要它
如果我将ImageImageHyperEdge类替换为{featureOneHyperEdge类,...featureFiveHyperEdge类}(其中我知道特征类型),这将是代码的重复,因为它是相同的最近邻搜索算法。
图像的feature=低层特征(例如颜色直方图)
我有5种低级别功能
我将使用每一个搜索当前图像的最近邻居。
所有功能都存储在一个简单的文本文件中。
同样的算法用于搜索最近的邻居。
每次只有文件被更改
发布于 2013-05-02 09:02:17
您的UML设计不够好。跳过丑陋和难读的‘样式’,向我们展示‘顶点’和‘边缘’,以及一个关联图,而不是你(可能过于复杂)的继承概念。
您的API、设计和基本问题并不十分清楚。“‘Hyperedge”类可以表示Edge的单个实例,并将其两端关联起来;或者它们可以(如果更好地命名)表示边缘类型,并从指定的端点参数全局搜索图形。
这些都是完全不同的设计,你的问题是毫无意义的,除非你弄清楚上面的答案。
无论哪种方式,Edge.search()都没有正确的签名。当VS和VE是开始和结束顶点类型,TE是边缘类型时,它应该是:
public class EdgeType {
public List<EV> getEndpoints (SV startVertex);
}或
public class Vertex {
public List<TE> Vertex.getEdges();
}
public class Edge {
public EV Edge.getEndpoint();
}最近邻算法应该使用泛型类型来实现,然后由具体的类根据需要(带有精确的类型签名)进行调用。
顺便说一句,当你提到“最近的邻居”时,也不清楚“最近的邻居”是否意味着直接连接的顶点,这是琐碎的,或者是寻找最近的距离(距离是如何测量的?指定类型的顶点。
无论哪种方式,实现“Edge”的子类型的实用程序&正确性/需要似乎都不清楚。许多图算法都发现顶点/节点是有趣的和子类型的,但是我不知道有子类型(或者子类型的效用)--导致这些的边。
最后提示:放弃复杂的命名,亲吻。‘顶点’和‘边缘’将帮助你得到一个清晰,简单,可理解和正确的设计。把多余的字句留到你拿到后再说。
针对纳瓦拉提供的进一步资料:
然后,它是您所建模的EdgeType,当询问‘最近的邻居’时,您应该取一个起始点&返回边(S) --如果您需要距离度量--或者顶点。
对“图”的引用可能是从顶点参数中隐含的。
至于您的EdgeType继承继承:子类型&继承应该定义为遵循行为特征,而不是它们引用的泛型类型(顶点类型)。OO类继承设计的原则是建模,而不是存在。
在这方面,您可能有一个KnnDistanceEdgeType & FlickrDistanceEdgeType类,或者作为祖先,或者,如果没有其他方法行为需要不同,则作为实际的实现类。他们正在搜索的特征类型/类可以设置为属性--通过属性和不同的泛化,来回答不同的顶点类型。
例如:
IMAGE_IMAGE_EDGES = new KnnDistanceEdgeType<ImageVertex,ImageVertex>( ImageVertex.class, ImageVertex.class);
TAG_TAG_EDGES = new FlickrDistanceEdgeType<TagVertex,TagVertex>( TagVertex.class, TagVertex.class);
ANY_EDGES = new KnnDistanceEdgeType<Vertex,Vertex>( Vertex.class, Vertex.class);如果在EdgeType中有很多其他行为(我们还没有定义,也无法想象),那么您可以将KNN-和Flickr-距离算法移到不同的类中。也许没必要。
记住:在OO中,子类代表行为,而不是存在。给我一个+1票!
发布于 2013-04-17 19:40:38
基于您所写的关于“特性”的内容,我认为这将适合作为您的ImageImageHyperEdge类中的一个字段。您可以使用定义它的任何不同成员创建一个FeatureType类。
public class ImageImageHyperedge implements
HomogenousHyperedge<ImageVertex, Map<String,Instance>> {
private FeatureType featureType;
@Override
public List<ImageVertex> searchNearstNeighborsVertex(Hypergraph hypergraph,
ImageVertex vertex) {
return null;
}
}发布于 2013-04-17 19:53:51
试试这样的东西?
public abstract class BaseFeatureHyperEdge {
@Override
public List<ImageVertex> searchNearstNeighborsVertex(Hypergraph hypergraph,
ImageVertex vertex) {
// implement nearest neighbor search algorithm
// and call getFeatureType where you need it.
// This will allow you to have the search algorithm only in one place.
//But make the search based on the feature type;
}
protected FeatureType getFeatureType();
}
public class FeatureOneHyperEdge extends BaseFeatureHyperEdge{
@Override
protected FeatureType getFeatureType() {
return new FeatureTypeOne();
}
}
public class FeatureTwoHyperEdge extends BaseFeatureHyperEdge{
@Override
protected FeatureType getFeatureType() {
return new FeatureTypeTwo();
}
}也许你可以试试模板法模式
https://stackoverflow.com/questions/16068061
复制相似问题