#Region Project Attributes
#MainFormWidth: 600
#MainFormHeight: 600
#End Region
#AdditionalJar: ortools-java-9.14.6206
#AdditionalJar: com.sun.jna_5.13.0
Sub Process_Globals
Private fx As JFX
Private MainForm As Form
Private xui As XUI
Private Button1 As B4XView
Dim nativeMe As JavaObject
End Sub
Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.RootPane.LoadLayout("Layout1")
MainForm.Show
nativeMe = Me
Dim aa(1) As String
aa(0) = ""
nativeMe.RunMethod("main1", Array(aa))
End Sub
Sub Button1_Click
xui.MsgboxAsync("Hello World!", "B4X")
End Sub
#if Java
import com.google.ortools.Loader;
import com.google.ortools.graph.MaxFlow;
import com.google.ortools.graph.MinCostFlow;
/**
* Sample showing how to model using the flow solver.
*
*/
private static void solveMinCostFlow() {
System.out.println("Min Cost Flow Problem - Simple interface");
final int numSources = 4;
final int numTargets = 4;
final int[][] costs = {
{90, 75, 75, 80}, {35, 85, 55, 65}, {125, 95, 90, 105}, {45, 110, 95, 115}};
final int expectedCost = 275;
MinCostFlow minCostFlow = new MinCostFlow();
for (int source = 0; source < numSources; ++source) {
for (int target = 0; target < numTargets; ++target) {
minCostFlow.addArcWithCapacityAndUnitCost(
source, numSources + target, 1, costs[source][target]);
}
}
for (int node = 0; node < numSources; ++node) {
minCostFlow.setNodeSupply(node, 1);
minCostFlow.setNodeSupply(numSources + node, -1);
}
if (minCostFlow.solve() == MinCostFlow.Status.OPTIMAL) {
final long totalFlowCost = minCostFlow.getOptimalCost();
System.out.println("total flow = " + totalFlowCost + "/" + expectedCost);
for (int i = 0; i < minCostFlow.getNumArcs(); ++i) {
if (minCostFlow.getFlow(i) > 0) {
System.out.println("From source " + minCostFlow.getTail(i) + " to target "
+ minCostFlow.getHead(i) + ": cost " + minCostFlow.getUnitCost(i));
}
}
} else {
System.out.println("No solution found");
}
}
private static void solveMaxFlow() {
System.out.println("Max Flow Problem - Simple interface");
final int[] tails = {0, 0, 0, 0, 1, 2, 3, 3, 4};
final int[] heads = {1, 2, 3, 4, 3, 4, 4, 5, 5};
final int[] capacities = {5, 8, 5, 3, 4, 5, 6, 6, 4};
final int expectedTotalFlow = 10;
MaxFlow maxFlow = new MaxFlow();
for (int i = 0; i < tails.length; ++i) {
maxFlow.addArcWithCapacity(tails[i], heads[i], capacities[i]);
}
if (maxFlow.solve(0, 5) == MaxFlow.Status.OPTIMAL) {
System.out.println("Total flow " + maxFlow.getOptimalFlow() + "/" + expectedTotalFlow);
for (int i = 0; i < maxFlow.getNumArcs(); ++i) {
System.out.println("From source " + maxFlow.getTail(i) + " to target " + maxFlow.getHead(i)
+ ": " + maxFlow.getFlow(i) + " / " + maxFlow.getCapacity(i));
}
// TODO(user): Our SWIG configuration does not currently handle these
// functions correctly in Java:
// maxFlow.getSourceSideMinCut(...);
// maxFlow.getSinkSideMinCut(...);
} else {
System.out.println("There was an issue with the input.");
}
}
public static void main1(String[] args) throws Exception {
Loader.loadNativeLibraries();
// System.load("C:/Users/Johans/Documents/B4J/orTools/orTools/Files/libortools.so");
solveMinCostFlow();
solveMaxFlow();
}
#End If