// LLP market clearing price: forbidden when item j is in a minimal // overdemanded set; advance raises its price by 1. class ConstrainedMarketClearingPrice { int[] ConstrainedMarketClearingPrice(int[][] v) { int n = v[0].length; int m = v.length; int[] G = new int[n]; forall k in [0..n-1] : G[k] = 0; forbidden (j) : isOverDemanded(j, v, G) => advance : G[j] = G[j] + 1; return G; } boolean isOverDemanded(int j, int[][] v, int[] G) { int n = G.length; int m = v.length; int demandCount = 0; int b = 0; while (b < m) { int best = v[b][j] - G[j]; boolean isBest = true; int i = 0; while (i < n) { if (v[b][i] - G[i] > best) { isBest = false; }; i = i + 1; }; if (isBest) { demandCount = demandCount + 1; }; b = b + 1; }; return demandCount > 1; } }