0

寻找朝着正确方向迈出的一步。我已经做了 4 节课。一个是超类,它是图和 3 个子类,称为 Edge、DirectedGraph 和 BipartiteGraph。

我在创建二分图时遇到了一些麻烦。具体来说,我得到了这些指示:

扩展 Graph 类以创建一个新的 BipartiteGraph 类。它应该继承超类的所有功能:

  • 自动将所有偶数索引顶点 (0,2,4) 指定为类中“A 分区”的一部分,并将所有奇数索引顶点 (1,3,5) 指定为“B 分区”的一部分。这不需要新的代码,只是一个概念上的期望。

  • 重写 Graph 的构造函数以具有相同的输入(顶点数),调用超级构造函数,然后验证图是二分的。也就是说,确保所有现有边都是从 A 中的顶点到 B 中的顶点。如果图不是二分图,则消除内部表示(例如,对于邻接矩阵,制作大小为 0x0 的数组),因此它不能使用!

  • 添加一个方法 setPreferences() ,该方法将整数和整数数组或 ArrayList 作为参数。第一个整数是我们想要附加偏好的顶点,列表是偏好列表,从最喜欢到最不喜欢。验证 ints 数组是否以某种顺序包含另一个分区的所有成员,然后保存该信息(您将需要一个数组/ArrayLists 的一维数组来存储这些列表,每个顶点一个)。

  • 添加没有参数并返回稳定匹配的方法 stableMatching(以整数对的 ArrayList 的形式)。查阅维基百科会有所帮助:http ://en.wikipedia.org/wiki/Stable_marriage_problem 。作为开始,我建议验证每个顶点是否都为其设置了首选项列表!

这是我在超类中的构造函数:

public class Graph {

// Setup privately modified variables which will define the graph

// These two parameters are storage variables for edges and vertices
// These variables were changed from Vertex and Edge to numVertices and
// numEdges.
private int numVertices;
private int numEdges;

// This will be the adjacency matrix to represent our graph, this will
// represent edges.
// adj_Matrix_Edges was previously static meaning it did not have access to
// multiple graphs, onyl one graph.
protected boolean[][] adj_Matrix_Edges;

// first step will be to setup the graph, using this constructor
public Graph(int vertices) {

    numVertices = vertices;

    if (numVertices < 0) {
        throw new RuntimeException(
                "Number of vertices cannot be a nonnegative value");
    }

    System.out.println("There are now " + numVertices
            + " vertices in the graph.");

    // A graph is created based on the specifications, N X N or (n^2)
    // graph.
    adj_Matrix_Edges = new boolean[vertices][vertices];
    }

这是迄今为止我对 BipartiteGraph 类的内容:

    public class BipartiteGraph extends Graph{

//Initialize two partitions for bipartite graph.
boolean[][] a;
boolean[][] b;


//Constructor of BipartiteGraph class
public BipartiteGraph(int vertices) {
    super(vertices);

    //Copy over even elements of graph into partition A.
    for (int i = 0; i < adj_Matrix_Edges.length; i++){
        for (int j = 0; j < adj_Matrix_Edges[i].length; j++){
            if (j%2 == 0){
                adj_Matrix_Edges[j] = a[j];
            }
        }
    }

    //Copy over odd elements of graph into Partition B.
    for (int i = 0; i < adj_Matrix_Edges.length; i++){
        for (int j = 0; j < adj_Matrix_Edges[i].length; j++){
            if (j%2 != 0){
                adj_Matrix_Edges[j] = b[j];
            }
        }
    }

}


public void setPreferences(int vertex, int[] preferences){

    if ()

}

public List stableMatching(){
    java.util.List<Integer> matching = new ArrayList<Integer>();


}

我是不是把事情弄得太复杂了,代码比看起来简单吗?

4

2 回答 2

1

我认为声明中存在错误BipartiteGraph

public class BipartiteGraph extends Graph{

boolean[][] a;
boolean[][] b;

您将a和声明b为作为矩阵的二维数组。a并对顶点集的b互补子集进行建模。因此,它们应该是一个顶点列表或一个布尔数组,表示第 i 个顶点是否在a. 此外,您不需要存储两者,因为一个是另一个的补充。

于 2014-02-09T08:59:38.070 回答
0

也许我错过了什么,但你必须把它写成家庭作业吗?否则,您可以依赖 JUNG 并使用 HyperGraph:

http://jung.sourceforge.net/doc/api/edu/uci/ics/jung/graph/Hypergraph.html

于 2014-02-20T16:27:16.587 回答