update output
This commit is contained in:
@@ -28,8 +28,8 @@ class Result:
|
|||||||
def print_initial_inputs(
|
def print_initial_inputs(
|
||||||
C: np.array, # Vector of objective function coefficients
|
C: np.array, # Vector of objective function coefficients
|
||||||
A: np.array, # Matrix of constraint coefficients
|
A: np.array, # Matrix of constraint coefficients
|
||||||
x_0: np.array, # Initial point (vector)
|
|
||||||
b: np.array, # Vector of right-hand side values of constraints
|
b: np.array, # Vector of right-hand side values of constraints
|
||||||
|
x_0: np.array, # Initial point (vector)
|
||||||
eps: np.float64 = 0.01, # Solution accuracy
|
eps: np.float64 = 0.01, # Solution accuracy
|
||||||
alpha: np.float64 = 0.5, # Step coefficient
|
alpha: np.float64 = 0.5, # Step coefficient
|
||||||
maximize: bool = True):
|
maximize: bool = True):
|
||||||
@@ -49,11 +49,11 @@ def print_initial_inputs(
|
|||||||
z_str = "z = "
|
z_str = "z = "
|
||||||
previousIsZero = True
|
previousIsZero = True
|
||||||
lastNonZero = False
|
lastNonZero = False
|
||||||
for i in range(len(C)):
|
for i in range(C.shape[0]):
|
||||||
|
|
||||||
isNegative = False
|
isNegative = False
|
||||||
|
|
||||||
for k in range(len(C)):
|
for k in range(C.shape[0]):
|
||||||
|
|
||||||
if (C[k] == 0):
|
if (C[k] == 0):
|
||||||
|
|
||||||
@@ -82,13 +82,13 @@ def print_initial_inputs(
|
|||||||
|
|
||||||
print(z_str)
|
print(z_str)
|
||||||
print("\nsubject to the constrains:\n")
|
print("\nsubject to the constrains:\n")
|
||||||
for i in range(len(b)):
|
for i in range(b.shape[0]):
|
||||||
c_str = ""
|
c_str = ""
|
||||||
previousIsZero = True
|
previousIsZero = True
|
||||||
lastNonZero = False
|
lastNonZero = False
|
||||||
for j in range(len(A[i])):
|
for j in range(A.shape[1]):
|
||||||
isNegative = False
|
isNegative = False
|
||||||
for k in range(j, len(A[i])):
|
for k in range(j, A.shape[1]):
|
||||||
|
|
||||||
if (A[i][k] == 0):
|
if (A[i][k] == 0):
|
||||||
|
|
||||||
@@ -154,11 +154,11 @@ def interior_point(
|
|||||||
A: np.array, # Matrix of constraint coefficients
|
A: np.array, # Matrix of constraint coefficients
|
||||||
b: np.array, # Vector of right-hand side values of constraints
|
b: np.array, # Vector of right-hand side values of constraints
|
||||||
x_0: np.array, # Initial point (vector)
|
x_0: np.array, # Initial point (vector)
|
||||||
eps: np.float64 = 0.01, # Solution accuracy
|
eps: np.float64 = 1e-6, # Solution accuracy
|
||||||
alpha: np.float64 = 0.5, # Step coefficient
|
alpha: np.float64 = 0.5, # Step coefficient
|
||||||
maximizing: bool = True) -> Result: # Flag for maximization or minimization
|
maximizing: bool = True) -> Result: # Flag for maximization or minimization
|
||||||
# Check if the method is applicable: the initial point must satisfy the constraints
|
# Check if the method is applicable: the initial point must satisfy the constraints
|
||||||
if (not np.all(np.dot(A, x_0) <= b) or np.any(x_0 == 0)):
|
if (not np.all(np.dot(A, x_0) <= b) or np.any(x_0 <= 0)):
|
||||||
return Result(State.INAPPLICABLE, maximize=maximizing)
|
return Result(State.INAPPLICABLE, maximize=maximizing)
|
||||||
# If the problem is a minimization, invert the coefficients of the objective function
|
# If the problem is a minimization, invert the coefficients of the objective function
|
||||||
if (not maximizing):
|
if (not maximizing):
|
||||||
@@ -201,7 +201,9 @@ def interior_point(
|
|||||||
# Check the stopping criterion based on accuracy
|
# Check the stopping criterion based on accuracy
|
||||||
if np.linalg.norm(x_new - x) <= eps:
|
if np.linalg.norm(x_new - x) <= eps:
|
||||||
result = np.dot(C, x) if (maximizing) else -np.dot(C, x)
|
result = np.dot(C, x) if (maximizing) else -np.dot(C, x)
|
||||||
return Result(State.SOLVED, objective_function_value=result, solution=x, maximize=maximizing)
|
return Result(
|
||||||
|
State.SOLVED, objective_function_value=np.round(result, 3), solution=np.round(x, 3), maximize=maximizing
|
||||||
|
)
|
||||||
|
|
||||||
iteration += 1
|
iteration += 1
|
||||||
|
|
||||||
@@ -224,7 +226,7 @@ def TEST_CASE_GENERAL_A05():
|
|||||||
[0, 1]])
|
[0, 1]])
|
||||||
b = np.array([24, 6, 1, 2])
|
b = np.array([24, 6, 1, 2])
|
||||||
x_0 = np.array([1, 1])
|
x_0 = np.array([1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.5
|
alpha = 0.5
|
||||||
maximize = True
|
maximize = True
|
||||||
|
|
||||||
@@ -257,7 +259,7 @@ def TEST_CASE_GENERAL_A09():
|
|||||||
[0, 1]])
|
[0, 1]])
|
||||||
b = np.array([24, 6, 1, 2])
|
b = np.array([24, 6, 1, 2])
|
||||||
x_0 = np.array([1, 1])
|
x_0 = np.array([1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.9
|
alpha = 0.9
|
||||||
maximize = True
|
maximize = True
|
||||||
|
|
||||||
@@ -288,7 +290,7 @@ def TEST_MINIMIZE_CASE_A05():
|
|||||||
[1, -1, 2]])
|
[1, -1, 2]])
|
||||||
b = np.array([24, 23, 10])
|
b = np.array([24, 23, 10])
|
||||||
x_0 = np.array([1, 1, 1])
|
x_0 = np.array([1, 1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.5
|
alpha = 0.5
|
||||||
maximize = False
|
maximize = False
|
||||||
|
|
||||||
@@ -320,7 +322,7 @@ def TEST_MINIMIZE_CASE_A09():
|
|||||||
[1, -1, 2]])
|
[1, -1, 2]])
|
||||||
b = np.array([24, 23, 10])
|
b = np.array([24, 23, 10])
|
||||||
x_0 = np.array([1, 1, 1])
|
x_0 = np.array([1, 1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.9
|
alpha = 0.9
|
||||||
maximize = True
|
maximize = True
|
||||||
|
|
||||||
@@ -353,7 +355,7 @@ def TEST_WITH_SLACK_CASE_A05():
|
|||||||
[3, 2, 0, 1]])
|
[3, 2, 0, 1]])
|
||||||
b = np.array([10, 18, 36])
|
b = np.array([10, 18, 36])
|
||||||
x_0 = np.array([1, 1, 1, 1])
|
x_0 = np.array([1, 1, 1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.5
|
alpha = 0.5
|
||||||
maximize = True
|
maximize = True
|
||||||
|
|
||||||
@@ -385,7 +387,7 @@ def TEST_WITH_SLACK_CASE_A09():
|
|||||||
[3, 2, 0, 1]])
|
[3, 2, 0, 1]])
|
||||||
b = np.array([10, 18, 36])
|
b = np.array([10, 18, 36])
|
||||||
x_0 = np.array([1, 1, 1, 1])
|
x_0 = np.array([1, 1, 1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.9
|
alpha = 0.9
|
||||||
maximize = True
|
maximize = True
|
||||||
|
|
||||||
@@ -416,14 +418,14 @@ def TEST_UNBOUNDED_CASE_A05():
|
|||||||
[2, 0]])
|
[2, 0]])
|
||||||
b = np.array([10, 40])
|
b = np.array([10, 40])
|
||||||
x_0 = np.array([1, 1])
|
x_0 = np.array([1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.5
|
alpha = 0.5
|
||||||
maximize = True
|
maximize = True
|
||||||
|
|
||||||
print_initial_inputs(C, A, b, x_0, eps, alpha, maximize)
|
print_initial_inputs(C, A, b, x_0, eps, alpha, maximize)
|
||||||
result = interior_point(C, A, b, x_0, eps, alpha, maximize)
|
result = interior_point(C, A, b, x_0, eps, alpha, maximize)
|
||||||
|
|
||||||
expected_state = State.SOLVED
|
expected_state = State.UNSOLVED
|
||||||
if result.state == expected_state:
|
if result.state == expected_state:
|
||||||
print_result(result)
|
print_result(result)
|
||||||
return 1
|
return 1
|
||||||
@@ -448,14 +450,14 @@ def TEST_UNBOUNDED_CASE_A09():
|
|||||||
[2, 0]])
|
[2, 0]])
|
||||||
b = np.array([10, 40])
|
b = np.array([10, 40])
|
||||||
x_0 = np.array([1, 1])
|
x_0 = np.array([1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.9
|
alpha = 0.9
|
||||||
maximize = True
|
maximize = True
|
||||||
|
|
||||||
print_initial_inputs(C, A, b, x_0, eps, alpha, maximize)
|
print_initial_inputs(C, A, b, x_0, eps, alpha, maximize)
|
||||||
result = interior_point(C, A, b, x_0, eps, alpha, maximize)
|
result = interior_point(C, A, b, x_0, eps, alpha, maximize)
|
||||||
|
|
||||||
expected_state = State.SOLVED
|
expected_state = State.UNSOLVED
|
||||||
if result.state == expected_state:
|
if result.state == expected_state:
|
||||||
print_result(result)
|
print_result(result)
|
||||||
return 1
|
return 1
|
||||||
@@ -482,14 +484,14 @@ def TEST_UNSOLVABLE_CASE_A05():
|
|||||||
[0, 1, 1, -5, 1]])
|
[0, 1, 1, -5, 1]])
|
||||||
b = np.array([-24, 6, 1, 2])
|
b = np.array([-24, 6, 1, 2])
|
||||||
x_0 = np.array([-2, -3, -1, -1, 1])
|
x_0 = np.array([-2, -3, -1, -1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.5
|
alpha = 0.5
|
||||||
maximize = True
|
maximize = True
|
||||||
|
|
||||||
print_initial_inputs(C, A, b, x_0, eps, alpha, maximize)
|
print_initial_inputs(C, A, b, x_0, eps, alpha, maximize)
|
||||||
result = interior_point(C, A, b, x_0, eps, alpha, maximize)
|
result = interior_point(C, A, b, x_0, eps, alpha, maximize)
|
||||||
|
|
||||||
expected_state = State.SOLVED
|
expected_state = State.INAPPLICABLE
|
||||||
if result.state == expected_state:
|
if result.state == expected_state:
|
||||||
print_result(result)
|
print_result(result)
|
||||||
return 1
|
return 1
|
||||||
@@ -517,14 +519,14 @@ def TEST_UNSOLVABLE_CASE_A09():
|
|||||||
[0, 1, 1, -5, 1]])
|
[0, 1, 1, -5, 1]])
|
||||||
b = np.array([-24, 6, 1, 2])
|
b = np.array([-24, 6, 1, 2])
|
||||||
x_0 = np.array([-2, -3, -1, -1, 1])
|
x_0 = np.array([-2, -3, -1, -1, 1])
|
||||||
eps = 0.01
|
eps = 1e-4
|
||||||
alpha = 0.9
|
alpha = 0.9
|
||||||
maximize = True
|
maximize = True
|
||||||
|
|
||||||
print_initial_inputs(C, A, b, x_0, eps, alpha, maximize)
|
print_initial_inputs(C, A, b, x_0, eps, alpha, maximize)
|
||||||
result = interior_point(C, A, b, x_0, eps, alpha, maximize)
|
result = interior_point(C, A, b, x_0, eps, alpha, maximize)
|
||||||
|
|
||||||
expected_state = State.SOLVED
|
expected_state = State.INAPPLICABLE
|
||||||
if result.state == expected_state:
|
if result.state == expected_state:
|
||||||
print_result(result)
|
print_result(result)
|
||||||
return 1
|
return 1
|
||||||
@@ -541,18 +543,37 @@ def TEST_UNSOLVABLE_CASE_A09():
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
simplex_general_case_decVar_str = ("----------------------------SIMPLEX_TEST_GENERAL_CASE----------------------------\n"
|
||||||
|
"Decision variables: [3, 1.5]")
|
||||||
|
simplex_minimize_case_decVar_str = ("----------------------------SIMPLEX_TEST_MINIMIZE_CASE"
|
||||||
|
"----------------------------\n"
|
||||||
|
"Decision variables: [0, 0.75, 5.375]")
|
||||||
|
simplex_slack_case_decVar_str = ("----------------------------SIMPLEX_TEST_SLACK_CASE----------------------------\n"
|
||||||
|
"Decision variables: [11.5, 0.75, 0, 0]")
|
||||||
|
simplex_unbounded_case_decVar_str = ("----------------------------SIMPLEX_TEST_UNBOUNDED_CASE"
|
||||||
|
"----------------------------\n"
|
||||||
|
"Decision variables: None")
|
||||||
|
simplex_unsolvable_case_decVar_str = ("----------------------------SIMPLEX_TEST_UNSOLVABLE_CASE"
|
||||||
|
"----------------------------\n"
|
||||||
|
"Decision variables: None")
|
||||||
|
|
||||||
|
|
||||||
tests = [
|
tests = [
|
||||||
TEST_CASE_GENERAL_A05(), TEST_CASE_GENERAL_A09(),
|
[TEST_CASE_GENERAL_A05(), TEST_CASE_GENERAL_A09(), simplex_general_case_decVar_str],
|
||||||
TEST_MINIMIZE_CASE_A05(), TEST_MINIMIZE_CASE_A09(),
|
[TEST_MINIMIZE_CASE_A05(), TEST_MINIMIZE_CASE_A09(), simplex_minimize_case_decVar_str],
|
||||||
TEST_WITH_SLACK_CASE_A05(), TEST_WITH_SLACK_CASE_A09(),
|
[TEST_WITH_SLACK_CASE_A05(), TEST_WITH_SLACK_CASE_A09(), simplex_slack_case_decVar_str],
|
||||||
TEST_UNBOUNDED_CASE_A05(), TEST_UNBOUNDED_CASE_A09(),
|
[TEST_UNBOUNDED_CASE_A05(), TEST_UNBOUNDED_CASE_A09(), simplex_unbounded_case_decVar_str],
|
||||||
TEST_UNSOLVABLE_CASE_A05(), TEST_UNSOLVABLE_CASE_A09()
|
[TEST_UNSOLVABLE_CASE_A05(), TEST_UNSOLVABLE_CASE_A09(), simplex_unsolvable_case_decVar_str]
|
||||||
]
|
]
|
||||||
tests_passed = 0
|
tests_passed = 0
|
||||||
for test in tests:
|
for test in tests:
|
||||||
tests_passed += test
|
for test_variant_i in range(len(test)):
|
||||||
|
if (test_variant_i == 2):
|
||||||
|
print(test[2])
|
||||||
|
else:
|
||||||
|
tests_passed += test[test_variant_i]
|
||||||
|
|
||||||
|
|
||||||
print("----------------------------RESULTS----------------------------")
|
print("----------------------------RESULTS----------------------------")
|
||||||
print("Total number of tests: ", tests.size())
|
print(f"Total number of tests: {len(tests) * 2}")
|
||||||
print("Total number of passed tests: ", tests_passed)
|
print(f"Total number of passed tests: {tests_passed}")
|
||||||
|
|||||||
Reference in New Issue
Block a user