From 25b37eff4896da5b7495cfcd1e9ae696a4579990 Mon Sep 17 00:00:00 2001 From: eugenefischer <66030419+eugenefischer@users.noreply.github.com> Date: Sat, 22 Oct 2022 15:00:22 -0500 Subject: [PATCH] renamed to MaximumIntegerWeightBipartiteAuctionMatching --- ...MaximumWeightBipartiteAuctionMatching.java | 145 ------------------ 1 file changed, 145 deletions(-) delete mode 100644 src/main/java/MaximumWeightBipartiteAuctionMatching.java diff --git a/src/main/java/MaximumWeightBipartiteAuctionMatching.java b/src/main/java/MaximumWeightBipartiteAuctionMatching.java deleted file mode 100644 index b9ba8aa..0000000 --- a/src/main/java/MaximumWeightBipartiteAuctionMatching.java +++ /dev/null @@ -1,145 +0,0 @@ -import org.jgrapht.Graph; -import org.jgrapht.GraphTests; -import org.jgrapht.alg.interfaces.MatchingAlgorithm; - -import java.math.BigDecimal; -import java.util.*; - -/* -Maximum weight matching in bipartite graphs with strictly integer edge weights, found using the -unscaled forward auction algorithm - */ - -public class MaximumWeightBipartiteAuctionMatching implements MatchingAlgorithm { - - private final Graph graph; - private final Set partition1; - private final Set partition2; - private final BigDecimal delta; - private final Set matching; - private BigDecimal matchingWeight; - private boolean swappedPartitions = false; - - public MaximumWeightBipartiteAuctionMatching(Graph graph, Set partition1, Set partition2) { - this.graph = GraphTests.requireUndirected(graph); - this.partition1 = Objects.requireNonNull(partition1, "Partition 1 cannot be null"); - this.partition2 = Objects.requireNonNull(partition2, "Partition 2 cannot be null"); - int n = Math.max(partition1.size(), partition2.size()); - this.delta = BigDecimal.valueOf(1 / ((double) n + 1)); -// this.delta = BigDecimal.valueOf(n/2); - this.matching = new LinkedHashSet<>(); - this.matchingWeight = BigDecimal.ZERO; - } - - - /* - Method coded using MaximumWeightBipartiteMatching.class from JgraphT as a model - */ - @Override - public Matching getMatching() { - - /* - * Test input instance - */ - if (!GraphTests.isSimple(graph)) { - throw new IllegalArgumentException("Only simple graphs supported"); - } - if (!GraphTests.isBipartitePartition(graph, partition1, partition2)) { - throw new IllegalArgumentException("Graph partition is not bipartite"); - } - - /* - If the two partitions are different sizes, the bidders must be the smaller of the two partitions. - */ - Set items; - Set bidders; - if (partition2.size() >= partition1.size()) { - bidders = partition1; - items = partition2; - } - else { - bidders = partition2; - items = partition1; - swappedPartitions = true; - } - - /* - Create a map to track the owner of each item, which is initially null, - and a map to track the price of each item, which is initially 0. - */ - Map owners = new HashMap<>(); - Map prices = new HashMap<>(); - for(V item: items) { - owners.put(item, null); - prices.put(item, BigDecimal.ZERO); - } - - //Initialize queue of all bidders that don't currently own an item - Queue unmatchedBidders = new ArrayDeque<>(); - for(V bidder: bidders) { - unmatchedBidders.offer(bidder); - } - - while (unmatchedBidders.size() > 0) { - V bidder = unmatchedBidders.poll(); - V item = null; - BigDecimal bestValue = BigDecimal.valueOf(-1.0); - //find the item that offers the best value for this bidder - for (E edge: graph.edgesOf(bidder)) { - double weight = graph.getEdgeWeight(edge); - if(weight == 0.0) { - continue; - } - V tmp = getItem(bidder, edge); - BigDecimal value = BigDecimal.valueOf(weight).subtract(prices.get(tmp)); - if (value.compareTo(bestValue) >= 0) { - bestValue = value; - item = tmp; - } - } - if(bestValue.compareTo(BigDecimal.ZERO) >= 0) { - V formerOwner = owners.get(item); - BigDecimal formerPrice = prices.get(item); - if (formerOwner != null) { - unmatchedBidders.offer(formerOwner); - } - owners.put(item, bidder); - prices.put(item, formerPrice.add(delta)); - } - } - for (V item: owners.keySet()) { - if (owners.get(item) != null) { - matching.add(graph.getEdge(item, owners.get(item))); - } - } - - for(E edge: matching) { - this.matchingWeight = this.matchingWeight.add(BigDecimal.valueOf(graph.getEdgeWeight(edge))); - } - - - return new MatchingImpl<>(graph, matching, matchingWeight.doubleValue()); - } - - private V getItem(V bidder, E edge) { - if (swappedPartitions) { - return graph.getEdgeSource(edge); - } - else { - return graph.getEdgeTarget(edge); - } - } - - private V getBidder(V item, E edge) { - if (swappedPartitions) { - return graph.getEdgeTarget(edge); - } - else { - return graph.getEdgeSource(edge); - } - } - - public BigDecimal getMatchingWeight() { - return matchingWeight; - } -}