├── README.md ├── eLinked.java ├── eLinkedTest └── eLinkedTest.java ├── lab1 ├── ArabicCalc.java ├── Calculations.java ├── Main.java ├── NumberIdentifier.java ├── Operation.java └── RomanCalc.java ├── lab2 ├── AuxiliaryBehaviour.java ├── FunctionAgent.java ├── InitiatorBehaviour.java ├── Main.java ├── ProvideParametersBehaviour.java └── Transfer.java ├── lab3 ├── behaviour │ ├── EndNode.java │ ├── MasterAgentBehavior.java │ ├── Parallelism.java │ ├── ReceivingAndProcessingMSG.java │ ├── TerminationOfWork.java │ └── TheBestChoice.java └── container │ ├── Config.java │ ├── Main.java │ ├── NodeAgent.java │ └── xmlHandler.java ├── lab4 ├── Agent │ ├── Consumer.java │ ├── Distributer.java │ └── Producer.java ├── Behaviour │ ├── Consumer │ │ ├── LauncherConsumerFSM.java │ │ ├── ReceivingAnswerForConsumerParallel.java │ │ └── SendingTaskToAuction.java │ ├── Distributer │ │ ├── DistributerFSM.java │ │ ├── FSM │ │ │ ├── ChoosingBestPrice.java │ │ │ ├── Division │ │ │ │ ├── ChoosingBestPricesAfterDivision.java │ │ │ │ ├── DivisionContract.java │ │ │ │ ├── MinPriceTooLargeAfterDivision.java │ │ │ │ ├── ParallelAfterDivision.java │ │ │ │ ├── SendingReport.java │ │ │ │ ├── TheyDontHaveEnergy.java │ │ │ │ └── WaitingForConfirmAfterDivisionParallel.java │ │ │ ├── IBoughtEnergy.java │ │ │ ├── ReceivingPricesFromProducer.java │ │ │ └── WaitingForConfirmParallel.java │ │ ├── ReceiveTaskToAuction.java │ │ ├── SendTaskForTopic.java │ │ └── SendTopicNameForProducer.java │ └── Producer │ │ ├── FSM │ │ ├── AfterWin.java │ │ ├── ReceivingPrices.java │ │ ├── SendingPrice.java │ │ ├── StateOfEnergy.java │ │ └── WaitingForDecision.java │ │ ├── ProducerFSM.java │ │ └── ReceiveTask.java ├── Config │ ├── Coefficients.java │ ├── Data.java │ ├── DistributerConfig.java │ ├── GenerationData.java │ └── Parameters.java ├── Helper │ ├── DfHelper.java │ ├── TimeHelper.java │ └── XMLHelper.java ├── lab4new │ ├── Agents │ │ ├── Consumer.java │ │ ├── Distributor.java │ │ ├── Producer.java │ │ └── Smith.java │ ├── Auto │ │ ├── ConfigReader.java │ │ ├── JExcelHelper.java │ │ ├── Main.java │ │ ├── Parameters.java │ │ └── SmithBeh.java │ ├── ChatRoom │ │ ├── DistributorChat.java │ │ └── ProducerChat.java │ ├── consumer │ │ └── ConsumerSendReqToDistributorBeh.java │ ├── distributor │ │ ├── DistributorGetReqFromConsumerBehavior.java │ │ ├── DistributorGetRespFromProducerBehavior.java │ │ ├── DistributorSendMessageStartChat.java │ │ ├── DistributorSendOrderToProducerBehaviour.java │ │ ├── DistributorSendReqToProducerBehavior.java │ │ └── DistributorSendRespToConsumerBehaviour.java │ └── producer │ │ ├── ProducerBeh.java │ │ ├── ProducerGetOrderFromDistributorBeh.java │ │ ├── ProducerGetReqFromDistributorBehavior.java │ │ └── ProducerWaitStartChat.java └── lab4other │ ├── Auto │ ├── Coefficients.java │ ├── JExcelHelper.java │ └── Parameters.java │ ├── Consumer │ ├── AgentConsumer.java │ └── Behaviors │ │ ├── ActiveBehavior.java │ │ ├── DiscoverLoadBehavior.java │ │ ├── SendRequestAndWaitBehavior.java │ │ └── TimeToEatBehavior.java │ ├── Distributor │ ├── AgentDistributor.java │ └── Behaviors │ │ ├── BetEndingBehavior.java │ │ ├── GetBetBehavior.java │ │ ├── TraderBehaviorFSM.java │ │ └── WaitConsumer.java │ ├── Master │ ├── Container.java │ ├── Definition.java │ ├── Launcher.java │ ├── Main.java │ ├── Meeting.java │ ├── TimeHandler.java │ ├── xlsxHandler.java │ └── xmlHandler.java │ └── Producer │ ├── AgentProducer.java │ ├── Battery.java │ ├── Behaviors │ ├── TopicDialogueBehavior.java │ └── WaitInviteBehavior.java │ ├── ProducerAgent.java │ └── ProducerBehavior.java └── testLab4 ├── TestAgents.java ├── TestBeh ├── ConsumerFSMTest.java ├── FSMTestВЭС.java ├── FSMTestСЭС.java └── FSMTestТЭС.java ├── TestScenarios.java └── TestUtil.java /README.md: -------------------------------------------------------------------------------- 1 | # Multi-Agent-System 2 | # Special eLinked. 3 | An updated sheet containing arrays of five elements under the hood and having links to each other 4 | # lab1. 5 | Specific calculator 6 | # lab2. 7 | Cooperation of agents to solve the optimization problem 8 | # lab3. 9 | Finding the Best Way (analog of Dijkstra's method) 10 | # lab4. 11 | An energy system based on the interaction of agents. 12 | The electricity market, where electricity consumers, electricity producers and distribution companies are present. 13 | Each element of the system is represented as an agent that performs a specific task 14 | -------------------------------------------------------------------------------- /eLinked.java: -------------------------------------------------------------------------------- 1 | package lab.pr; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.NoArgsConstructor; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.Arrays; 8 | import java.util.Collection; 9 | import java.util.Iterator; 10 | import java.util.concurrent.atomic.AtomicInteger; 11 | 12 | public class eLinked implements Collection { 13 | 14 | public int size; 15 | eLink first, last; 16 | 17 | @NoArgsConstructor 18 | @AllArgsConstructor 19 | public static class eLink { 20 | int size = 0; 21 | Object [] data = new Object[5]; 22 | eLink previous, next; 23 | } 24 | 25 | public eLinked() { clear(); } 26 | private void accept(Object object) { addLast((E) object); } 27 | 28 | @Override 29 | public void clear() { 30 | first = new eLink(); 31 | last = first; 32 | size = 0; 33 | } 34 | 35 | public boolean addAll(int index, @NotNull Collection collection) { 36 | AtomicInteger atomicIndex = new AtomicInteger(); 37 | collection.forEach(e -> { 38 | add(atomicIndex.addAndGet(index), e); 39 | atomicIndex.getAndIncrement(); 40 | }); 41 | return true; 42 | } 43 | 44 | public void add(int index, E element) { 45 | Object[] result = new Object[this.toArray().length + 1]; 46 | System.arraycopy(this.toArray(), 0, result, 0, index); 47 | System.arraycopy(this.toArray(), index, result, index + 1, this.toArray().length - index); 48 | result[index] = element; 49 | clear(); 50 | Arrays.stream(result).forEach(this::accept); 51 | } 52 | 53 | public void remove(int index) { 54 | Object[] result = new Object[this.toArray().length - 1]; 55 | if (index > 0) System.arraycopy(this.toArray(), 0, result, 0, index); 56 | if (result.length > index) System.arraycopy(this.toArray(), index + 1, result, index, this.toArray().length - index - 1); 57 | clear(); 58 | Arrays.stream(result).forEach(this::accept); 59 | } 60 | 61 | @Override 62 | public boolean removeAll(@NotNull Collection collection) { 63 | collection.stream().filter(object -> indexOf(object) > -1).forEach(object -> remove(indexOf(object))); 64 | return false; 65 | } 66 | 67 | public int indexOf(Object object) { 68 | for (int i = 0; i < size; i++) { 69 | if (get(i).equals(object)) return i; 70 | } return -1; 71 | } 72 | 73 | public void addFirst(E e){ 74 | if (first.data[0] != null) { 75 | eLink link = new eLink(); 76 | link.next = first; 77 | first.previous = link; 78 | first = link; 79 | link.data[4] = e; 80 | link.size++; 81 | } 82 | else 83 | if ((4 - first.size) >= 0) { 84 | first.data[4 - first.size] = e; 85 | first.size++; 86 | } 87 | size++; 88 | } 89 | 90 | public void addLast(E e) { 91 | if (last.data[4] != null) { 92 | eLink leLink = last; 93 | eLink eLink = new eLink(); 94 | eLink.data[0] = e; 95 | leLink.next = eLink; 96 | eLink.previous = last; 97 | last = eLink; 98 | size++; 99 | } else 100 | for (int i = 0; i < last.data.length; i++) { 101 | if (last.data[i] == null) { 102 | last.data[i] = e; 103 | size++; 104 | break; 105 | } 106 | } 107 | } 108 | 109 | @Override 110 | public Iterator iterator() { 111 | return new Iterator<>() { 112 | private eLink eLink = first; 113 | private int lastNode, nextNode = 0; 114 | 115 | @Override 116 | public boolean hasNext() { 117 | return nextNode < size; 118 | } 119 | 120 | @Override 121 | public E next() { 122 | nextNode++; 123 | if (lastNode == 5) { 124 | if (eLink.next != null) eLink = eLink.next; 125 | lastNode = 0; 126 | } 127 | return (E) eLink.data[lastNode++]; 128 | } 129 | }; 130 | } 131 | 132 | public E get(int index) { 133 | if (index <= size()) { 134 | AtomicInteger indexAtomic = new AtomicInteger(); 135 | for (E k : this) { 136 | if (indexAtomic.getAndIncrement() == index) return k; 137 | } 138 | } throw new IndexOutOfBoundsException(); 139 | } 140 | 141 | @Override 142 | public Object[] toArray() { 143 | Object[] array = new Object[size()]; 144 | AtomicInteger index = new AtomicInteger(); 145 | this.forEach(e -> array[index.getAndIncrement()] = e); 146 | return array; 147 | } 148 | 149 | @Override 150 | public boolean add(E e) { 151 | addLast(e); 152 | return true; 153 | } 154 | @Override 155 | public boolean remove(Object object) { 156 | remove(indexOf(object)); 157 | return false; 158 | } 159 | @Override 160 | public boolean containsAll(@NotNull Collection collection) { 161 | return collection.stream().allMatch(this::contains); 162 | } 163 | @Override 164 | public boolean addAll(@NotNull Collection collection) { return addAll(size, collection); } 165 | @Override 166 | public int size() { return size; } 167 | @Override 168 | public boolean isEmpty() { return size == 0; } 169 | @Override 170 | public boolean contains(Object object) { return indexOf(object) != -1; } 171 | @Override 172 | public boolean retainAll(@NotNull Collection collection) { return false; } 173 | @Override 174 | public T @NotNull [] toArray(@NotNull T @NotNull [] a) { return null; } 175 | } -------------------------------------------------------------------------------- /eLinkedTest/eLinkedTest.java: -------------------------------------------------------------------------------- 1 | package eLinkedTest; 2 | 3 | import lab.pr.eLinked; 4 | import org.junit.jupiter.api.Assertions; 5 | import org.junit.jupiter.api.Test; 6 | 7 | import java.util.List; 8 | 9 | class eLinkedTest { 10 | 11 | eLinked list = new eLinked<>(); 12 | @Test 13 | public void sizeTest() { 14 | list.addAll(List.of(0, 1, 2, 3, 4, 5)); 15 | Assertions.assertEquals(6, list.size()); 16 | } 17 | 18 | @Test 19 | public void addTest() { 20 | list.addFirst(4); 21 | list.addFirst(3); 22 | list.addFirst(2); 23 | list.addFirst(1); 24 | list.addFirst(0); 25 | list.add(8); 26 | list.add(9); 27 | Assertions.assertArrayEquals(new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, list.toArray()); 28 | } 29 | 30 | @Test 31 | public void isEmptyTest() { 32 | list.addAll(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); 33 | list.removeAll(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); 34 | Assertions.assertTrue(list.isEmpty()); 35 | } 36 | 37 | @Test 38 | public void containsTest() { 39 | list.addAll(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); 40 | Assertions.assertFalse(list.contains(13)); 41 | } 42 | 43 | @Test 44 | public void containsAll() { 45 | list.addAll(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)); 46 | Assertions.assertTrue(list.containsAll(List.of(0, 1, 2, 3, 4, 12))); 47 | } 48 | 49 | @Test 50 | public void iteratorTest() { 51 | int i = 0; 52 | list.addAll(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); 53 | for (Object object : list) { Assertions.assertEquals(i, object); i++; } 54 | } 55 | 56 | @Test 57 | public void clearTest() { 58 | list.addAll(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); 59 | list.clear(); 60 | Assertions.assertEquals(0, list.size); 61 | } 62 | 63 | @Test 64 | public void getTest() { 65 | list.addAll(List.of(6, 5, 5, 1, 3, 8, 9, 7, 8, 2)); 66 | Assertions.assertEquals(3, list.get(4)); 67 | } 68 | 69 | @Test 70 | public void removeByIndexTest() { 71 | list.addAll(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); 72 | list.remove(0); 73 | list.remove(2); 74 | Assertions.assertArrayEquals(new Integer[] {1, 2, 4, 5, 6, 7, 8, 9}, list.toArray()); 75 | } 76 | 77 | @Test 78 | public void addByIndexTest() { 79 | list.addAll(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); 80 | list.add(0, 7); 81 | list.add(2, 3); 82 | Assertions.assertArrayEquals(new Integer[] {7, 0, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9}, list.toArray()); 83 | } 84 | 85 | @Test 86 | public void removeByValueTest() { 87 | list.addAll(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); 88 | list.remove(2); 89 | Assertions.assertArrayEquals(new Integer[] {0, 1, 3, 4, 5, 6, 7, 8, 9}, list.toArray()); 90 | } 91 | 92 | @Test 93 | public void indexOfTest() { 94 | list.addAll(List.of(22, 33, 42, 55, 46, 524, 6, 77, 89, 9)); 95 | Assertions.assertEquals(4, list.indexOf(46)); 96 | } 97 | 98 | @Test 99 | public void sSizeTest() { 100 | list.addAll(List.of("a", "b", "c")); 101 | Assertions.assertEquals(3, list.size()); 102 | } 103 | 104 | @Test 105 | public void sAddTest() { 106 | list.addAll(List.of("a", "b", "c")); 107 | list.addFirst("d"); 108 | list.addFirst("e"); 109 | list.addFirst("f"); 110 | list.addFirst("g"); 111 | list.addFirst("h"); 112 | Assertions.assertArrayEquals(new String[] {"h", "g", "f", "e", "d", "a", "b", "c", }, list.toArray()); 113 | } 114 | 115 | @Test 116 | public void sIsEmptyTest() { 117 | list.addAll(List.of("a", "b", "c")); 118 | list.removeAll(List.of("a", "b", "c")); 119 | Assertions.assertTrue(list.isEmpty()); 120 | } 121 | 122 | @Test 123 | public void sContainsTest() { 124 | list.addAll(List.of("a", "b", "c")); 125 | Assertions.assertTrue(list.contains("b")); 126 | } 127 | 128 | @Test 129 | public void sContainsAll() { 130 | list.addAll(List.of("a", "b", "c")); 131 | Assertions.assertTrue(list.containsAll(List.of("a", "b", "c"))); 132 | } 133 | 134 | @Test 135 | public void sIteratorTest() { 136 | list.addAll(List.of("a", "b", "c")); 137 | Assertions.assertEquals(list.get(0), "a"); 138 | Assertions.assertEquals(list.get(1), "b"); 139 | Assertions.assertEquals(list.get(2), "c"); 140 | } 141 | 142 | @Test 143 | public void sClearTest() { 144 | list.addAll(List.of("a", "b", "c")); 145 | list.clear(); 146 | Assertions.assertEquals(0, list.size); 147 | } 148 | 149 | @Test 150 | public void sGetTest() { 151 | list.addAll(List.of("a", "b", "c")); 152 | Assertions.assertEquals("a", list.get(0)); 153 | } 154 | 155 | @Test 156 | public void sRemoveByIndexTest() { 157 | list.addAll(List.of("a", "b", "c")); 158 | list.remove(0); 159 | list.remove(1); 160 | Assertions.assertArrayEquals(new String[] {"b"}, list.toArray()); 161 | } 162 | 163 | @Test 164 | public void sAddByIndexTest() { 165 | list.addAll(List.of("a", "b", "c")); 166 | list.add(0, "a"); 167 | list.add(1, "c"); 168 | Assertions.assertArrayEquals(new String[] {"a", "c", "a", "b", "c"}, list.toArray()); 169 | } 170 | 171 | @Test 172 | public void sRemoveByValueTest() { 173 | list.addAll(List.of("a", "b", "c")); 174 | list.remove("b"); 175 | Assertions.assertArrayEquals(new String[] {"a", "c"}, list.toArray()); 176 | } 177 | 178 | @Test 179 | public void sIndexOfTest() { 180 | list.addAll(List.of("a", "b", "c")); 181 | Assertions.assertEquals(2, list.indexOf("c")); 182 | } 183 | } -------------------------------------------------------------------------------- /lab1/ArabicCalc.java: -------------------------------------------------------------------------------- 1 | package lab.lab1; 2 | 3 | public class ArabicCalc extends Calculations { 4 | @Override 5 | public String addition(String numberOne, String numberTwo) { 6 | Operation execute = Integer::sum; 7 | return String.valueOf(execute.execute(Integer.parseInt(numberOne), Integer.parseInt(numberTwo))); 8 | } 9 | 10 | @Override 11 | public String subtraction(String numberOne, String numberTwo) { 12 | Operation execute = ((first, second) -> first - second); 13 | return String.valueOf(execute.execute(Integer.parseInt(numberOne), Integer.parseInt(numberTwo))); 14 | } 15 | 16 | @Override 17 | public String multiplication(String numberOne, String numberTwo) { 18 | Operation execute = ((first, second) -> first * second); 19 | return String.valueOf(execute.execute(Integer.parseInt(numberOne), Integer.parseInt(numberTwo))); 20 | } 21 | 22 | @Override 23 | public String division(String numberOne, String numberTwo) { 24 | Operation execute = ((first, second) -> ((int) Math.ceil(first * 1.0 / second))); 25 | return String.valueOf((execute.execute(Integer.parseInt(numberOne), Integer.parseInt(numberTwo)))); 26 | 27 | } 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /lab1/Calculations.java: -------------------------------------------------------------------------------- 1 | package lab.lab1; 2 | 3 | import java.io.IOException; 4 | 5 | public abstract class Calculations { 6 | abstract String addition(String first, String second) throws IOException; 7 | abstract String subtraction(String first, String second) throws IOException; 8 | abstract String multiplication(String first, String second) throws IOException; 9 | abstract String division(String first, String second) throws IOException; 10 | 11 | } 12 | -------------------------------------------------------------------------------- /lab1/Main.java: -------------------------------------------------------------------------------- 1 | package lab.lab1; 2 | 3 | import java.io.IOException; 4 | import java.util.Scanner; 5 | import java.util.concurrent.atomic.AtomicInteger; 6 | import java.util.stream.IntStream; 7 | 8 | import static lab.lab1.NumberIdentifier.isArabicNumber; 9 | import static lab.lab1.NumberIdentifier.isRomanNumber; 10 | 11 | 12 | public class Main { 13 | public static void main(String[] args) throws IOException { 14 | 15 | System.out.println("Enter the expression:"); 16 | Scanner scanner = new Scanner(System.in); 17 | String input = scanner.nextLine(); 18 | 19 | char[] operationCharacter = new char[] {'+', '-', '*', '/'}; 20 | AtomicInteger characterIndex = new AtomicInteger(-1); 21 | IntStream.range(0, 4).forEach(index -> { 22 | int intermediateIndex = input.indexOf(operationCharacter[index]); 23 | if(intermediateIndex > characterIndex.get()) characterIndex.set(intermediateIndex); 24 | }); 25 | 26 | String firstNumber_str = input.substring(0, characterIndex.get()); 27 | String secondNumber_str = input.substring(characterIndex.get() + 1); 28 | char character = input.charAt(characterIndex.get()); 29 | 30 | boolean firstNumberIsRoman_bool = isRomanNumber(firstNumber_str); 31 | boolean secondNumberIsRoman_bool = isRomanNumber(secondNumber_str); 32 | boolean firstNumberIsArabic_bool = isArabicNumber(firstNumber_str); 33 | boolean secondNumberIsArabic_bool = isArabicNumber(secondNumber_str); 34 | 35 | ArabicCalc arabicOperation = new ArabicCalc(); 36 | RomanCalc romanOperation = new RomanCalc(); 37 | String result = "Null"; 38 | 39 | if(firstNumberIsArabic_bool & secondNumberIsArabic_bool) { 40 | switch (character) { 41 | case '+' -> result = arabicOperation.addition(firstNumber_str, secondNumber_str); 42 | case '-' -> result = arabicOperation.subtraction(firstNumber_str, secondNumber_str); 43 | case '*' -> result = arabicOperation.multiplication(firstNumber_str, secondNumber_str); 44 | case '/' -> result = arabicOperation.division(firstNumber_str, secondNumber_str); 45 | } 46 | } 47 | else if(firstNumberIsRoman_bool & secondNumberIsRoman_bool) { 48 | switch (character) { 49 | case '+' -> result = romanOperation.addition(firstNumber_str, secondNumber_str); 50 | case '-' -> result = romanOperation.subtraction(firstNumber_str, secondNumber_str); 51 | case '*' -> result = romanOperation.multiplication(firstNumber_str, secondNumber_str); 52 | case '/' -> result = romanOperation.division(firstNumber_str, secondNumber_str); 53 | } 54 | } 55 | else { 56 | System.out.println("Invalid number format. Try again!"); 57 | System.exit(0); 58 | } 59 | System.out.println(result); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lab1/NumberIdentifier.java: -------------------------------------------------------------------------------- 1 | package lab.lab1; 2 | 3 | public class NumberIdentifier { 4 | public static boolean isArabicNumber(String number) { 5 | return switch (number) { 6 | case "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "40", "50", "90", "100" -> true; 7 | case "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XL", "L", "XC", "C" -> false; 8 | default -> throw new IllegalStateException("Unexpected value"); 9 | }; 10 | } 11 | 12 | public static boolean isRomanNumber(String number) { 13 | return switch (number) { 14 | case "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XL", "L", "XC", "C" -> true; 15 | case "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "40", "50", "90", "100" -> false; 16 | default -> throw new IllegalStateException("Unexpected value"); 17 | }; 18 | } 19 | 20 | 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /lab1/Operation.java: -------------------------------------------------------------------------------- 1 | package lab.lab1; 2 | 3 | public interface Operation { 4 | int execute (int first, int second); 5 | } 6 | -------------------------------------------------------------------------------- /lab1/RomanCalc.java: -------------------------------------------------------------------------------- 1 | package lab.lab1; 2 | 3 | import java.io.IOException; 4 | 5 | public class RomanCalc extends Calculations { 6 | @Override 7 | public String addition(String numberOne, String numberTwo) throws IOException { 8 | Operation execute = Integer::sum; 9 | return convertToRomanNumber(execute.execute(convertToArabicNumber(numberOne), convertToArabicNumber(numberTwo))); 10 | } 11 | 12 | @Override 13 | public String subtraction(String numberOne, String numberTwo) throws IOException { 14 | Operation execute = (first, second) -> first - second; 15 | return convertToRomanNumber(execute.execute(convertToArabicNumber(numberOne), convertToArabicNumber(numberTwo))); 16 | 17 | } 18 | 19 | @Override 20 | public String multiplication(String numberOne, String numberTwo) throws IOException { 21 | Operation execute = (first, second) -> first * second; 22 | return convertToRomanNumber(execute.execute(convertToArabicNumber(numberOne), convertToArabicNumber(numberTwo))); 23 | } 24 | 25 | @Override 26 | public String division(String numberOne, String numberTwo) throws IOException { 27 | Operation execute = (first, second) -> (first / second); 28 | return convertToRomanNumber(execute.execute(convertToArabicNumber(numberOne), convertToArabicNumber(numberTwo))); 29 | } 30 | 31 | public int convertToArabicNumber(String romanNumber) throws IOException { 32 | int arabicNumber; 33 | switch (romanNumber) { 34 | case "I" -> arabicNumber = 1; 35 | case "II" -> arabicNumber = 2; 36 | case "III" -> arabicNumber = 3; 37 | case "IV" -> arabicNumber = 4; 38 | case "V" -> arabicNumber = 5; 39 | case "VI" -> arabicNumber = 6; 40 | case "VII" -> arabicNumber = 7; 41 | case "VIII" -> arabicNumber = 8; 42 | case "IX" -> arabicNumber = 9; 43 | case "X" -> arabicNumber = 10; 44 | case "XL" -> arabicNumber = 40; 45 | case "L" -> arabicNumber = 50; 46 | case "XC" -> arabicNumber = 90; 47 | case "C" -> arabicNumber = 100; 48 | default -> throw new IOException("Invalid input data format"); 49 | } 50 | return arabicNumber; 51 | } 52 | 53 | 54 | private String convertToRomanNumber(int result) { 55 | int[] arabic = new int[]{ 100, 90, 50, 40, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 56 | String[] roman = new String[]{ "C", "XC", "L", "XL", "X", "IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I" }; 57 | if(result < 0) throw new Error("Not a positive result"); 58 | StringBuilder sb = new StringBuilder(); 59 | for (int i = 0; i < arabic.length; i++) { 60 | while (result >= arabic[i]){ 61 | result -= arabic[i]; 62 | sb.append(roman[i]); 63 | } 64 | } 65 | return sb.toString(); 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /lab2/AuxiliaryBehaviour.java: -------------------------------------------------------------------------------- 1 | package lab.lab2; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import jade.lang.acl.MessageTemplate; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | @Slf4j 12 | public class AuxiliaryBehaviour extends Behaviour { 13 | double x, delta; 14 | boolean exit; 15 | 16 | @Override 17 | public void action() { 18 | ACLMessage initiator = myAgent.receive(MessageTemplate.and(MessageTemplate.MatchPerformative(ACLMessage.REQUEST), 19 | MessageTemplate.MatchProtocol("CalcFunction"))); 20 | if(initiator != null) { 21 | 22 | List xANDdelta = List.of(initiator.getContent().split(", ")); 23 | x = Double.parseDouble(xANDdelta.get(0)); 24 | delta = Double.parseDouble(xANDdelta.get(1)); 25 | List points = List.of(x - delta, x, x + delta); 26 | 27 | List funcResult = new ArrayList<>(); 28 | switch (myAgent.getLocalName()) { 29 | case "FirstAgent" -> points.forEach(x -> funcResult.add(FunctionAgent.Calculation("FuncFirst", x))); 30 | case "SecondAgent" -> points.forEach(x -> funcResult.add(FunctionAgent.Calculation("FuncSecond", x))); 31 | case "ThirdAgent" -> points.forEach(x -> funcResult.add(FunctionAgent.Calculation("FuncThird", x))); 32 | } 33 | ACLMessage response = new ACLMessage(ACLMessage.REQUEST_WHEN); 34 | response.setProtocol("ResponseFromSlave"); 35 | response.setContent(funcResult.get(0) + ", " + funcResult.get(1) + ", " + funcResult.get(2)); 36 | response.addReceiver(new AID(initiator.getSender().getLocalName(), false)); 37 | myAgent.send(response); 38 | } 39 | else block(); 40 | } 41 | 42 | @Override 43 | public boolean done() { 44 | return exit; 45 | } 46 | } -------------------------------------------------------------------------------- /lab2/FunctionAgent.java: -------------------------------------------------------------------------------- 1 | package lab.lab2; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.lang.acl.ACLMessage; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | import java.util.List; 10 | import java.util.Random; 11 | 12 | import static java.lang.Math.cos; 13 | import static java.lang.Math.pow; 14 | 15 | @Slf4j 16 | public class FunctionAgent extends Agent { 17 | Random random = new Random(); 18 | double x = Math.random(); 19 | double delta = 0.5; 20 | List agents = List.of("SecondAgent", "ThirdAgent"); 21 | int initiator = random.nextInt(agents.size()); 22 | 23 | @Override 24 | protected void setup() { 25 | if (getLocalName().equals("FirstAgent")){ 26 | log.info(""" 27 | {} is the initiator 28 | The value of x = {} 29 | The value of delta = {}""", getLocalName(), x, delta); 30 | ACLMessage initTrans = new ACLMessage(ACLMessage.INFORM); 31 | initTrans.setProtocol("Initiator"); 32 | initTrans.setContent(x + ", " + delta); 33 | initTrans.addReceiver(new AID(agents.get(initiator), false)); 34 | send(initTrans); 35 | } 36 | addBehaviour(new AuxiliaryBehaviour()); 37 | addBehaviour(new InitiatorBehaviour()); 38 | } 39 | 40 | public static double Calculation(@NotNull String funcNum, double x) { 41 | double function = 0; 42 | return switch (funcNum) { 43 | case ("FuncFirst") -> -(0.5 * pow(x, 2)) - 4; 44 | case ("FuncSecond") -> pow(2, -(0.1 * x)); 45 | case ("FuncThird") -> cos(x); 46 | default -> function; 47 | }; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /lab2/InitiatorBehaviour.java: -------------------------------------------------------------------------------- 1 | package lab.lab2; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import jade.lang.acl.MessageTemplate; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | import java.util.ArrayList; 10 | import java.util.Arrays; 11 | import java.util.List; 12 | import java.util.stream.IntStream; 13 | 14 | @Slf4j 15 | public class InitiatorBehaviour extends Behaviour { 16 | boolean exit; 17 | double x, delta; 18 | List receivers = new ArrayList<>(); 19 | private final List agents = Arrays.asList("FirstAgent", "SecondAgent", "ThirdAgent"); 20 | private final List funcResultFirst = new ArrayList<>(), funcResultSecond = new ArrayList<>(), funcResultThird = new ArrayList<>(); 21 | 22 | @Override 23 | public void action() { 24 | ACLMessage msg = myAgent.receive(MessageTemplate.or(MessageTemplate.MatchProtocol("ResponseFromSlave"), 25 | MessageTemplate.MatchProtocol("Initiator"))); 26 | if (msg != null) { 27 | if (msg.getProtocol().equals("Initiator")) { 28 | 29 | List xANDdelta = new ArrayList<>(List.of(msg.getContent().split(","))); 30 | x = Double.parseDouble(xANDdelta.get(0)); 31 | delta = Double.parseDouble(xANDdelta.get(1)); 32 | List points = List.of(x - delta, x, x + delta); 33 | 34 | // log.info("{} is the initiator", myAgent.getLocalName()); 35 | switch (myAgent.getLocalName()) { 36 | case "FirstAgent" -> points.forEach(x -> funcResultFirst.add(FunctionAgent.Calculation("FuncFirst", x))); 37 | case "SecondAgent" -> points.forEach(x -> funcResultSecond.add(FunctionAgent.Calculation("FuncSecond", x))); 38 | case "ThirdAgent" -> points.forEach(x -> funcResultThird.add(FunctionAgent.Calculation("FuncThird", x))); 39 | } 40 | agents.forEach(agent -> { 41 | if (!myAgent.getLocalName().equals(agent)) 42 | receivers.add(new AID(agent, false)); 43 | }); 44 | myAgent.addBehaviour(new ProvideParametersBehaviour(myAgent,3000, receivers, x, delta)); 45 | } 46 | 47 | if (msg.getProtocol().equals("ResponseFromSlave")) { 48 | switch (msg.getSender().getLocalName()) { 49 | case "FirstAgent" -> Arrays.stream(msg.getContent().split(", ")).forEach(Fx1 -> funcResultFirst.add(Double.parseDouble(Fx1))); 50 | case "SecondAgent" -> Arrays.stream(msg.getContent().split(", ")).forEach(Fx2 -> funcResultSecond.add(Double.parseDouble(Fx2))); 51 | case "ThirdAgent" -> Arrays.stream(msg.getContent().split(", ")).forEach(Fx3 -> funcResultThird.add(Double.parseDouble(Fx3))); 52 | } 53 | } 54 | 55 | if (funcResultFirst.size() == 3 && funcResultSecond.size() == 3 && funcResultThird.size() == 3) { 56 | List funcValue = new ArrayList<>(); 57 | IntStream.range(0, 3).forEach(index -> funcValue.add(funcResultFirst.get(index) + funcResultSecond.get(index) + funcResultThird.get(index))); 58 | funcResultFirst.clear(); 59 | funcResultSecond.clear(); 60 | funcResultThird.clear(); 61 | receivers.clear(); 62 | 63 | double intermediateValueFunction = funcValue.get(0); 64 | int maxIndex = 0; 65 | for (int i = 0; i < funcValue.size(); i++) { 66 | if (funcValue.get(i) > intermediateValueFunction) { 67 | intermediateValueFunction = funcValue.get(i); 68 | maxIndex = i; 69 | } 70 | } 71 | switch (maxIndex) { 72 | case 0 -> check(x - delta, delta, maxIndex, funcValue); 73 | case 1 -> check(x, delta / 2, maxIndex, funcValue); 74 | case 2 -> check(x + delta, delta, maxIndex, funcValue); 75 | } 76 | } 77 | } 78 | else block(); 79 | } 80 | 81 | public void check(double x, double delta, int maxIndex, List funcValue) { 82 | // log.info("Intermediate value of the function: {}, The value of X = {}, The value of Delta = {}", 83 | // funcValue.get(maxIndex), x, delta); 84 | if (delta < 0.01) { 85 | log.info(""" 86 | Sufficient accuracy of calculations has been achieved! 87 | Maximum value of the function: {} 88 | The value of X = {} 89 | The value of Delta = {}""", funcValue.get(maxIndex), x, delta); 90 | exit = true; 91 | } 92 | else myAgent.addBehaviour(new Transfer(myAgent, 1000, x, delta)); 93 | } 94 | 95 | @Override 96 | public boolean done() { 97 | return exit; 98 | } 99 | } -------------------------------------------------------------------------------- /lab2/Main.java: -------------------------------------------------------------------------------- 1 | package lab.lab2; 2 | 3 | import jade.core.ProfileImpl; 4 | import jade.core.Runtime; 5 | import jade.util.leap.Properties; 6 | import jade.wrapper.AgentContainer; 7 | import jade.wrapper.AgentController; 8 | import lombok.SneakyThrows; 9 | 10 | public class Main { 11 | 12 | private static AgentContainer agentContainer; 13 | 14 | public static void main(String[] args) { 15 | Properties properties = new Properties(); 16 | properties.setProperty("gui", "true"); 17 | ProfileImpl profile = new ProfileImpl(properties); 18 | Runtime.instance().setCloseVM(true); 19 | agentContainer = Runtime.instance().createMainContainer(profile); 20 | createAgents("FirstAgent"); 21 | createAgents("SecondAgent"); 22 | createAgents("ThirdAgent"); 23 | } 24 | 25 | @SneakyThrows 26 | public static void createAgents(String name) { 27 | AgentController number = agentContainer.createNewAgent(name, FunctionAgent.class.getName(), new Object[]{}); 28 | number.start(); 29 | } 30 | } -------------------------------------------------------------------------------- /lab2/ProvideParametersBehaviour.java: -------------------------------------------------------------------------------- 1 | package lab.lab2; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.WakerBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | import java.util.List; 10 | @Slf4j 11 | public class ProvideParametersBehaviour extends WakerBehaviour { 12 | List receivers; 13 | double x, delta; 14 | 15 | public ProvideParametersBehaviour(Agent agent, long time, List receivers, double x, double delta) { 16 | super(agent, time); 17 | this.receivers = receivers; 18 | this.x = x; 19 | this.delta = delta; 20 | } 21 | 22 | @Override 23 | public void onWake() { 24 | receivers.forEach(receiver -> { 25 | ACLMessage transInit = new ACLMessage(ACLMessage.REQUEST); 26 | transInit.setProtocol("CalcFunction"); 27 | transInit.setContent(x + ", " + delta); 28 | transInit.addReceiver(receiver); 29 | myAgent.send(transInit); 30 | }); 31 | } 32 | } -------------------------------------------------------------------------------- /lab2/Transfer.java: -------------------------------------------------------------------------------- 1 | package lab.lab2; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.WakerBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | import java.util.Arrays; 10 | import java.util.List; 11 | import java.util.Random; 12 | 13 | @Slf4j 14 | public class Transfer extends WakerBehaviour { 15 | double x, delta; 16 | private final List agents = Arrays.asList("FirstAgent", "SecondAgent", "ThirdAgent"); 17 | private final Random random = new Random(); 18 | int initiator = random.nextInt(agents.size()); 19 | 20 | public Transfer(Agent agent, long time, double x, double delta) { 21 | super(agent, time); 22 | this.x = x; 23 | this.delta = delta; 24 | } 25 | 26 | @Override 27 | protected void onWake() { 28 | while (agents.get(initiator).equals(myAgent.getLocalName())){ 29 | initiator = random.nextInt(agents.size()); 30 | } 31 | ACLMessage initTrans = new ACLMessage(ACLMessage.INFORM); 32 | initTrans.setProtocol("Initiator"); 33 | initTrans.setContent(x + ", " + delta); 34 | initTrans.addReceiver(new AID(agents.get(initiator), false)); 35 | myAgent.send(initTrans); 36 | } 37 | } -------------------------------------------------------------------------------- /lab3/behaviour/EndNode.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.behaviour; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lombok.extern.slf4j.Slf4j; 7 | 8 | import java.util.ArrayList; 9 | import java.util.Collections; 10 | import java.util.List; 11 | @Slf4j 12 | public class EndNode extends Behaviour { 13 | private boolean exit; 14 | @Override 15 | public void action() { 16 | ACLMessage receive = getAgent().receive(MessageTemplate.MatchProtocol("estimate")); 17 | if (receive != null){ 18 | log.info("Tail (finite) found -> {}", getAgent().getLocalName()); 19 | List way = new ArrayList<>(); 20 | String[] intermediate = receive.getContent().split(";"); 21 | Collections.addAll(way, intermediate[0].replaceAll("[\\[\\]]", "").split(", ")); 22 | way.add(getAgent().getLocalName()); 23 | double actualWayWeight = Double.parseDouble(intermediate[1]); 24 | getAgent().addBehaviour(new Parallelism(new TheBestChoice(way, actualWayWeight, false), new TerminationOfWork(getAgent(), 5000))); 25 | exit = true; 26 | } 27 | } 28 | 29 | @Override 30 | public boolean done() { 31 | return exit; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lab3/behaviour/MasterAgentBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.behaviour; 2 | 3 | import lab.lab3.container.xmlHandler; 4 | import jade.core.AID; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lombok.AllArgsConstructor; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | import java.util.ArrayList; 12 | import java.util.Arrays; 13 | import java.util.List; 14 | import java.util.concurrent.atomic.AtomicBoolean; 15 | 16 | @AllArgsConstructor 17 | @Slf4j 18 | public class MasterAgentBehavior extends OneShotBehaviour { 19 | 20 | private List way; 21 | private String finite; 22 | private double weight; 23 | 24 | @Override 25 | public void action() { 26 | List actualWay = new ArrayList<>(way); 27 | actualWay.add(getAgent().getLocalName()); 28 | String[][] lists = xmlHandler.unMarshalAny(getAgent().getLocalName() + ".xml"); 29 | for (String[] list : lists) { 30 | if (filter(way, list[0], finite)) continue; 31 | if (goHome(finite, way)) break; 32 | ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 33 | double actualWeight = weight + Double.parseDouble(list[1]); 34 | msg.addReceiver(new AID(list[0], false)); 35 | msg.setContent(actualWay + ";" + actualWeight + ";" + finite); 36 | msg.setProtocol("neighbor"); 37 | getAgent().send(msg); 38 | } 39 | } 40 | 41 | private boolean filter(List nodeList, String agentNeighbor, String finite) { 42 | AtomicBoolean lever = new AtomicBoolean(false); 43 | if (nodeList != null) { 44 | nodeList.forEach(listz -> { 45 | if (listz.equals(agentNeighbor) & !finite.equals("start")) lever.set(true); 46 | }); 47 | } 48 | return lever.get(); 49 | } 50 | 51 | private boolean goHome(@NotNull String MSG, List way) { 52 | boolean lever = false; 53 | ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 54 | if (MSG.equals("start")) { 55 | int sender = way.indexOf(getAgent().getLocalName()); 56 | String receiver = way.get(sender - 1); 57 | msg.addReceiver(new AID(receiver, false)); 58 | msg.setContent(way + ";" + weight + ";" + MSG); 59 | msg.setProtocol("neighbor"); 60 | getAgent().send(msg); 61 | log.info("We're going back -> {} sends message to {} with good news!", getAgent().getLocalName(), receiver); 62 | lever = true; 63 | } 64 | return lever; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /lab3/behaviour/Parallelism.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.behaviour; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.core.behaviours.ParallelBehaviour; 5 | import jade.core.behaviours.WakerBehaviour; 6 | import lombok.AllArgsConstructor; 7 | 8 | @AllArgsConstructor 9 | public class Parallelism extends ParallelBehaviour { 10 | private final Behaviour TheBestChoice; 11 | private final WakerBehaviour TerminationOfWork; 12 | 13 | @Override 14 | public void onStart() { 15 | addSubBehaviour(TheBestChoice); 16 | addSubBehaviour(TerminationOfWork); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lab3/behaviour/ReceivingAndProcessingMSG.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.behaviour; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lombok.extern.slf4j.Slf4j; 7 | 8 | import java.util.*; 9 | 10 | @Slf4j 11 | public class ReceivingAndProcessingMSG extends Behaviour { 12 | private boolean exit; 13 | @Override 14 | public void action() { 15 | List way = new ArrayList<>(); 16 | ACLMessage receive = getAgent().receive(MessageTemplate.MatchProtocol("neighbor")); 17 | if (receive != null) { 18 | Collections.addAll(way, receive.getContent().split(";")[0].replaceAll("[\\[\\]]", "").split(", ")); 19 | double actualWayWeight = Double.parseDouble(receive.getContent().split(";")[1]); 20 | String finite = receive.getContent().split(";")[2]; 21 | if (finite.equals(getAgent().getLocalName())) { 22 | log.info("Finite got from {} -> way: {}, weight: {}", receive.getSender().getLocalName(), way, actualWayWeight); 23 | ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 24 | msg.setProtocol("estimate"); 25 | msg.setContent(receive.getContent()); 26 | msg.addReceiver(getAgent().getAID()); 27 | getAgent().send(msg); 28 | } 29 | else if (getAgent().getLocalName().equals(way.get(0)) & finite.equals("start")) { 30 | log.info("Algorithm has returned to start:\nBest way: {}\nBest weight: {}", way, actualWayWeight); 31 | exit = true; 32 | } else getAgent().addBehaviour(new MasterAgentBehavior(way, finite, actualWayWeight)); 33 | } 34 | } 35 | 36 | @Override 37 | public boolean done() { 38 | return exit; 39 | } 40 | } 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /lab3/behaviour/TerminationOfWork.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.behaviour; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.WakerBehaviour; 5 | 6 | public class TerminationOfWork extends WakerBehaviour { 7 | 8 | public static boolean lever = false; 9 | public TerminationOfWork(Agent agent, long time) { 10 | super(agent, time); 11 | } 12 | @Override 13 | protected void onWake() { 14 | lever = true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lab3/behaviour/TheBestChoice.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.behaviour; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lombok.AllArgsConstructor; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | import java.util.ArrayList; 10 | import java.util.Collections; 11 | import java.util.List; 12 | 13 | @Slf4j 14 | @AllArgsConstructor 15 | public class TheBestChoice extends Behaviour { 16 | private List bestWay; 17 | private double bestWeight; 18 | private boolean exit; 19 | 20 | @Override 21 | public void action() { 22 | ACLMessage receive = getAgent().receive(MessageTemplate.MatchProtocol("estimate")); 23 | if (receive != null) { 24 | List way = new ArrayList<>(); 25 | Collections.addAll(way, receive.getContent().split(";")[0].replaceAll("[\\[\\]]", "").split(", ")); 26 | double actualWayWeight = Double.parseDouble(receive.getContent().split(";")[1]); 27 | 28 | if (actualWayWeight < bestWeight) { 29 | bestWeight = actualWayWeight; 30 | way.add(getAgent().getLocalName()); 31 | bestWay = way; 32 | log.info("A new best way: {} with weight -> {}", bestWay, actualWayWeight); 33 | } 34 | } 35 | 36 | if (TerminationOfWork.lever) { 37 | exit = true; 38 | String finite = "start"; 39 | log.info("The final way: {}", bestWay); 40 | getAgent().addBehaviour(new MasterAgentBehavior(bestWay, finite, bestWeight)); 41 | } 42 | } 43 | 44 | @Override 45 | public boolean done() { 46 | return exit; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lab3/container/Config.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.container; 2 | 3 | 4 | import jakarta.xml.bind.annotation.*; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | @Data 9 | @XmlRootElement(name="cfg") 10 | @XmlAccessorType(XmlAccessType.FIELD) 11 | public class Config { 12 | @XmlElement 13 | private String name; 14 | @XmlElementWrapper(name="neighbors") 15 | @XmlElement(name="neighbor") 16 | private List nodes; 17 | } 18 | -------------------------------------------------------------------------------- /lab3/container/Main.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.container; 2 | 3 | import lab.lab3.behaviour.MasterAgentBehavior; 4 | import lab.lab3.behaviour.ReceivingAndProcessingMSG; 5 | import lab.lab3.behaviour.EndNode; 6 | import jade.core.Agent; 7 | import lombok.SneakyThrows; 8 | import org.apache.poi.ss.usermodel.Cell; 9 | import org.apache.poi.ss.usermodel.Row; 10 | import org.apache.poi.ss.usermodel.Sheet; 11 | import org.apache.poi.ss.usermodel.Workbook; 12 | import org.apache.poi.xssf.usermodel.XSSFWorkbook; 13 | 14 | import java.io.FileInputStream; 15 | import java.util.*; 16 | 17 | public class Main extends Agent { 18 | 19 | @SneakyThrows 20 | @Override 21 | protected void setup() { 22 | Config config = new Config(); 23 | FileInputStream inputStream = new FileInputStream("C:\\Users\\gamza\\IdeaProjects\\MAC\\src\\main\\resources\\mtrx.xlsx"); 24 | Workbook workbook = new XSSFWorkbook(inputStream); 25 | for (Sheet sheet : workbook) { 26 | int firstRow = sheet.getFirstRowNum(); 27 | int lastRow = sheet.getLastRowNum(); 28 | for (int index = firstRow; index <= lastRow; index++) { 29 | Map intermediate = new HashMap<>(); 30 | List nodes = new ArrayList<>(); 31 | Row row = sheet.getRow(index); 32 | for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) { 33 | Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); 34 | intermediate.put(cellIndex, cell.getNumericCellValue()); 35 | if (intermediate.get(cellIndex) != 0) nodes.add(new NodeAgent("Smith" + cellIndex, intermediate.get(cellIndex))); 36 | } 37 | config.setName("Smith" + index); 38 | config.setNodes(nodes); 39 | xmlHandler.marshalAny(Config.class, config, "Smith" + index + ".xml"); 40 | } 41 | } 42 | final int[] nodes = { 3, 10 }; 43 | if (getLocalName().equals("Smith" + nodes[0])) 44 | addBehaviour(new MasterAgentBehavior(new ArrayList<>(), "Smith" + nodes[1], 0)); 45 | addBehaviour(new ReceivingAndProcessingMSG()); 46 | addBehaviour(new EndNode()); 47 | } 48 | } 49 | 50 | -------------------------------------------------------------------------------- /lab3/container/NodeAgent.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.container; 2 | 3 | import jakarta.xml.bind.annotation.*; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | @XmlAccessorType(XmlAccessType.FIELD) 11 | public class NodeAgent { 12 | @XmlAttribute 13 | private String AgentName; 14 | @XmlAttribute 15 | private Double Weight; 16 | @Override 17 | public String toString() { 18 | return String.format("Neighbor -> AgentName %s, Weight %f", AgentName, Weight); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lab3/container/xmlHandler.java: -------------------------------------------------------------------------------- 1 | package lab.lab3.container; 2 | 3 | import jakarta.xml.bind.JAXBContext; 4 | import jakarta.xml.bind.JAXBException; 5 | import jakarta.xml.bind.Marshaller; 6 | import jakarta.xml.bind.Unmarshaller; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | import java.io.File; 10 | @Slf4j 11 | public class xmlHandler { 12 | 13 | public static String[][] unMarshalAny(String actualAgent) { 14 | String[][] neighborParameters = new String[0][]; 15 | try { 16 | JAXBContext jaxbContext = JAXBContext.newInstance(Config.class); 17 | Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 18 | Config object = (Config) jaxbUnmarshaller.unmarshal(new File(actualAgent)); 19 | int i = 0; 20 | int num = object.getNodes().size(); 21 | neighborParameters = new String[num][2]; 22 | for (NodeAgent nodeAgent : object.getNodes()){ 23 | neighborParameters[i][0] = nodeAgent.getAgentName(); 24 | neighborParameters[i][1] = String.valueOf(nodeAgent.getWeight()); 25 | i++; 26 | } 27 | } catch (JAXBException | ClassCastException e) { 28 | e.printStackTrace(); 29 | } 30 | return neighborParameters; 31 | } 32 | 33 | public static void marshalAny(Class clazz, T information, String outPutFileName) { 34 | try { 35 | JAXBContext jaxbContext = JAXBContext.newInstance(clazz); 36 | Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 37 | jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 38 | jaxbMarshaller.marshal(information, new File(outPutFileName)); 39 | } catch (JAXBException e) { 40 | e.printStackTrace(); 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /lab4/Agent/Consumer.java: -------------------------------------------------------------------------------- 1 | package lab4.Agent; 2 | 3 | import jade.core.Agent; 4 | import lab4.Behaviour.Consumer.LauncherConsumerFSM; 5 | import lab4.Config.Data; 6 | 7 | 8 | public class Consumer extends Agent { 9 | Data consumerData = new Data(); 10 | 11 | @Override 12 | protected void setup() { 13 | consumerData.setConsumerMaxPrice(300); 14 | addBehaviour(new LauncherConsumerFSM.ConsumerFSM(this, consumerData)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lab4/Agent/Distributer.java: -------------------------------------------------------------------------------- 1 | package lab4.Agent; 2 | 3 | import jade.core.Agent; 4 | import lab4.Behaviour.Distributer.ReceiveTaskToAuction; 5 | 6 | public class Distributer extends Agent { 7 | 8 | @Override 9 | protected void setup() { 10 | addBehaviour(new ReceiveTaskToAuction()); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /lab4/Agent/Producer.java: -------------------------------------------------------------------------------- 1 | package lab4.Agent; 2 | 3 | import jade.core.Agent; 4 | import lab4.Behaviour.Producer.ReceiveTask; 5 | import lab4.Config.GenerationData; 6 | import lab4.Config.Data; 7 | 8 | import static lab4.Helper.DfHelper.registration; 9 | 10 | public class Producer extends Agent { 11 | Data producerData = new Data(); 12 | 13 | @Override 14 | protected void setup() { 15 | registration("Production", getAID(), getLocalName(), this); 16 | switch (this.getLocalName()){ 17 | case "ТЭС" -> addBehaviour(new GenerationData(this, 75000, producerData, null, null)); 18 | case "СЭС" -> addBehaviour(new GenerationData(this, 75000, null, null, producerData)); 19 | case "ВЭС" -> addBehaviour(new GenerationData(this, 75000, null, producerData, null)); 20 | } 21 | addBehaviour(new ReceiveTask(producerData)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lab4/Behaviour/Consumer/LauncherConsumerFSM.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Consumer; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.FSMBehaviour; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import lab4.Config.Data; 7 | import lab4.Helper.TimeHelper; 8 | 9 | public class LauncherConsumerFSM extends OneShotBehaviour { 10 | Data consumerData; 11 | public LauncherConsumerFSM(Agent agent, Data consumerData) { 12 | super(agent); 13 | this.consumerData = consumerData; 14 | } 15 | 16 | @Override 17 | public void action() { 18 | getAgent().addBehaviour(new ConsumerFSM(getAgent(), consumerData)); 19 | } 20 | 21 | 22 | public static class ConsumerFSM extends FSMBehaviour { 23 | Data consumerData; 24 | Data onEnd = new Data(); 25 | 26 | public ConsumerFSM(Agent agent, Data consumerData) { 27 | super(agent); 28 | this.consumerData = consumerData; 29 | 30 | registerFirstState(new SendingTaskToAuction(getAgent(), TimeHelper.getDelay() + 2000, consumerData), "SendReq"); 31 | registerState(new ReceivingAnswerForConsumerParallel(getAgent(), consumerData, onEnd), "ReceiveAnswer"); 32 | registerLastState(new LauncherConsumerFSM(getAgent(), consumerData), "Restart"); 33 | registerDefaultTransition("SendReq", "ReceiveAnswer"); 34 | registerDefaultTransition("ReceiveAnswer", "Restart"); 35 | 36 | } 37 | 38 | } 39 | 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /lab4/Behaviour/Consumer/ReceivingAnswerForConsumerParallel.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Consumer; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.core.behaviours.ParallelBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import jade.lang.acl.MessageTemplate; 8 | import lab4.Config.Data; 9 | import lombok.extern.slf4j.Slf4j; 10 | import lab4.Config.Parameters.Color; 11 | 12 | import java.util.ArrayList; 13 | import java.util.Arrays; 14 | import java.util.List; 15 | 16 | @Slf4j 17 | public class ReceivingAnswerForConsumerParallel extends ParallelBehaviour { 18 | Data consumerData; 19 | Data onEnd; 20 | boolean onEndReceiveEnergy, onEndPriceTooLow, onEndHaveNoEnergy, onEndReceiveEnergyAfterDivision; 21 | 22 | public ReceivingAnswerForConsumerParallel(Agent agent, Data consumerData, Data onEnd) { 23 | super(agent, WHEN_ANY); 24 | this.consumerData = consumerData; 25 | this.onEnd = onEnd; 26 | 27 | addSubBehaviour(new Behaviour() { 28 | @Override 29 | public void action() { 30 | ACLMessage reply = getAgent().receive(MessageTemplate 31 | .and(MessageTemplate.MatchPerformative(ACLMessage.ACCEPT_PROPOSAL), MessageTemplate.MatchProtocol("IBoughtEnergy"))); 32 | if (reply != null) { 33 | log.info(Color.YELLOW + "{}: I bought {} kW power from {}" + Color.RESET, 34 | getAgent().getLocalName(), consumerData.getConsumerLoad(), reply.getContent()); 35 | onEndReceiveEnergy = true; 36 | } 37 | else block(); 38 | } 39 | @Override 40 | public boolean done() { 41 | return onEndReceiveEnergy; 42 | } 43 | }); 44 | 45 | addSubBehaviour(new Behaviour() { 46 | @Override 47 | public void action() { 48 | ACLMessage reply = getAgent().receive(MessageTemplate 49 | .and(MessageTemplate.MatchPerformative(ACLMessage.REJECT_PROPOSAL), MessageTemplate.MatchProtocol("MaxPriceTooLow"))); 50 | if (reply != null) { 51 | double lowestPriceInTrade = Double.parseDouble(reply.getContent()); 52 | consumerData.setConsumerMaxPrice(lowestPriceInTrade + 0.01); 53 | log.info("{}: my last price was too low, my new price is {}", getAgent().getLocalName(), lowestPriceInTrade); 54 | onEndPriceTooLow = true; 55 | } 56 | else block(); 57 | } 58 | @Override 59 | public boolean done() { 60 | return onEndPriceTooLow; 61 | } 62 | }); 63 | 64 | addSubBehaviour(new Behaviour() { 65 | @Override 66 | public void action() { 67 | ACLMessage reply = getAgent().receive(MessageTemplate 68 | .and(MessageTemplate.MatchPerformative(ACLMessage.REJECT_PROPOSAL), MessageTemplate.MatchProtocol("noEnergy"))); 69 | if (reply != null) { 70 | log.info(Color.RED + "{}: they don't have any energy for me" + Color.RESET, getAgent().getLocalName()); 71 | onEndHaveNoEnergy = true; 72 | } 73 | else block(); 74 | } 75 | @Override 76 | public boolean done() { 77 | return onEndHaveNoEnergy; 78 | } 79 | }); 80 | 81 | addSubBehaviour(new Behaviour() { 82 | @Override 83 | public void action() { 84 | ACLMessage reply = getAgent().receive(MessageTemplate 85 | .and(MessageTemplate.MatchPerformative(ACLMessage.ACCEPT_PROPOSAL), MessageTemplate.MatchProtocol("IBoughtEnergyAfterDivision"))); 86 | if (reply != null) { 87 | List producers = new ArrayList<>(Arrays.asList(reply.getContent().split(","))); 88 | log.info(Color.YELLOW + "{}: I bought {} kw power from {}" + Color.RESET, 89 | getAgent().getLocalName(), consumerData.getConsumerLoad() * producers.size() / 2, reply.getContent()); 90 | onEndReceiveEnergyAfterDivision = true; 91 | } 92 | else block(); 93 | } 94 | @Override 95 | public boolean done() { 96 | return onEndReceiveEnergyAfterDivision; 97 | } 98 | }); 99 | } 100 | 101 | @Override 102 | public int onEnd() { 103 | if (onEndReceiveEnergy) onEnd.setOnEnd(1); 104 | if (onEndPriceTooLow) onEnd.setOnEnd(2); 105 | if (onEndHaveNoEnergy) onEnd.setOnEnd(3); 106 | if (onEndReceiveEnergyAfterDivision) onEnd.setOnEnd(4); 107 | return super.onEnd(); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /lab4/Behaviour/Consumer/SendingTaskToAuction.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Consumer; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.WakerBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import jakarta.xml.bind.JAXBContext; 8 | import jakarta.xml.bind.Unmarshaller; 9 | import lab4.Config.Parameters; 10 | import lab4.Config.Parameters.Color; 11 | import lab4.Config.Data; 12 | import lab4.Helper.TimeHelper; 13 | import lombok.SneakyThrows; 14 | import lombok.extern.slf4j.Slf4j; 15 | 16 | import java.io.File; 17 | import java.util.List; 18 | @Slf4j 19 | public class SendingTaskToAuction extends WakerBehaviour { 20 | Data data; 21 | 22 | public SendingTaskToAuction(Agent agent, long timeout, Data data) { 23 | super(agent, timeout); 24 | this.data = data; 25 | } 26 | 27 | @Override 28 | protected void onWake() { 29 | Parameters parameters = getParameters(getAgent().getLocalName()); 30 | List load = parameters.getLoad(); 31 | log.info(Color.CYAN + "{}: My current load is {} it's {}:00 O'Clock" + Color.RESET, 32 | getAgent().getLocalName(), load.get(TimeHelper.getActualHour()), TimeHelper.getActualHour()); 33 | ACLMessage task = new ACLMessage(ACLMessage.REQUEST); 34 | data.setConsumerLoad(load.get(TimeHelper.getActualHour())); 35 | task.setContent(load.get(TimeHelper.getActualHour()) + "," + data.getConsumerMaxPrice()); 36 | task.setProtocol("Task"); 37 | task.addReceiver(new AID (parameters.getDistributer(), false)); 38 | getAgent().send(task); 39 | } 40 | 41 | @SneakyThrows 42 | public static Parameters getParameters(String name) { 43 | String cfgPath = "src/main/resources/" + name + ".xml"; 44 | JAXBContext jaxbContext = JAXBContext.newInstance(Parameters.class); 45 | Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 46 | return (Parameters) unmarshaller.unmarshal(new File(cfgPath)); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/DistributerFSM.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.FSMBehaviour; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import lab4.Behaviour.Distributer.FSM.*; 7 | import lab4.Behaviour.Distributer.FSM.Division.*; 8 | import lab4.Config.Data; 9 | import lab4.Config.Data.PriceWithName; 10 | 11 | public class DistributerFSM extends FSMBehaviour { 12 | Data pricesForDistributerData = new Data(); 13 | Data data; 14 | PriceWithName bestPrice = new PriceWithName(); 15 | public DistributerFSM(Agent agent, Data data) { 16 | super(agent); 17 | this.data = data; 18 | 19 | registerFirstState(new SendTopicNameForProducer(getAgent(), data), "SendTopic"); 20 | registerState(new SendTaskForTopic(getAgent(), 4000, data), "SendTask"); 21 | registerState(new ParallelAfterDivision.Parallel(getAgent(), pricesForDistributerData, 7000), "ReceivingPrices"); 22 | registerState(new ChoosingBestPrice(getAgent(), data, pricesForDistributerData, bestPrice), "ChooseBestPrice"); 23 | registerState(new WaitingForConfirmParallel(getAgent(),3000), "Wait"); 24 | registerLastState(new IBoughtEnergy(bestPrice), "BoughtEnergy"); 25 | registerLastState(new SellerAlreadySold(getAgent(), data),"Restart"); 26 | registerState(new DivisionContract(getAgent(), data), "DivisionContract"); 27 | registerState(new ParallelAfterDivision(getAgent(), pricesForDistributerData, 5000), "ReceivePriceAfterDiv"); 28 | registerState(new ChoosingBestPricesAfterDivision(getAgent(), data, pricesForDistributerData), "ChooseBestPriceAfterDiv"); 29 | registerLastState(new TheyDontHaveEnergy(), "NoEnergy"); 30 | registerLastState(new MinPriceTooLargeAfterDivision(getAgent(), pricesForDistributerData), "NewMaxPrice"); 31 | registerState(new WaitingForConfirmAfterDivisionParallel(getAgent(), 6000, data), "ConfirmAfterDivision"); 32 | registerLastState(new SendingReport(getAgent(), data), "ReportBought"); 33 | 34 | registerDefaultTransition("SendTopic", "SendTask"); 35 | registerDefaultTransition("SendTask","ReceivingPrices"); 36 | registerTransition("ReceivingPrices","ChooseBestPrice", 1); 37 | registerDefaultTransition("ChooseBestPrice", "Wait"); 38 | registerTransition("Wait", "BoughtEnergy", 1); 39 | registerTransition("Wait", "Restart", 2); 40 | registerTransition("ReceivingPrices","DivisionContract", 2); 41 | registerDefaultTransition("DivisionContract", "ReceivePriceAfterDiv"); 42 | registerTransition("ReceivePriceAfterDiv", "ChooseBestPriceAfterDiv", 1); 43 | registerTransition("ReceivePriceAfterDiv","NoEnergy", 2); 44 | registerTransition("ChooseBestPriceAfterDiv","ConfirmAfterDivision", 1); 45 | registerTransition("ChooseBestPriceAfterDiv","NewMaxPrice", 2); 46 | registerTransition("ConfirmAfterDivision","ReportBought", 1 ); 47 | registerTransition("ConfirmAfterDivision","NoEnergy", 2 ); 48 | } 49 | 50 | public static class SellerAlreadySold extends OneShotBehaviour { 51 | Data data; 52 | public SellerAlreadySold(Agent agent, Data data) { 53 | super(agent); 54 | this.data = data; 55 | } 56 | 57 | @Override 58 | public void action() { 59 | getAgent().addBehaviour(new DistributerFSM(getAgent(), data)); 60 | } 61 | } 62 | 63 | 64 | } 65 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/ChoosingBestPrice.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lab4.Config.DistributerConfig; 8 | import lab4.Config.Data; 9 | import lab4.Config.Data.PriceWithName; 10 | import lab4.Helper.XMLHelper; 11 | 12 | public class ChoosingBestPrice extends OneShotBehaviour { 13 | Data data; 14 | Data priceForDistributerData; 15 | PriceWithName bestPrice; 16 | 17 | public ChoosingBestPrice(Agent agent, Data data, Data priceForDistributerData, PriceWithName bestPrice) { 18 | super(agent); 19 | this.data = data; 20 | this.priceForDistributerData = priceForDistributerData; 21 | this.bestPrice = bestPrice; 22 | } 23 | 24 | @Override 25 | public void action() { 26 | bestPrice.setPrice(priceForDistributerData.getPricesWithNames().get(priceForDistributerData.getPricesWithNames().size() - 1).getPrice()); 27 | bestPrice.setName(priceForDistributerData.getPricesWithNames().get(priceForDistributerData.getPricesWithNames().size() - 1).getName()); 28 | if (bestPrice.getPrice() < data.getDistributerMaxPrice()) { 29 | ACLMessage win = new ACLMessage(ACLMessage.PROPOSE); 30 | win.addReceiver(new AID(bestPrice.getName(), false)); 31 | win.setProtocol("Winner"); 32 | getAgent().send(win); 33 | } else { 34 | DistributerConfig cfg = XMLHelper.unMarshalAny(DistributerConfig.class, getAgent().getLocalName() + ".xml"); 35 | ACLMessage minPrice = new ACLMessage(ACLMessage.REJECT_PROPOSAL); 36 | minPrice.setContent(String.valueOf(bestPrice.getPrice())); 37 | minPrice.addReceiver(new AID(cfg.getProducersName(), false)); 38 | minPrice.setProtocol("MaxPriceTooLow"); 39 | getAgent().send(minPrice); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/Division/ChoosingBestPricesAfterDivision.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM.Division; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lab4.Config.Data; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | import java.util.stream.IntStream; 12 | 13 | public class ChoosingBestPricesAfterDivision extends OneShotBehaviour { 14 | private int onEnd = 2; 15 | Data data; 16 | Data priceForDistributerData; 17 | List firstProducerPrices = new ArrayList<>(), secondProducerPrices = new ArrayList<>(), 18 | thirdProducerPrices = new ArrayList<>(), allMinPricesAfterDivision = new ArrayList<>(); 19 | 20 | public ChoosingBestPricesAfterDivision(Agent agent, Data data, Data priceForDistributerData) { 21 | super(agent); 22 | this.data = data; 23 | this.priceForDistributerData = priceForDistributerData; 24 | } 25 | 26 | @Override 27 | public void action() { 28 | for (int i = 0; i < priceForDistributerData.getPricesWithNames().size(); i++) { 29 | switch (priceForDistributerData.getPricesWithNames().get(i).getName()) { 30 | case "ТЭС" -> firstProducerPrices.add(priceForDistributerData.getPricesWithNames().get(i).getPrice()); 31 | case "ВЭС" -> secondProducerPrices.add(priceForDistributerData.getPricesWithNames().get(i).getPrice()); 32 | case "СЭС" -> thirdProducerPrices.add(priceForDistributerData.getPricesWithNames().get(i).getPrice()); 33 | } 34 | } 35 | check(firstProducerPrices, allMinPricesAfterDivision, "ТЭС"); 36 | check(secondProducerPrices, allMinPricesAfterDivision, "ВЭС"); 37 | check(thirdProducerPrices, allMinPricesAfterDivision, "СЭС"); 38 | priceForDistributerData.setMinPrice(allMinPricesAfterDivision.get(0)); 39 | 40 | IntStream.range(1, allMinPricesAfterDivision.size()).forEach(i -> { 41 | if (priceForDistributerData.getMinPrice() <= allMinPricesAfterDivision.get(i)) { 42 | priceForDistributerData.setMinPrice(allMinPricesAfterDivision.get(i)); 43 | } 44 | }); 45 | } 46 | 47 | 48 | public void check(List producerPrices, List allMinPricesAfterDivision, String name) { 49 | if (producerPrices.size() > 0) { 50 | double minPrice = producerPrices.get(0); 51 | for (int i = 1; i < producerPrices.size(); i++) { 52 | if (minPrice >= producerPrices.get(i)) { 53 | minPrice = producerPrices.get(i); 54 | } 55 | } 56 | allMinPricesAfterDivision.add(minPrice); 57 | if (minPrice <= data.getDistributerMaxPrice()) { 58 | onEnd = 1; 59 | ACLMessage win = new ACLMessage(ACLMessage.PROPOSE); 60 | win.addReceiver(new AID(name, false)); 61 | win.setProtocol("WinnerAfterDiv"); 62 | win.setContent(name + minPrice); 63 | getAgent().send(win); 64 | } 65 | } 66 | } 67 | 68 | @Override 69 | public int onEnd() { 70 | return onEnd; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/Division/DivisionContract.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM.Division; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import lab4.Config.Data; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | @Slf4j 10 | public class DivisionContract extends OneShotBehaviour { 11 | Data data; 12 | public DivisionContract(Agent agent, Data data) { 13 | super(agent); 14 | this.data = data; 15 | } 16 | 17 | @Override 18 | public void action() { 19 | ACLMessage msg = new ACLMessage(ACLMessage.CFP); 20 | msg.setProtocol("Task"); 21 | msg.addReceiver(data.getTopic()); 22 | msg.setContent(String.valueOf(data.getDistributerLoad() / 2)); 23 | getAgent().send(msg); 24 | log.info("new task load {}", data.getDistributerLoad() / 2); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/Division/MinPriceTooLargeAfterDivision.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM.Division; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lab4.Config.DistributerConfig; 8 | import lab4.Config.Data; 9 | import lab4.Helper.XMLHelper; 10 | 11 | public class MinPriceTooLargeAfterDivision extends OneShotBehaviour { 12 | Data priceForDistributerData; 13 | public MinPriceTooLargeAfterDivision(Agent agent, Data priceForDistributerData) { 14 | super(agent); 15 | this.priceForDistributerData = priceForDistributerData; 16 | } 17 | 18 | @Override 19 | public void action() { 20 | DistributerConfig cfg = XMLHelper.unMarshalAny(DistributerConfig.class, getAgent().getLocalName() + ".xml"); 21 | ACLMessage minPrice = new ACLMessage(ACLMessage.REJECT_PROPOSAL); 22 | minPrice.addReceiver(new AID(cfg.getProducersName(), false)); 23 | minPrice.setProtocol("MaxPriceTooLow"); 24 | minPrice.setContent(String.valueOf(priceForDistributerData.getMinPrice())); 25 | getAgent().send(minPrice); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/Division/ParallelAfterDivision.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM.Division; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.ParallelBehaviour; 5 | import jade.core.behaviours.WakerBehaviour; 6 | import lab4.Behaviour.Distributer.FSM.ReceivingPricesFromProducer; 7 | import lab4.Config.Data; 8 | 9 | public class ParallelAfterDivision extends ParallelBehaviour { 10 | Data pricesForDistributerData; 11 | Data onEnd = new Data(); 12 | 13 | public ParallelAfterDivision(Agent agent, Data pricesForDistributerData, long wakeUpTime) { 14 | super(agent, WHEN_ANY); 15 | this.pricesForDistributerData = pricesForDistributerData; 16 | addSubBehaviour(new ReceivingPricesFromProducer(getAgent(), pricesForDistributerData, onEnd)); 17 | addSubBehaviour(new WakerBehaviour(getAgent(), wakeUpTime) { 18 | @Override 19 | protected void onWake() { 20 | super.onWake(); 21 | } 22 | }); 23 | } 24 | @Override 25 | public int onEnd() { 26 | return onEnd.getOnEnd(); 27 | } 28 | 29 | 30 | public static class Parallel extends ParallelBehaviour { 31 | Data pricesForDistributerData; 32 | Data onEnd = new Data(); 33 | 34 | public Parallel(Agent agent, Data pricesForDistributerData, long wakeUpTime) { 35 | super(agent, WHEN_ANY); 36 | this.pricesForDistributerData = pricesForDistributerData; 37 | addSubBehaviour(new ReceivingPricesFromProducer(getAgent(), pricesForDistributerData, onEnd)); 38 | addSubBehaviour(new WakerBehaviour(getAgent(), wakeUpTime) { 39 | @Override 40 | protected void onWake() { 41 | super.onWake(); 42 | } 43 | }); 44 | } 45 | @Override 46 | public int onEnd() { return onEnd.getOnEnd(); } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/Division/SendingReport.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM.Division; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lab4.Config.DistributerConfig; 8 | import lab4.Config.Data; 9 | import lab4.Helper.XMLHelper; 10 | 11 | public class SendingReport extends OneShotBehaviour { 12 | Data data; 13 | public SendingReport(Agent agent, Data data) { 14 | super(agent); 15 | this.data = data; 16 | } 17 | 18 | @Override 19 | public void action() { 20 | DistributerConfig cfg = XMLHelper.unMarshalAny(DistributerConfig.class, getAgent().getLocalName() + ".xml"); 21 | ACLMessage minPrice = new ACLMessage(ACLMessage.ACCEPT_PROPOSAL); 22 | minPrice.addReceiver(new AID(cfg.getProducersName(), false)); 23 | minPrice.setProtocol("IBoughtEnergyAfterDivision"); 24 | minPrice.setContent(String.valueOf(data.getBestsPrices())); 25 | getAgent().send(minPrice); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/Division/TheyDontHaveEnergy.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM.Division; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import lab4.Config.DistributerConfig; 7 | import lab4.Helper.XMLHelper; 8 | import lombok.extern.slf4j.Slf4j; 9 | import lab4.Config.Parameters.Color; 10 | 11 | 12 | @Slf4j 13 | public class TheyDontHaveEnergy extends OneShotBehaviour { 14 | 15 | @Override 16 | public void action() { 17 | DistributerConfig cfg = XMLHelper.unMarshalAny(DistributerConfig.class, getAgent().getLocalName() + ".xml"); 18 | ACLMessage minPrice = new ACLMessage(ACLMessage.REJECT_PROPOSAL); 19 | minPrice.addReceiver(new AID(cfg.getProducersName(), false)); 20 | minPrice.setProtocol("noEnergy"); 21 | getAgent().send(minPrice); 22 | log.info(Color.RED + "{} didn't buy any energy for {} because seller don't have enough energy" + Color.RESET, 23 | getAgent().getLocalName(), cfg.getProducersName()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/Division/WaitingForConfirmAfterDivisionParallel.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM.Division; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.core.behaviours.ParallelBehaviour; 6 | import jade.core.behaviours.WakerBehaviour; 7 | import jade.lang.acl.ACLMessage; 8 | import jade.lang.acl.MessageTemplate; 9 | import lab4.Config.Data; 10 | 11 | public class WaitingForConfirmAfterDivisionParallel extends ParallelBehaviour { 12 | Data data; 13 | Data onEnd = new Data(); 14 | 15 | public WaitingForConfirmAfterDivisionParallel(Agent agent, long wakeUpTime, Data data) { 16 | super(agent, WHEN_ANY); 17 | this.data = data; 18 | 19 | addSubBehaviour(new Behaviour() { 20 | @Override 21 | public void action() { 22 | ACLMessage congratulations = getAgent().receive(MessageTemplate 23 | .and(MessageTemplate.MatchPerformative(ACLMessage.ACCEPT_PROPOSAL), MessageTemplate.MatchProtocol("ConfirmSelling"))); 24 | if (congratulations != null) { 25 | data.getBestsPrices().add(congratulations.getContent()); 26 | onEnd.setOnEnd(1); 27 | } 28 | else block(); 29 | } 30 | @Override 31 | public boolean done() { 32 | return false; 33 | } 34 | }); 35 | 36 | addSubBehaviour(new WakerBehaviour(getAgent(), wakeUpTime) { 37 | @Override 38 | protected void onWake() { 39 | super.onWake(); 40 | } 41 | }); 42 | } 43 | 44 | @Override 45 | public int onEnd() { 46 | return onEnd.getOnEnd(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/IBoughtEnergy.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import lab4.Config.DistributerConfig; 7 | import lab4.Config.Data.PriceWithName; 8 | import lab4.Helper.XMLHelper; 9 | import lombok.AllArgsConstructor; 10 | 11 | @AllArgsConstructor 12 | public class IBoughtEnergy extends OneShotBehaviour { 13 | PriceWithName bestPrice; 14 | 15 | @Override 16 | public void action() { 17 | DistributerConfig cfg = XMLHelper.unMarshalAny(DistributerConfig.class, getAgent().getLocalName() + ".xml"); 18 | ACLMessage minPrice = new ACLMessage(ACLMessage.ACCEPT_PROPOSAL); 19 | minPrice.setProtocol("IBoughtEnergy"); 20 | minPrice.addReceiver(new AID(cfg.getProducersName(), false)); 21 | minPrice.setContent(bestPrice.getName() + ": price = " + bestPrice.getPrice()); 22 | getAgent().send(minPrice); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/ReceivingPricesFromProducer.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import jade.lang.acl.MessageTemplate; 7 | import lab4.Config.Data; 8 | 9 | import java.util.List; 10 | 11 | public class ReceivingPricesFromProducer extends Behaviour { 12 | Data priceForDistributerData; 13 | Data onEnd; 14 | public ReceivingPricesFromProducer(Agent agent, Data priceForDistributerData, Data onEnd) { 15 | super(agent); 16 | this.priceForDistributerData = priceForDistributerData; 17 | this.onEnd = onEnd; 18 | } 19 | 20 | @Override 21 | public void action() { 22 | ACLMessage priceFromProducer = getAgent().receive(MessageTemplate 23 | .and(MessageTemplate.MatchPerformative(ACLMessage.INFORM), MessageTemplate.MatchProtocol("PriceFromProducer"))); 24 | if (priceFromProducer != null) { 25 | double hisPrice = Double.parseDouble(priceFromProducer.getContent()); 26 | List prices = priceForDistributerData.getPricesWithNames(); 27 | prices.add(new Data.PriceWithName(hisPrice, priceFromProducer.getSender().getLocalName())); 28 | priceForDistributerData.setPricesWithNames(prices); 29 | onEnd.setOnEnd(1); 30 | } 31 | else block(); 32 | } 33 | 34 | @Override 35 | public boolean done() { return false; } 36 | } 37 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/FSM/WaitingForConfirmParallel.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer.FSM; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.core.behaviours.ParallelBehaviour; 6 | import jade.core.behaviours.WakerBehaviour; 7 | import jade.lang.acl.ACLMessage; 8 | import jade.lang.acl.MessageTemplate; 9 | 10 | public class WaitingForConfirmParallel extends ParallelBehaviour { 11 | private boolean confirm; 12 | 13 | public WaitingForConfirmParallel(Agent agent, long wakeUpTime) { 14 | super(agent, WHEN_ANY); 15 | 16 | addSubBehaviour(new Behaviour() { 17 | @Override 18 | public void action() { 19 | ACLMessage congratulations = getAgent().receive(MessageTemplate 20 | .and(MessageTemplate.MatchPerformative(ACLMessage.ACCEPT_PROPOSAL), MessageTemplate.MatchProtocol("ConfirmSelling"))); 21 | if (congratulations != null) confirm = true; 22 | else block(); 23 | } 24 | @Override 25 | public boolean done() { 26 | return confirm; 27 | } 28 | }); 29 | 30 | addSubBehaviour(new WakerBehaviour(getAgent(), wakeUpTime) { 31 | @Override 32 | protected void onWake() { 33 | super.onWake(); 34 | } 35 | }); 36 | } 37 | 38 | 39 | @Override 40 | public int onEnd() { 41 | if (confirm) return 1; 42 | else return 2; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/ReceiveTaskToAuction.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lab4.Config.Data; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | @Slf4j 10 | public class ReceiveTaskToAuction extends Behaviour { 11 | 12 | @Override 13 | public void action() { 14 | ACLMessage msg = myAgent.receive(MessageTemplate 15 | .and(MessageTemplate.MatchProtocol("Task"), MessageTemplate.MatchPerformative(ACLMessage.REQUEST))); 16 | if(msg != null){ 17 | Data data = new Data(); 18 | String[] parseData = msg.getContent().split(","); 19 | data.setDistributerLoad(Double.parseDouble(parseData[0])); 20 | data.setDistributerMaxPrice(Double.parseDouble((parseData[1]))); 21 | getAgent().addBehaviour(new DistributerFSM(getAgent(), data)); 22 | log.info("I get the load: {} with the maximum price {}", data.getDistributerLoad(), data.getDistributerMaxPrice()); 23 | } 24 | else block(); 25 | } 26 | 27 | @Override 28 | public boolean done() { 29 | return false; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/SendTaskForTopic.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.WakerBehaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import lab4.Config.Data; 7 | 8 | public class SendTaskForTopic extends WakerBehaviour { 9 | Data data; 10 | public SendTaskForTopic(Agent agent, long timeout, Data data) { 11 | super(agent, timeout); 12 | this.data = data; 13 | } 14 | 15 | @Override 16 | protected void onWake() { 17 | ACLMessage msg = new ACLMessage(ACLMessage.CFP); 18 | msg.setContent(String.valueOf(data.getDistributerLoad())); 19 | msg.setProtocol("Task"); 20 | msg.addReceiver(data.getTopic()); 21 | getAgent().send(msg); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lab4/Behaviour/Distributer/SendTopicNameForProducer.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Distributer; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lab4.Config.DistributerConfig; 8 | import lab4.Config.Data; 9 | import lab4.Helper.DfHelper; 10 | import lab4.Helper.XMLHelper; 11 | 12 | import java.util.List; 13 | 14 | public class SendTopicNameForProducer extends OneShotBehaviour { 15 | Data data; 16 | List agents; 17 | 18 | public SendTopicNameForProducer(Agent agent, Data data) { 19 | super(agent); 20 | this.data = data; 21 | } 22 | 23 | @Override 24 | public void onStart() { 25 | agents = DfHelper.searchForAgents("Production", getAgent()); 26 | data.setNumberOfProducers(agents.size()); 27 | } 28 | 29 | @Override 30 | public void action() { 31 | DistributerConfig distributerConfig = XMLHelper.unMarshalAny(DistributerConfig.class, getAgent().getLocalName() + ".xml"); 32 | AID topic = DfHelper.createTopic(getAgent(), distributerConfig.getTopicName()); 33 | ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 34 | data.setTopic(topic); 35 | msg.setProtocol("topicName"); 36 | agents.forEach(msg::addReceiver); 37 | msg.setContent(distributerConfig.getTopicName()); 38 | getAgent().send(msg); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lab4/Behaviour/Producer/FSM/AfterWin.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Producer.FSM; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lab4.Config.Data; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | @Slf4j 11 | public class AfterWin extends OneShotBehaviour { 12 | String distributersName; 13 | double neededLoad; 14 | Data producerData; 15 | 16 | public AfterWin(Agent agent,String distributersName, double neededLoad, Data producerData) { 17 | super(agent); 18 | this.distributersName = distributersName; 19 | this.neededLoad = neededLoad; 20 | this.producerData = producerData; 21 | } 22 | 23 | @Override 24 | public void action() { 25 | 26 | if (producerData.getProducerLoad().get(getAgent().getAID()) >= neededLoad) { 27 | producerData.getProducerLoad().put(getAgent().getAID(), producerData.getProducerLoad().get(getAgent().getAID()) - neededLoad); 28 | ACLMessage confirm = new ACLMessage(ACLMessage.ACCEPT_PROPOSAL); 29 | confirm.addReceiver(new AID(distributersName, false)); 30 | confirm.setProtocol("ConfirmSelling"); 31 | confirm.setContent(String.valueOf(producerData.getWinnerMSG())); 32 | getAgent().send(confirm); 33 | log.info("{} sold energy to {}", getAgent().getLocalName(), distributersName); 34 | } else log.info("{} already sold all his energy", getAgent().getLocalName()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lab4/Behaviour/Producer/FSM/ReceivingPrices.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Producer.FSM; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.Behaviour; 6 | import jade.core.behaviours.ParallelBehaviour; 7 | import jade.core.behaviours.WakerBehaviour; 8 | import jade.lang.acl.ACLMessage; 9 | import jade.lang.acl.MessageTemplate; 10 | import lab4.Config.Data; 11 | import lombok.extern.slf4j.Slf4j; 12 | import lab4.Config.Parameters.Color; 13 | 14 | 15 | import java.util.Objects; 16 | @Slf4j 17 | public class ReceivingPrices extends ParallelBehaviour { 18 | double neededLoad; 19 | Data producerData; 20 | String distributersName; 21 | AID topic; 22 | 23 | public ReceivingPrices(Agent agent, double neededLoad, Data producerData, String distributersName, AID topic) { 24 | super(WHEN_ANY); 25 | this.neededLoad = neededLoad; 26 | this.producerData = producerData; 27 | this.distributersName = distributersName; 28 | this.topic = topic; 29 | 30 | addSubBehaviour(new Behaviour() { 31 | @Override 32 | public void action() { 33 | ACLMessage priceFromProducer = getAgent().receive(MessageTemplate 34 | .and(MessageTemplate.MatchPerformative(ACLMessage.INFORM), MessageTemplate.MatchProtocol("PriceFromProducer"))); 35 | if (priceFromProducer != null) { 36 | if (neededLoad <= producerData.getProducerLoad().get(getAgent().getAID())) { 37 | double myPrice = 1000 / producerData.getProducerLoad().get(getAgent().getAID()); 38 | double minPrice = myPrice / 2; 39 | double enemyPrice = Double.parseDouble(priceFromProducer.getContent()); 40 | String sender = priceFromProducer.getSender().getLocalName(); 41 | double myNewPrice = 0.9 * enemyPrice; 42 | if (enemyPrice < myPrice && !Objects.equals(getAgent().getAID().getLocalName(), sender)) { 43 | if (myNewPrice >= minPrice) { 44 | ACLMessage newPrice = new ACLMessage(ACLMessage.INFORM); 45 | newPrice.setContent(String.valueOf(myNewPrice)); 46 | newPrice.addReceiver(topic); 47 | newPrice.setProtocol("PriceFromProducer"); 48 | getAgent().send(newPrice); 49 | log.info(Color.PURPLE + "{}: forget what i said, this my new price {}, which is much better than {} offers" + Color.RESET, 50 | getAgent().getLocalName(), myNewPrice, priceFromProducer.getSender().getLocalName()); 51 | } else block(); 52 | } 53 | } else block(); 54 | } 55 | else block(); 56 | } 57 | 58 | @Override 59 | public boolean done() { 60 | return false; 61 | } 62 | }); 63 | 64 | addSubBehaviour(new WakerBehaviour(getAgent(), 4000) { 65 | @Override 66 | protected void onWake() { 67 | super.onWake(); 68 | } 69 | }); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /lab4/Behaviour/Producer/FSM/SendingPrice.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Producer.FSM; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.OneShotBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lab4.Config.Data; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | @Slf4j 11 | public class SendingPrice extends OneShotBehaviour { 12 | 13 | String distributersName; 14 | double neededLoad; 15 | Data producerData; 16 | AID topic; 17 | int onEnd; 18 | public SendingPrice(Agent agent, String distributersName, double neededLoad, Data producerData, AID topic) { 19 | super(agent); 20 | this.distributersName = distributersName; 21 | this.neededLoad = neededLoad; 22 | this.producerData = producerData; 23 | this.topic = topic; 24 | } 25 | 26 | @Override 27 | public void action() { 28 | if (neededLoad < producerData.getProducerLoad().get(getAgent().getAID())) { 29 | double myPrice = 500 / producerData.getProducerLoad().get(getAgent().getAID()); 30 | ACLMessage price = new ACLMessage(ACLMessage.INFORM); 31 | price.setContent(String.valueOf(myPrice)); 32 | price.addReceiver(topic); 33 | price.setProtocol("PriceFromProducer"); 34 | getAgent().send(price); 35 | log.info("{} sent his price {}", getAgent().getLocalName(), myPrice); 36 | onEnd = 1; 37 | } else onEnd = 2; 38 | } 39 | 40 | @Override 41 | public int onEnd() { return onEnd; } 42 | } 43 | -------------------------------------------------------------------------------- /lab4/Behaviour/Producer/FSM/StateOfEnergy.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Producer.FSM; 2 | 3 | import jade.core.behaviours.OneShotBehaviour; 4 | import lombok.extern.slf4j.Slf4j; 5 | 6 | @Slf4j 7 | public class StateOfEnergy extends OneShotBehaviour { 8 | 9 | @Override 10 | public void action() { } 11 | 12 | @Slf4j 13 | public static class Bought extends OneShotBehaviour { 14 | @Override 15 | public void action() { } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lab4/Behaviour/Producer/FSM/WaitingForDecision.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Producer.FSM; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.core.behaviours.ParallelBehaviour; 6 | import jade.core.behaviours.WakerBehaviour; 7 | import jade.lang.acl.ACLMessage; 8 | import jade.lang.acl.MessageTemplate; 9 | import lab4.Config.Data; 10 | 11 | public class WaitingForDecision extends ParallelBehaviour { 12 | double neededLoad; 13 | String distributersName; 14 | Data producerData; 15 | private boolean wonWaitingForWin, wonWaitingForWinAfterDiv; 16 | 17 | public WaitingForDecision(Agent agent,long wakeUpTime, String distributersName, Data producerData, double neededLoad) { 18 | super(agent, WHEN_ANY); 19 | this.distributersName = distributersName; 20 | this.producerData = producerData; 21 | this.neededLoad = neededLoad; 22 | 23 | addSubBehaviour(new Behaviour() { 24 | @Override 25 | public void action() { 26 | ACLMessage winner = getAgent().receive(MessageTemplate 27 | .and(MessageTemplate.MatchPerformative(ACLMessage.PROPOSE), MessageTemplate.MatchProtocol("Winner"))); 28 | if (winner != null) { 29 | producerData.setWinnerMSG(winner.getContent()); 30 | if (producerData.getProducerLoad().get(getAgent().getAID()) >= neededLoad) { 31 | producerData.getProducerLoad().put(getAgent().getAID(), producerData.getProducerLoad().get(getAgent().getAID()) - neededLoad); 32 | ACLMessage confirm = winner.createReply(); 33 | confirm.setPerformative(ACLMessage.ACCEPT_PROPOSAL); 34 | confirm.setProtocol("ConfirmSelling"); 35 | confirm.setContent(String.valueOf(producerData.getWinnerMSG())); 36 | getAgent().send(confirm); 37 | wonWaitingForWin = true; 38 | } 39 | } 40 | else block(); 41 | } 42 | @Override 43 | public boolean done() { 44 | return wonWaitingForWin; 45 | } 46 | }); 47 | 48 | addSubBehaviour(new Behaviour() { 49 | @Override 50 | public void action() { 51 | ACLMessage winner = getAgent().receive(MessageTemplate 52 | .and(MessageTemplate.MatchPerformative(ACLMessage.PROPOSE), MessageTemplate.MatchProtocol("WinnerAfterDiv"))); 53 | if (winner != null) { 54 | if (winner.getSender().getLocalName().equals(distributersName)) { 55 | producerData.setWinnerMSG(winner.getContent()); 56 | wonWaitingForWinAfterDiv = true; 57 | } 58 | } 59 | else block(); 60 | } 61 | 62 | @Override 63 | public boolean done() { 64 | return wonWaitingForWinAfterDiv; 65 | } 66 | }); 67 | 68 | addSubBehaviour(new WakerBehaviour(getAgent(), wakeUpTime) { 69 | @Override 70 | protected void onWake() { 71 | super.onWake(); 72 | } 73 | }); 74 | } 75 | 76 | @Override 77 | public int onEnd() { 78 | if (wonWaitingForWinAfterDiv) return 1; 79 | if (wonWaitingForWin) return 3; 80 | else return 2; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /lab4/Behaviour/Producer/ProducerFSM.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Producer; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.FSMBehaviour; 6 | import lab4.Behaviour.Producer.FSM.*; 7 | import lab4.Config.Data; 8 | 9 | public class ProducerFSM extends FSMBehaviour { 10 | String distributersName; 11 | double neededLoad; 12 | Data producerData; 13 | AID topic; 14 | 15 | public ProducerFSM(Agent agent, String distributersName, double neededLoad, Data producerData, AID topic) { 16 | super(agent); 17 | this.distributersName = distributersName; 18 | this.neededLoad = neededLoad; 19 | this.producerData = producerData; 20 | this.topic = topic; 21 | 22 | registerFirstState(new SendingPrice(getAgent(), distributersName, neededLoad, producerData, topic), "SendPrice"); 23 | registerState(new ReceivingPrices(getAgent(), neededLoad, producerData, distributersName, topic), "ReceivePrice"); 24 | registerState(new WaitingForDecision(getAgent(),6000, distributersName, producerData, neededLoad), "WaitForDecision"); 25 | registerLastState(new AfterWin(getAgent(), distributersName, neededLoad, producerData), "Winner"); 26 | registerLastState(new StateOfEnergy(), "noEnergy"); 27 | registerLastState(new StateOfEnergy.Bought(), "BoughtEnergy"); 28 | 29 | registerDefaultTransition("SendPrice", "ReceivePrice"); 30 | registerDefaultTransition("ReceivePrice", "WaitForDecision"); 31 | registerTransition("WaitForDecision", "Winner", 1); 32 | registerTransition("WaitForDecision", "noEnergy",2); 33 | registerTransition("WaitForDecision", "BoughtEnergy",3); 34 | } 35 | 36 | 37 | } 38 | -------------------------------------------------------------------------------- /lab4/Behaviour/Producer/ReceiveTask.java: -------------------------------------------------------------------------------- 1 | package lab4.Behaviour.Producer; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import jade.lang.acl.MessageTemplate; 7 | import lab4.Config.Data; 8 | import lab4.Helper.DfHelper; 9 | import lombok.AllArgsConstructor; 10 | import lombok.extern.slf4j.Slf4j; 11 | 12 | @Slf4j 13 | @AllArgsConstructor 14 | public class ReceiveTask extends Behaviour { 15 | Data producerData; 16 | 17 | @Override 18 | public void action() { 19 | ACLMessage receive = getAgent().receive(MessageTemplate 20 | .and(MessageTemplate.MatchPerformative(ACLMessage.INFORM), MessageTemplate.MatchProtocol("topicName"))); 21 | if (receive != null) 22 | getAgent().addBehaviour(new Behaviour() { // sendPriceForTopic 23 | @Override 24 | public void action() { 25 | AID topic = DfHelper.createTopic(getAgent(), receive.getContent()); 26 | ACLMessage receive = getAgent().receive(MessageTemplate 27 | .and(MessageTemplate.MatchPerformative(ACLMessage.CFP), MessageTemplate.MatchProtocol("Task"))); 28 | if (receive != null) { 29 | double neededLoad = Double.parseDouble(receive.getContent()); 30 | getAgent().addBehaviour(new ProducerFSM(getAgent(), receive.getSender().getLocalName(), neededLoad, producerData, topic)); 31 | log.info("{}: {}", getAgent().getLocalName(), receive.getContent()); 32 | } 33 | else block(); 34 | } 35 | 36 | @Override 37 | public boolean done() { return false; } 38 | }); 39 | else block(); 40 | } 41 | 42 | @Override 43 | public boolean done() { 44 | return false; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lab4/Config/Coefficients.java: -------------------------------------------------------------------------------- 1 | package lab4.Config; 2 | 3 | 4 | import jakarta.xml.bind.annotation.*; 5 | import lab4.Helper.XMLHelper; 6 | import lombok.Data; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | @Data 12 | @XmlRootElement(name = "cfg") 13 | @XmlAccessorType(XmlAccessType.FIELD) 14 | public class Coefficients { 15 | public static void main(String[] args) { 16 | Coefficients coefficients = new Coefficients(); 17 | List B = new ArrayList<>(), C = new ArrayList<>(); 18 | B.add(7.2); 19 | B.add(4.8); 20 | C.add(-86.884); 21 | C.add(22.344); 22 | C.add(-1.450); 23 | C.add(0.027); 24 | coefficients.setA(9.6); 25 | coefficients.setB(B); 26 | coefficients.setC(C); 27 | XMLHelper.marshalAny(coefficients, "src/main/resources/config.xml"); 28 | } 29 | @XmlElement(name="A") 30 | private double A; 31 | @XmlElementWrapper(name="Bs") 32 | @XmlElement(name="B") 33 | private List B; 34 | @XmlElementWrapper(name="Cs") 35 | @XmlElement(name="C") 36 | private List C; 37 | } -------------------------------------------------------------------------------- /lab4/Config/Data.java: -------------------------------------------------------------------------------- 1 | package lab4.Config; 2 | 3 | import jade.core.AID; 4 | import lombok.AllArgsConstructor; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.ArrayList; 8 | import java.util.HashMap; 9 | import java.util.List; 10 | 11 | @lombok.Data 12 | public class Data { 13 | private double distributerMaxPrice, distributerLoad; 14 | private double consumerMaxPrice, consumerLoad; 15 | private HashMap producerLoad = new HashMap<>(); 16 | private String winnerMSG; 17 | private AID topic; 18 | private int numberOfProducers; 19 | private List bestsPrices = new ArrayList<>(); 20 | private int onEnd = 2; 21 | List pricesWithNames = new ArrayList<>(); 22 | private double minPrice; 23 | 24 | @lombok.Data 25 | @AllArgsConstructor 26 | @NoArgsConstructor 27 | public static class PriceWithName { 28 | private double price; 29 | private String name; 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /lab4/Config/DistributerConfig.java: -------------------------------------------------------------------------------- 1 | package lab4.Config; 2 | 3 | import lombok.Data; 4 | 5 | import jakarta.xml.bind.annotation.XmlAccessType; 6 | import jakarta.xml.bind.annotation.XmlAccessorType; 7 | import jakarta.xml.bind.annotation.XmlElement; 8 | import jakarta.xml.bind.annotation.XmlRootElement; 9 | 10 | @Data 11 | @XmlRootElement(name="DistributerConfig") 12 | @XmlAccessorType(XmlAccessType.FIELD) 13 | public class DistributerConfig { 14 | @XmlElement(name = "ProducersName") 15 | private String ProducersName; 16 | @XmlElement(name = "TopicName") 17 | private String TopicName; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /lab4/Config/GenerationData.java: -------------------------------------------------------------------------------- 1 | package lab4.Config; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.TickerBehaviour; 5 | import lab4.Helper.TimeHelper; 6 | import lab4.Helper.XMLHelper; 7 | import lombok.extern.slf4j.Slf4j; 8 | import lab4.Config.Parameters.Color; 9 | 10 | import java.util.List; 11 | import java.util.stream.IntStream; 12 | 13 | @Slf4j 14 | public class GenerationData extends TickerBehaviour { 15 | 16 | Data producerDataТЭС, producerDataВЭС, producerDataСЭС; 17 | Double[] production = new Double[24]; 18 | 19 | 20 | public GenerationData(Agent agent, long period, Data producerDataТЭС, Data producerDataВЭС, Data producerDataСЭС) { 21 | super(agent, period); 22 | this.producerDataТЭС = producerDataТЭС; 23 | this.producerDataВЭС = producerDataВЭС; 24 | this.producerDataСЭС = producerDataСЭС; 25 | } 26 | 27 | @Override 28 | protected void onTick() { 29 | Coefficients coefficients = XMLHelper.unMarshalAny(Coefficients.class, "src/main/resources/config.xml"); 30 | switch (getAgent().getLocalName()) { 31 | case "ТЭС" -> { 32 | producerDataТЭС.getProducerLoad().put(getAgent().getAID(),coefficients.getA()); 33 | log.info(Color.BLUE + "{} storage is {}" + Color.RESET, "ТЭС", producerDataТЭС.getProducerLoad().get(getAgent().getAID())); 34 | } 35 | case "ВЭС" -> { 36 | System.out.println("********************************************************************************"); 37 | // закон Гаусса (нормальное распределение) 38 | double energy = (1 / coefficients.getB().get(1) * Math.sqrt(2 * Math.PI) * 39 | Math.exp(-(Math.pow((TimeHelper.getActualHour() - coefficients.getB().get(0)), 2) / (2 * Math.pow(coefficients.getB().get(1), 2))))) * 35; 40 | producerDataВЭС.getProducerLoad().put(getAgent().getAID(), energy); 41 | log.info(Color.BLUE + "{} storage is {}" + Color.RESET, "ВЭС", producerDataВЭС.getProducerLoad().get(getAgent().getAID())); 42 | } 43 | case "СЭС" -> { 44 | List C = coefficients.getC(); 45 | IntStream.range(0, 24).forEach(i -> { 46 | if (i <= 5 || i >= 19) production[i] = 0.0; 47 | else { 48 | production[i] = 0.0; 49 | IntStream.range(0, C.size()).forEach(index -> production[i] += C.get(index) * Math.pow(i, index)); 50 | } 51 | }); 52 | double value = production[TimeHelper.getActualHour()]; 53 | producerDataСЭС.getProducerLoad().put(getAgent().getAID(), value); 54 | log.info(Color.BLUE + "{} storage is {}" + Color.RESET, "СЭС", producerDataСЭС.getProducerLoad().get(getAgent().getAID())); 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /lab4/Config/Parameters.java: -------------------------------------------------------------------------------- 1 | package lab4.Config; 2 | 3 | import jakarta.xml.bind.annotation.XmlAccessType; 4 | import jakarta.xml.bind.annotation.XmlAccessorType; 5 | import jakarta.xml.bind.annotation.XmlElement; 6 | import jakarta.xml.bind.annotation.XmlRootElement; 7 | import lombok.Data; 8 | 9 | import java.util.List; 10 | 11 | @Data 12 | @XmlRootElement(name="Parameters") 13 | @XmlAccessorType(XmlAccessType.FIELD) 14 | public class Parameters { 15 | 16 | @XmlElement(name="L") 17 | private List load; 18 | @XmlElement 19 | private String distributer; 20 | 21 | @Data 22 | public static class Color { 23 | public static final String RESET = "\u001B[0m"; 24 | public static final String BLACK = "\u001B[30m"; 25 | public static final String RED = "\u001B[31m"; 26 | public static final String GREEN = "\u001B[32m"; 27 | public static final String YELLOW = "\u001B[33m"; 28 | public static final String BLUE = "\u001B[34m"; 29 | public static final String PURPLE = "\u001B[35m"; 30 | public static final String CYAN = "\u001B[36m"; 31 | public static final String WHITE = "\u001B[37m"; 32 | } 33 | } 34 | 35 | -------------------------------------------------------------------------------- /lab4/Helper/DfHelper.java: -------------------------------------------------------------------------------- 1 | package lab4.Helper; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.ServiceException; 6 | import jade.core.messaging.TopicManagementHelper; 7 | import jade.domain.DFService; 8 | import jade.domain.FIPAAgentManagement.DFAgentDescription; 9 | import jade.domain.FIPAAgentManagement.ServiceDescription; 10 | import jade.domain.FIPAException; 11 | 12 | import java.util.ArrayList; 13 | import java.util.Arrays; 14 | import java.util.List; 15 | 16 | public class DfHelper { 17 | 18 | public static List searchForAgents(String serviceToSearch, Agent agent){ 19 | DFAgentDescription dfad = new DFAgentDescription(); 20 | ServiceDescription sd = new ServiceDescription(); 21 | List agents = new ArrayList<>(); 22 | sd.setType(serviceToSearch); 23 | dfad.addServices(sd); 24 | try { 25 | DFAgentDescription[] result = DFService.search(agent, dfad); 26 | Arrays.stream(result).forEach(res -> agents.add(res.getName())); 27 | } catch (FIPAException e) { 28 | e.printStackTrace(); 29 | } 30 | return agents; 31 | } 32 | 33 | public static void registerItself(List serviceName, Agent theAgent){ 34 | DFAgentDescription dfad = new DFAgentDescription(); 35 | dfad.setName(theAgent.getAID()); 36 | for (String s : serviceName) { 37 | ServiceDescription sd = new ServiceDescription(); 38 | sd.setType(s); 39 | sd.setName(theAgent.getLocalName() + "-" + s); 40 | dfad.addServices(sd); 41 | } 42 | try { 43 | DFService.register(theAgent, dfad); 44 | } catch (FIPAException e) { 45 | e.printStackTrace(); 46 | } 47 | } 48 | 49 | public static void registration(String type, AID name, String local, Agent agent) { 50 | DFAgentDescription dfad = new DFAgentDescription(); 51 | ServiceDescription sd = new ServiceDescription(); 52 | dfad.setName(name); 53 | sd.setName(local); 54 | sd.setType(type); 55 | dfad.addServices(sd); 56 | try { 57 | DFService.register(agent, dfad); 58 | } catch (FIPAException e) { 59 | e.printStackTrace(); 60 | } 61 | } 62 | 63 | public static AID createTopic(Agent agent, String topicName){ 64 | AID jadeTopic = null; 65 | try { 66 | TopicManagementHelper topicHelper = (TopicManagementHelper) agent.getHelper(TopicManagementHelper.SERVICE_NAME); 67 | jadeTopic = topicHelper.createTopic(topicName); 68 | topicHelper.register(jadeTopic); 69 | } catch (ServiceException e) { 70 | e.printStackTrace(); 71 | } 72 | return jadeTopic; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /lab4/Helper/TimeHelper.java: -------------------------------------------------------------------------------- 1 | package lab4.Helper; 2 | 3 | public class TimeHelper { 4 | 5 | private static final long startTime = System.currentTimeMillis(); 6 | public static int hourDuration = 75000; 7 | public static int getActualHour(){ 8 | return (int) (System.currentTimeMillis() - startTime) / hourDuration % 24; 9 | } 10 | public static int getDelay(){ 11 | return hourDuration - (int) (System.currentTimeMillis() - startTime) % hourDuration; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lab4/Helper/XMLHelper.java: -------------------------------------------------------------------------------- 1 | package lab4.Helper; 2 | 3 | import jakarta.xml.bind.JAXBContext; 4 | import jakarta.xml.bind.JAXBException; 5 | import jakarta.xml.bind.Marshaller; 6 | import jakarta.xml.bind.Unmarshaller; 7 | import java.io.File; 8 | 9 | public class XMLHelper { 10 | 11 | public static void marshalAny (T information, String outPutFileName) { 12 | try { 13 | JAXBContext jaxbContext = JAXBContext.newInstance(information.getClass()); 14 | Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 15 | jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 16 | jaxbMarshaller.marshal(information, new File(outPutFileName)); 17 | } catch (JAXBException e) { 18 | e.printStackTrace(); 19 | } 20 | } 21 | 22 | public static T unMarshalAny(Class clazz,String outPutFileName){ 23 | T object = null; 24 | try { 25 | JAXBContext jaxbContext = JAXBContext.newInstance(clazz); 26 | Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 27 | Object obj = jaxbUnmarshaller.unmarshal(new File(outPutFileName)); 28 | try { 29 | object = (T) obj; 30 | } 31 | catch (ClassCastException cce) { 32 | object = null; 33 | cce.printStackTrace(); 34 | } 35 | } catch (JAXBException e) { 36 | e.printStackTrace(); 37 | } 38 | return object; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lab4/lab4new/Agents/Consumer.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.Agents; 2 | 3 | import jade.core.Agent; 4 | import lab.lab4new.Auto.Parameters; 5 | import lab.lab4new.Auto.ConfigReader; 6 | import lab.lab4new.consumer.ConsumerSendReqToDistributorBeh; 7 | import lombok.Data; 8 | import lombok.EqualsAndHashCode; 9 | import lombok.SneakyThrows; 10 | import lombok.extern.slf4j.Slf4j; 11 | 12 | import java.util.List; 13 | 14 | import static lab.lab4new.Agents.Smith.registration; 15 | 16 | @EqualsAndHashCode(callSuper = true) 17 | @Data 18 | @Slf4j 19 | public class Consumer extends Agent { 20 | private List firstPower, secondPower, thirdPower; 21 | 22 | @Override 23 | @SneakyThrows 24 | protected void setup() { 25 | firstPower = getParameters("firstConsumer"); 26 | secondPower = getParameters("secondConsumer"); 27 | thirdPower = getParameters("thirdConsumer"); 28 | 29 | log.info("{} агент запущен", this.getLocalName()); 30 | this.addBehaviour(new ConsumerSendReqToDistributorBeh(5)); 31 | // Поиск агентов производителей по сервису Consumer, который они предоставляют 32 | registration("Consumer", getAID(), getLocalName(), this); 33 | } 34 | 35 | public List getParameters(String name) { 36 | Parameters parameters = ConfigReader.getParameters(name); 37 | return parameters.getPower(); 38 | } 39 | 40 | 41 | } -------------------------------------------------------------------------------- /lab4/lab4new/Agents/Distributor.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.Agents; 2 | 3 | import jade.core.Agent; 4 | import lab.lab4new.distributor.DistributorGetReqFromConsumerBehavior; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | @Slf4j 10 | @EqualsAndHashCode(callSuper = true) 11 | @Data 12 | public class Distributor extends Agent { 13 | 14 | private Double energyF, energyS, energyT, costConsumer, bestCost = 0d; 15 | private String bestProducer; 16 | 17 | @Override 18 | protected void setup() { 19 | log.info("{} запущен", this.getLocalName()); 20 | this.addBehaviour(new DistributorGetReqFromConsumerBehavior()); 21 | } 22 | } -------------------------------------------------------------------------------- /lab4/lab4new/Agents/Producer.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.Agents; 2 | 3 | import jade.core.Agent; 4 | import lab.lab4new.producer.ProducerBeh; 5 | import lab.lab4new.producer.ProducerGetOrderFromDistributorBeh; 6 | import lab.lab4new.producer.ProducerGetReqFromDistributorBehavior; 7 | import lab.lab4new.producer.ProducerWaitStartChat; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.SneakyThrows; 11 | import lombok.extern.slf4j.Slf4j; 12 | 13 | import static lab.lab4new.Agents.Smith.registration; 14 | 15 | @Slf4j 16 | @EqualsAndHashCode(callSuper = true) 17 | @Data 18 | public class Producer extends Agent { 19 | private Double energy, startCost, minCost = 0d; 20 | 21 | @Override 22 | @SneakyThrows 23 | protected void setup() { 24 | 25 | log.info("{} запущен", this.getLocalName()); 26 | switch (this.getLocalName()) { 27 | case "ТЭС" -> this.addBehaviour(new ProducerBeh("ТЭС", 9.6)); 28 | case "ВЭС" -> this.addBehaviour(new ProducerBeh("ВЭС", 7.2, 4.8)); 29 | case "СЭС" -> this.addBehaviour(new ProducerBeh("СЭС", -86.884, 22.344, -1.450, 0.027)); 30 | } 31 | 32 | this.addBehaviour(new ProducerGetReqFromDistributorBehavior()); 33 | this.addBehaviour(new ProducerWaitStartChat()); 34 | this.addBehaviour(new ProducerGetOrderFromDistributorBeh()); 35 | // регистрация в yellow pages. Агент производитель предоставляет сервис Producer 36 | registration("Producer", getAID(), getLocalName(), this); 37 | } 38 | } -------------------------------------------------------------------------------- /lab4/lab4new/Agents/Smith.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.Agents; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.domain.DFService; 6 | import jade.domain.FIPAAgentManagement.DFAgentDescription; 7 | import jade.domain.FIPAAgentManagement.ServiceDescription; 8 | import jade.domain.FIPAException; 9 | import lab.lab4new.Auto.SmithBeh; 10 | import lombok.SneakyThrows; 11 | 12 | import java.util.stream.IntStream; 13 | 14 | public class Smith extends Agent { 15 | 16 | @Override 17 | @SneakyThrows 18 | protected void setup() { 19 | 20 | Thread.sleep(300); 21 | System.out.println("\nSmith начал"); 22 | this.addBehaviour(new SmithBeh(this,5000, 23 | getYellowPages(this, "Producer"), 24 | getYellowPages(this, "Consumer"))); 25 | } 26 | 27 | /** 28 | * Метод для регистрации в yellow pages. 29 | * Агент производитель будет предоставлять сервис Producer 30 | * поиск производителя осуществляется по сервису Producer 31 | */ 32 | @SneakyThrows 33 | public static String[] getYellowPages(Agent agent, String type) { 34 | DFAgentDescription dfad = new DFAgentDescription(); 35 | ServiceDescription sd = new ServiceDescription(); 36 | sd.setType(type); 37 | dfad.addServices(sd); 38 | DFAgentDescription[] result = DFService.search(agent, dfad); 39 | String[] service = new String[result.length]; 40 | IntStream.range(0, result.length).forEach(index -> service[index] = result[index].getName().getLocalName()); 41 | return service; 42 | } 43 | 44 | public static void registration(String type, AID name, String local, Agent agent) { 45 | DFAgentDescription dfad = new DFAgentDescription(); 46 | ServiceDescription sd = new ServiceDescription(); 47 | dfad.setName(name); 48 | sd.setName(local); 49 | sd.setType(type); 50 | dfad.addServices(sd); 51 | try { 52 | DFService.register(agent, dfad); 53 | } catch (FIPAException e) { 54 | e.printStackTrace(); 55 | } 56 | } 57 | 58 | } -------------------------------------------------------------------------------- /lab4/lab4new/Auto/ConfigReader.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.Auto; 2 | 3 | import jakarta.xml.bind.JAXBContext; 4 | import jakarta.xml.bind.Unmarshaller; 5 | import lombok.SneakyThrows; 6 | 7 | import java.io.File; 8 | 9 | public class ConfigReader { 10 | 11 | @SneakyThrows 12 | public static Parameters getParameters(String name) { 13 | String cfgPath = "src/main/resources/" + name + ".xml"; 14 | JAXBContext jaxbContext = JAXBContext.newInstance(Parameters.class); 15 | Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 16 | return (Parameters) unmarshaller.unmarshal(new File(cfgPath)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lab4/lab4new/Auto/JExcelHelper.java: -------------------------------------------------------------------------------- 1 | //package lab.lab4new.Auto; 2 | // 3 | //import jakarta.xml.bind.JAXBContext; 4 | //import jakarta.xml.bind.JAXBException; 5 | //import jakarta.xml.bind.Unmarshaller; 6 | //import org.apache.poi.ss.usermodel.Cell; 7 | //import org.apache.poi.ss.usermodel.CellType; 8 | //import org.apache.poi.ss.usermodel.Row; 9 | //import org.apache.poi.xssf.usermodel.XSSFSheet; 10 | //import org.apache.poi.xssf.usermodel.XSSFWorkbook; 11 | //import pr4.serialization.XmlHelper; 12 | // 13 | //import java.io.File; 14 | //import java.io.FileInputStream; 15 | //import java.io.IOException; 16 | //import java.util.ArrayList; 17 | //import java.util.Iterator; 18 | //import java.util.List; 19 | //import java.util.Objects; 20 | // 21 | //public class JExcelHelper { 22 | // 23 | // public static void main(String[] args) { 24 | // handler("C:\\Users\\gamza\\IdeaProjects\\MAC\\src\\main\\resources\\firstConsumer.xml"); 25 | // } 26 | // 27 | // public static void handler(String args) { 28 | // try (FileInputStream file = new FileInputStream("C:\\Users\\gamza\\IdeaProjects\\MAC\\src\\main\\resources\\Load.xlsx")) { 29 | // XSSFWorkbook workbook = new XSSFWorkbook(file); 30 | // XSSFSheet sheet = workbook.getSheet("Sheet"); 31 | // Cell cell = null; 32 | // List listz = new ArrayList<>(); 33 | // List firstListz, secondListz, thirdListz; 34 | // for (Row row : sheet) { 35 | // Iterator cellIterator = row.cellIterator(); 36 | // while (cellIterator.hasNext()) { 37 | // cell = cellIterator.next(); 38 | // if (Objects.requireNonNull(cell.getCellType()) == CellType.NUMERIC) { 39 | // System.out.println(cell.getNumericCellValue()); 40 | // listz.add(cell.getNumericCellValue()); 41 | // } 42 | // } 43 | // } 44 | // firstListz = listz.subList(0, 24); 45 | // secondListz = listz.subList(24, 48); 46 | // thirdListz = listz.subList(48, 72); 47 | // Parameters firstParameters = new Parameters(); 48 | // Parameters secondParameters = new Parameters(); 49 | // Parameters thirdParameters = new Parameters(); 50 | // assert cell != null; 51 | // firstParameters.setPower(firstListz); 52 | //// secondParameters.setSecondPower(secondListz); 53 | //// thirdParameters.setThirdPower(thirdListz); 54 | // // create 55 | // XmlHelper.marshalAny(firstParameters, "src/main/resources/firstConsumer.xml"); 56 | // XmlHelper.marshalAny(secondParameters, "src/main/resources/secondConsumer.xml"); 57 | // XmlHelper.marshalAny(thirdParameters, "src/main/resources/thirdConsumer.xml"); 58 | // 59 | // // parser 60 | // File xml = new File(args); 61 | // JAXBContext jaxbContext = JAXBContext.newInstance(Parameters.class); 62 | // Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 63 | // Parameters object = (Parameters) jaxbUnmarshaller.unmarshal(xml); 64 | // 65 | // for (Double def : object.getPower()){ 66 | // List listParameters = new ArrayList<>(); 67 | // listParameters.add(firstParameters); 68 | //// def.setFile(firstListz); 69 | // System.out.println(def + " def"); 70 | // System.out.println(listParameters + " list"); 71 | // } 72 | // } 73 | // 74 | // catch (IOException | JAXBException e) { 75 | // e.printStackTrace(); 76 | // } 77 | // } 78 | //} 79 | -------------------------------------------------------------------------------- /lab4/lab4new/Auto/Main.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.Auto; 2 | 3 | import jade.core.ProfileImpl; 4 | import jade.core.Runtime; 5 | import jade.util.leap.Properties; 6 | import jade.wrapper.AgentContainer; 7 | import jade.wrapper.AgentController; 8 | import jade.wrapper.StaleProxyException; 9 | import lab.lab4new.Agents.Consumer; 10 | import lab.lab4new.Agents.Distributor; 11 | import lab.lab4new.Agents.Smith; 12 | import lab.lab4new.Agents.Producer; 13 | import lombok.SneakyThrows; 14 | 15 | public class Main { 16 | 17 | private static AgentContainer agentContainer; 18 | 19 | public static void main(String[] args) { 20 | Properties properties = new Properties(); 21 | properties.setProperty("gui", "true"); 22 | properties.put("jade_core_messaging_MessageManager_maxqueuesize", "1_000_000_000"); 23 | ProfileImpl profile = new ProfileImpl(properties); 24 | Runtime.instance().setCloseVM(true); 25 | agentContainer = Runtime.instance().createMainContainer(profile); 26 | createAgents(); 27 | } 28 | 29 | @SneakyThrows 30 | public static void createAgents() { 31 | create("ТЭС", "ВЭС", "СЭС", Producer.class); 32 | create("firstDistributor", "secondDistributor", "thirdDistributor", Distributor.class); 33 | create("firstConsumer", "secondConsumer", "thirdConsumer", Consumer.class); 34 | smith(); 35 | } 36 | 37 | public static void create(String nickname1, String nickname2, String nickname3, Class clazz) throws StaleProxyException, InterruptedException { 38 | AgentController agentController1 = agentContainer.createNewAgent(nickname1, clazz.getName(), new Object[]{}); 39 | AgentController agentController2 = agentContainer.createNewAgent(nickname2, clazz.getName(), new Object[]{}); 40 | AgentController agentController3 = agentContainer.createNewAgent(nickname3, clazz.getName(), new Object[]{}); 41 | agentController1.start(); 42 | agentController2.start(); 43 | agentController3.start(); 44 | Thread.sleep(10); 45 | } 46 | private static void smith() throws StaleProxyException, InterruptedException { 47 | AgentController agentController = agentContainer.createNewAgent("Smith", Smith.class.getName(), new Object[]{}); 48 | agentController.start(); 49 | Thread.sleep(10); 50 | } 51 | } -------------------------------------------------------------------------------- /lab4/lab4new/Auto/Parameters.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.Auto; 2 | 3 | import jakarta.xml.bind.annotation.XmlAccessType; 4 | import jakarta.xml.bind.annotation.XmlAccessorType; 5 | import jakarta.xml.bind.annotation.XmlElement; 6 | import jakarta.xml.bind.annotation.XmlRootElement; 7 | import lombok.Data; 8 | 9 | import java.util.List; 10 | 11 | @Data 12 | @XmlRootElement(name="Parameters") 13 | @XmlAccessorType(XmlAccessType.FIELD) 14 | public class Parameters { 15 | 16 | /* Потребляемая ЭЭ в текущий час */ 17 | @XmlElement(name="P") 18 | private List power; 19 | 20 | @Data 21 | public static class Color { 22 | public static final String RESET = "\u001B[0m"; 23 | public static final String BLACK = "\u001B[30m"; 24 | public static final String RED = "\u001B[31m"; 25 | public static final String GREEN = "\u001B[32m"; 26 | public static final String YELLOW = "\u001B[33m"; 27 | public static final String BLUE = "\u001B[34m"; 28 | public static final String PURPLE = "\u001B[35m"; 29 | public static final String CYAN = "\u001B[36m"; 30 | public static final String WHITE = "\u001B[37m"; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /lab4/lab4new/Auto/SmithBeh.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.Auto; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.TickerBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lombok.SneakyThrows; 8 | 9 | import java.util.Arrays; 10 | 11 | public class SmithBeh extends TickerBehaviour { 12 | 13 | private final String[] producers, consumers; 14 | public SmithBeh(Agent agent, long period, String[] producers, String[] consumers) { 15 | super(agent, period); 16 | this.producers = producers; 17 | this.consumers = consumers; 18 | System.out.println(Arrays.toString(producers) + " - Производители"); 19 | System.out.println(Arrays.toString(consumers) + " - Потребители [ЦветМет, ЖилоеЗдание, ПищПром]"); 20 | } 21 | 22 | @Override 23 | @SneakyThrows 24 | protected void onTick() { 25 | System.out.println("\n====================================================================================\n"); 26 | ACLMessage start = new ACLMessage(ACLMessage.PROPAGATE); 27 | for (String producer : producers) start.addReceiver(new AID(producer, false)); 28 | myAgent.send(start); 29 | Thread.sleep(100); 30 | start = new ACLMessage(ACLMessage.PROPAGATE); 31 | for (String consumer : consumers) start.addReceiver(new AID(consumer, false)); 32 | myAgent.send(start); 33 | } 34 | } -------------------------------------------------------------------------------- /lab4/lab4new/ChatRoom/DistributorChat.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.ChatRoom; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import jade.lang.acl.MessageTemplate; 7 | import lab.lab4new.Agents.Distributor; 8 | import lab.lab4new.distributor.DistributorSendOrderToProducerBehaviour; 9 | import lombok.SneakyThrows; 10 | import lombok.extern.slf4j.Slf4j; 11 | 12 | import java.util.List; 13 | @Slf4j 14 | public class DistributorChat extends Behaviour { 15 | 16 | boolean stop = false; 17 | List producers; 18 | Distributor agent; 19 | int countOut; 20 | 21 | public DistributorChat(List producers) { 22 | this.producers = producers; 23 | countOut = producers.size(); 24 | } 25 | 26 | @SneakyThrows 27 | @Override 28 | public void onStart() { 29 | agent = (Distributor) myAgent; 30 | log.info("{} я в чате. Начальная цена: {}", myAgent.getLocalName(), agent.getBestCost()); 31 | Thread.sleep(100); 32 | ACLMessage startAuction = new ACLMessage(ACLMessage.INFORM_REF); 33 | // Не лучшему производителю отправляю письмо с начальной ценой для аукциона 34 | producers.forEach(producer -> { 35 | if (!producer.equals(agent.getBestProducer())) startAuction.addReceiver(new AID(producer, false)); 36 | }); 37 | startAuction.setContent(myAgent.getLocalName()+";"+agent.getBestCost()); 38 | myAgent.send(startAuction); 39 | } 40 | 41 | @SneakyThrows 42 | @Override 43 | public void action() { 44 | ACLMessage request = myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.INFORM_REF)); 45 | if (request != null) { 46 | System.out.println(request.getContent()); 47 | if (request.getContent().startsWith("Цена")) countOut--; 48 | else { 49 | agent.setBestProducer(request.getContent().split(";")[0]); 50 | agent.setBestCost(Double.parseDouble(request.getContent().split(";")[3])); 51 | } 52 | if (countOut == 1) { 53 | ACLMessage stopAuction = new ACLMessage(ACLMessage.INFORM_REF); 54 | stopAuction.addReceiver(new AID(agent.getBestProducer(), false)); 55 | stopAuction.setContent("stop;" + agent.getEnergyF() + agent.getEnergyS() + agent.getEnergyT()); 56 | myAgent.addBehaviour(new DistributorSendOrderToProducerBehaviour()); 57 | myAgent.send(stopAuction); 58 | Thread.sleep(100); 59 | stop = true; 60 | } 61 | } else block(); 62 | } 63 | 64 | @Override 65 | public boolean done() { 66 | return stop; 67 | } 68 | } -------------------------------------------------------------------------------- /lab4/lab4new/ChatRoom/ProducerChat.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.ChatRoom; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import jade.lang.acl.MessageTemplate; 7 | import lab.lab4new.Agents.Producer; 8 | import lombok.SneakyThrows; 9 | import lombok.extern.slf4j.Slf4j; 10 | 11 | import java.util.Arrays; 12 | import java.util.List; 13 | @Slf4j 14 | public class ProducerChat extends Behaviour { 15 | 16 | boolean stop = false; 17 | Double currentCost = 5d; 18 | List chatUser; 19 | String testChatUser; 20 | Producer agent; 21 | Double minCost; 22 | 23 | public ProducerChat(String chatUser) { 24 | String[] splitChatUser = chatUser.split(";"); 25 | this.chatUser = Arrays.asList(splitChatUser); 26 | this.testChatUser = chatUser; 27 | } 28 | 29 | @Override 30 | public void onStart() { 31 | log.info("{} в чате", myAgent.getLocalName()); 32 | agent = (Producer) myAgent; 33 | minCost = agent.getMinCost(); 34 | } 35 | 36 | @SneakyThrows 37 | @Override 38 | public void action() { 39 | ACLMessage request = myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.INFORM_REF)); 40 | if (request != null) { 41 | String[] mess = request.getContent().split(";"); 42 | Thread.sleep(30); 43 | if (mess[0].equals("stop")) stop = true; 44 | else { 45 | if (!mess[0].equals(myAgent.getLocalName()) && !mess[0].startsWith("Цена")) { 46 | ACLMessage auction = new ACLMessage(ACLMessage.INFORM_REF); 47 | log.info("{}: вижу цену {}", myAgent.getLocalName(), request.getSender().getLocalName()); 48 | 49 | double cost = Double.parseDouble(mess[1]) - 0.5; 50 | if (cost < minCost) { 51 | auction.setContent("Цена " + cost + " не подходит " + myAgent.getLocalName()+";"); 52 | log.info("{}: снизить до {} не могу, выхожу с торгов: ", myAgent.getLocalName(), String.format("%.3f", cost)); 53 | stop = true; 54 | } else { 55 | auction.setContent(myAgent.getLocalName() + ";" + cost); 56 | log.info("{}: снижаю цену до {}", myAgent.getLocalName(), String.format("%.3f", cost)); 57 | currentCost = cost; 58 | } 59 | chatUser.forEach(chatUsers -> auction.addReceiver(new AID(chatUsers, false))); 60 | myAgent.send(auction); 61 | } 62 | } 63 | } else block(); 64 | } 65 | 66 | @Override 67 | public int onEnd() { 68 | log.info("{}: выхожу из чата", myAgent.getLocalName()); 69 | return 0; 70 | } 71 | 72 | @Override 73 | public boolean done() { 74 | return stop; 75 | } 76 | } -------------------------------------------------------------------------------- /lab4/lab4new/consumer/ConsumerSendReqToDistributorBeh.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.consumer; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import jade.lang.acl.MessageTemplate; 7 | import lab.lab4new.Agents.Consumer; 8 | import lombok.RequiredArgsConstructor; 9 | import lombok.extern.slf4j.Slf4j; 10 | 11 | @Slf4j 12 | @RequiredArgsConstructor 13 | public class ConsumerSendReqToDistributorBeh extends Behaviour { 14 | 15 | int timer; 16 | final int maxCost; 17 | 18 | @Override 19 | public void action() { 20 | Consumer agent = (Consumer) myAgent; 21 | ACLMessage request = new ACLMessage(ACLMessage.CFP); 22 | if (myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.PROPAGATE)) != null) { 23 | switch (myAgent.getLocalName()){ 24 | case "firstConsumer" -> request.addReceiver(new AID("firstDistributor", false)); 25 | case "secondConsumer" -> request.addReceiver(new AID("secondDistributor", false)); 26 | case "thirdConsumer" -> request.addReceiver(new AID("thirdDistributor", false)); 27 | } 28 | Double firstEnergy = agent.getFirstPower().get(timer); 29 | Double secondEnergy = agent.getSecondPower().get(timer); 30 | Double thirdEnergy = agent.getThirdPower().get(timer); 31 | request.setContent(firstEnergy+";"+secondEnergy+";"+thirdEnergy+";"+maxCost); 32 | 33 | switch (myAgent.getLocalName()) { 34 | case "firstConsumer" -> 35 | log.info("{} | {}ч | отправляет запрос на закупку {} энергии, максимальная цена = {}", 36 | myAgent.getLocalName(), timer, firstEnergy, maxCost); 37 | case "secondConsumer" -> 38 | log.info("{} | {}ч | отправляет запрос на закупку {} энергии, максимальная цена = {}", 39 | myAgent.getLocalName(), timer, secondEnergy, maxCost); 40 | case "thirdConsumer" -> 41 | log.info("{} | {}ч | отправляет запрос на закупку {} энергии, максимальная цена = {}", 42 | myAgent.getLocalName(), timer, thirdEnergy, maxCost); 43 | } 44 | if (++timer == 24) timer = 0; 45 | myAgent.send(request); 46 | } 47 | } 48 | @Override 49 | public boolean done() { 50 | return false; 51 | } 52 | } -------------------------------------------------------------------------------- /lab4/lab4new/distributor/DistributorGetReqFromConsumerBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.distributor; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lab.lab4new.Agents.Distributor; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | @Slf4j 10 | public class DistributorGetReqFromConsumerBehavior extends Behaviour { 11 | 12 | @Override 13 | public void action() { 14 | ACLMessage request = myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.CFP)); 15 | Distributor agent = (Distributor) myAgent; 16 | if (request != null) { 17 | double energyValueF = Double.parseDouble(request.getContent().split(";")[0]); 18 | double energyValueS = Double.parseDouble(request.getContent().split(";")[1]); 19 | double energyValueT = Double.parseDouble(request.getContent().split(";")[2]); 20 | double maxCost = Double.parseDouble(request.getContent().split(";")[3]); 21 | agent.setEnergyF(energyValueF); 22 | agent.setEnergyS(energyValueS); 23 | agent.setEnergyT(energyValueT); 24 | agent.setCostConsumer(maxCost); 25 | 26 | switch (myAgent.getLocalName()) { 27 | case "firstDistributor" -> 28 | log.info("{} получил запрос от {} на покупку {} кВт за {} рублей", 29 | myAgent.getLocalName(), request.getSender().getLocalName(), energyValueF, maxCost); 30 | case "secondDistributor" -> 31 | log.info("{} получил запрос от {} на покупку {} кВт за {} рублей", 32 | myAgent.getLocalName(), request.getSender().getLocalName(), energyValueS, maxCost); 33 | case "thirdDistributor" -> 34 | log.info("{} получил запрос от {} на покупку {} кВт за {} рублей", 35 | myAgent.getLocalName(), request.getSender().getLocalName(), energyValueT, maxCost); 36 | } 37 | myAgent.addBehaviour(new DistributorSendReqToProducerBehavior()); 38 | } else block(); 39 | } 40 | 41 | @Override 42 | public boolean done() { 43 | return false; 44 | } 45 | } -------------------------------------------------------------------------------- /lab4/lab4new/distributor/DistributorGetRespFromProducerBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.distributor; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lab.lab4new.Agents.Distributor; 7 | import lab.lab4new.Auto.Parameters.Color; 8 | import lombok.SneakyThrows; 9 | import lombok.extern.slf4j.Slf4j; 10 | 11 | import java.util.*; 12 | import java.util.List; 13 | 14 | @Slf4j 15 | public class DistributorGetRespFromProducerBehavior extends Behaviour { 16 | 17 | boolean stop = false; 18 | Integer count = 0; 19 | int num; 20 | String bestProducer = "none"; 21 | Double bestCost = 100d; 22 | 23 | List producer; 24 | Map producerAndCost; 25 | Double costConsumer, energyConsumerF, energyConsumerS, energyConsumerT; 26 | public DistributorGetRespFromProducerBehavior(Integer num) { 27 | this.num = num; 28 | producer = new ArrayList<>(); 29 | producerAndCost = new HashMap<>(); 30 | } 31 | 32 | @SneakyThrows 33 | @Override 34 | public void action() { 35 | ACLMessage response = myAgent.receive(MessageTemplate 36 | .or(MessageTemplate.MatchPerformative(ACLMessage.REFUSE), MessageTemplate.MatchPerformative(ACLMessage.PROPOSE))); 37 | 38 | Distributor agent = (Distributor) myAgent; 39 | energyConsumerF = agent.getEnergyF(); 40 | energyConsumerS = agent.getEnergyS(); 41 | energyConsumerT = agent.getEnergyT(); 42 | costConsumer = agent.getCostConsumer(); 43 | 44 | if (response != null) { 45 | count++; 46 | switch (response.getPerformative()){ 47 | case ACLMessage.REFUSE -> { 48 | log.info(Color.RED + "Отказ от {}" + Color.RESET, response.getSender().getLocalName()); 49 | } 50 | case ACLMessage.PROPOSE -> { 51 | Double costFromProducer = Double.parseDouble(response.getContent().split(";")[3]); 52 | if (costFromProducer <= costConsumer) { 53 | producer.add(response.getSender().getLocalName()); 54 | producerAndCost.put(response.getSender().getLocalName(), costFromProducer); 55 | log.info("{}: предложение цены {} от {} подходит потребителю", response.getSender().getLocalName(), 56 | String.format("%.3f", costFromProducer), response.getSender().getLocalName()); 57 | if (bestCost > costFromProducer) { 58 | bestCost = costFromProducer; 59 | agent.setBestCost(bestCost); 60 | agent.setBestProducer(response.getSender().getLocalName()); 61 | } 62 | bestProducer = response.getSender().getLocalName(); 63 | } 64 | } 65 | } 66 | if (count == num) stop = true; 67 | } else block(); 68 | } 69 | 70 | @Override 71 | public int onEnd() { 72 | 73 | if (producer.size() == 1 && bestCost > costConsumer) { 74 | myAgent.addBehaviour(new DistributorSendRespToConsumerBehaviour()); 75 | } 76 | if (producer.size() == 1 && bestCost <= costConsumer) { 77 | log.info("На рынке один поставщик с подходящей энергией и ценой"); 78 | myAgent.addBehaviour(new DistributorSendOrderToProducerBehaviour()); 79 | myAgent.addBehaviour(new DistributorSendRespToConsumerBehaviour 80 | (energyConsumerF, energyConsumerS, energyConsumerT, bestCost)); 81 | } 82 | if (producer.size() > 1) { 83 | myAgent.addBehaviour(new DistributorSendMessageStartChat(producer)); 84 | } 85 | if (producerAndCost.size() > 1) { 86 | // log.info("На рынке один поставщик с подходящей энергией, но высокой ценой"); 87 | myAgent.addBehaviour(new DistributorSendOrderToProducerBehaviour(producerAndCost)); 88 | for (Double value : producerAndCost.values()) { 89 | myAgent.addBehaviour(new DistributorSendRespToConsumerBehaviour 90 | (energyConsumerF, energyConsumerS, energyConsumerT, value)); 91 | } 92 | } 93 | return 0; 94 | } 95 | 96 | @Override 97 | public boolean done() { 98 | return stop; 99 | } 100 | } -------------------------------------------------------------------------------- /lab4/lab4new/distributor/DistributorSendMessageStartChat.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.distributor; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import lab.lab4new.ChatRoom.DistributorChat; 7 | import lombok.AllArgsConstructor; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | import java.util.List; 11 | @AllArgsConstructor 12 | @Slf4j 13 | public class DistributorSendMessageStartChat extends OneShotBehaviour { 14 | List producers; 15 | 16 | @Override 17 | public void action() { 18 | log.info("Есть несколько поставщиков, можно начинать торги"); 19 | ACLMessage request = new ACLMessage(ACLMessage.CONFIRM); 20 | String collectProd = String.join(", ", producers); 21 | String collectAll = collectProd + ", " + myAgent.getLocalName(); 22 | log.info("Список участников чата: {}", collectAll); 23 | request.setContent(collectAll); 24 | producers.forEach(producer -> request.addReceiver(new AID(producer, false))); 25 | myAgent.addBehaviour(new DistributorChat(producers)); 26 | myAgent.send(request); 27 | } 28 | } -------------------------------------------------------------------------------- /lab4/lab4new/distributor/DistributorSendOrderToProducerBehaviour.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.distributor; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import lab.lab4new.Agents.Distributor; 7 | 8 | import java.util.Map; 9 | import java.util.Set; 10 | 11 | public class DistributorSendOrderToProducerBehaviour extends OneShotBehaviour { 12 | Map producerAndCost; 13 | int count; 14 | public DistributorSendOrderToProducerBehaviour() { 15 | this.count = 1; 16 | } 17 | public DistributorSendOrderToProducerBehaviour(Map producerAndCost) { 18 | this.producerAndCost = producerAndCost; 19 | this.count = producerAndCost.size(); 20 | } 21 | 22 | @Override 23 | public void action() { 24 | Distributor agent = (Distributor) myAgent; 25 | if (count == 1) { 26 | ACLMessage sendOrder = new ACLMessage(ACLMessage.REJECT_PROPOSAL); 27 | sendOrder.addReceiver(new AID(agent.getBestProducer(), false)); 28 | sendOrder.setContent("" + agent.getEnergyF()); 29 | myAgent.send(sendOrder); 30 | } else { 31 | Set producers = producerAndCost.keySet(); 32 | ACLMessage sendOrder = new ACLMessage(ACLMessage.REJECT_PROPOSAL); 33 | producers.forEach(producer -> sendOrder.addReceiver(new AID(producer, false))); 34 | sendOrder.setContent("" + agent.getEnergyF()); 35 | myAgent.send(sendOrder); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /lab4/lab4new/distributor/DistributorSendReqToProducerBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.distributor; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import lab.lab4new.Agents.Distributor; 7 | import lombok.NoArgsConstructor; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | import java.util.Arrays; 11 | 12 | import static lab.lab4new.Agents.Smith.getYellowPages; 13 | @NoArgsConstructor 14 | @Slf4j 15 | public class DistributorSendReqToProducerBehavior extends OneShotBehaviour { 16 | 17 | @Override 18 | public void action() { 19 | Distributor agent = (Distributor) myAgent; 20 | ACLMessage request = new ACLMessage(ACLMessage.REQUEST); 21 | request.setContent(agent.getEnergyF() + ";" + agent.getEnergyS() + ";" + agent.getEnergyT() + ";" + agent.getCostConsumer()); 22 | log.info("{} отправляю запрос производителям", myAgent.getLocalName()); 23 | String[] producers = getYellowPages(myAgent, "Producer"); 24 | Arrays.stream(producers).forEach(producer -> request.addReceiver(new AID(producer, false))); 25 | myAgent.addBehaviour(new DistributorGetRespFromProducerBehavior(producers.length)); 26 | myAgent.send(request); 27 | } 28 | } -------------------------------------------------------------------------------- /lab4/lab4new/distributor/DistributorSendRespToConsumerBehaviour.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.distributor; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import lombok.AllArgsConstructor; 7 | import lombok.NoArgsConstructor; 8 | import lombok.extern.slf4j.Slf4j; 9 | import lab.lab4new.Auto.Parameters.Color; 10 | 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | @Slf4j 14 | public class DistributorSendRespToConsumerBehaviour extends OneShotBehaviour { 15 | 16 | Double energyF, energyS, energyT, cost; 17 | 18 | @Override 19 | public void action() { 20 | ACLMessage request = new ACLMessage(ACLMessage.INFORM); 21 | switch (myAgent.getLocalName()) { 22 | case "firstDistributor" -> request.addReceiver(new AID("firstConsumer", false)); 23 | case "secondDistributor" -> request.addReceiver(new AID("secondConsumer", false)); 24 | case "thirdDistributor" -> request.addReceiver(new AID("thirdConsumer", false)); 25 | } 26 | if (cost != null) { 27 | switch (myAgent.getLocalName()) { 28 | case "firstDistributor" -> log.info(Color.BLUE + "{}: отправляю {}: {} энергию по {} руб/кВт*ч" + Color.RESET, 29 | myAgent.getLocalName(), "firstConsumer", energyF, String.format("%.3f", cost)); 30 | case "secondDistributor" -> log.info(Color.BLUE + "{}: отправляю {}: {} энергию по {} руб/кВт*ч" + Color.RESET, 31 | myAgent.getLocalName(), "secondConsumer", energyS, String.format("%.3f", cost)); 32 | case "thirdDistributor" -> log.info(Color.BLUE + "{}: отправляю {}: {} энергию по {} руб/кВт*ч" + Color.RESET, 33 | myAgent.getLocalName(), "thirdConsumer", energyT, String.format("%.3f", cost)); 34 | } 35 | request.setContent(energyF + ";" + energyS + ";" + energyT + ";" + cost); 36 | } else { 37 | log.info(Color.RED + "{}: не удалось купить ЭЭ" + Color.RESET, myAgent.getLocalName()); 38 | request.setContent("null;null"); 39 | } 40 | myAgent.send(request); 41 | } 42 | } -------------------------------------------------------------------------------- /lab4/lab4new/producer/ProducerBeh.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.producer; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lab.lab4new.Agents.Producer; 7 | import lombok.*; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | @EqualsAndHashCode(callSuper = true) 11 | @Slf4j 12 | @Data 13 | public class ProducerBeh extends Behaviour { 14 | String type; 15 | double A, B1, B2, C0, C1, C2, C3; 16 | int timer = 1; 17 | 18 | 19 | public ProducerBeh(String type, double A) { 20 | this.type = type; 21 | this.A = A; 22 | } 23 | 24 | public ProducerBeh(String type, double B1, double B2) { 25 | this.type = type; 26 | this.B1 = B1; 27 | this.B2 = B2; 28 | } 29 | 30 | public ProducerBeh(String type, double C0, double C1, double C2, double C3) { 31 | this.type = type; 32 | this.C0 = C0; 33 | this.C1 = C1; 34 | this.C2 = C2; 35 | this.C3 = C3; 36 | } 37 | 38 | 39 | @Override 40 | public void action() { 41 | if (myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.PROPAGATE)) != null) { 42 | switch (type) { 43 | case "ТЭС" -> { 44 | Producer producer = (Producer) this.getAgent(); 45 | Double energy = A; 46 | producer.setEnergy(energy); 47 | producer.setMinCost(3.0); 48 | producer.setStartCost(4.8d); 49 | log.info("Энергия ТЭС {}", producer.getEnergy()); 50 | timer++; 51 | if (timer == 24) timer = 1; 52 | } 53 | case "ВЭС" -> { 54 | Producer producer = (Producer) this.getAgent(); 55 | double energy = (1 / (B2 * Math.sqrt(2 * Math.PI)) * Math.exp(-(timer - B1) * (timer - B1) / (2 * B2 * B2))) * 250; 56 | double startCost = 50 / (energy + 2); 57 | if (startCost > 7) startCost = 8d; 58 | producer.setStartCost(startCost); 59 | producer.setMinCost(startCost / 2); 60 | producer.setEnergy(energy); 61 | log.info("Энергия ВЭС {}", producer.getEnergy()); 62 | timer++; 63 | if (timer == 24) timer = 1; 64 | } 65 | case "СЭС" -> { 66 | Producer producer = (Producer) this.getAgent(); 67 | double energy; 68 | double startCost = 100d; 69 | if (timer > 5 && timer < 19) { 70 | energy = C0 + C1 * timer + C2 * timer * timer + C3 * timer * timer * timer; 71 | startCost = 40 / (energy + 2); 72 | } else energy = 0d; 73 | producer.setStartCost(startCost); 74 | producer.setMinCost(startCost / 2); 75 | producer.setEnergy(energy); 76 | log.info("Энергия СЭС {}", producer.getEnergy()); 77 | timer++; 78 | if (timer == 24) timer = 1; 79 | } 80 | } 81 | } else block(); 82 | } 83 | 84 | @Override 85 | public boolean done() { 86 | return false; 87 | } 88 | } -------------------------------------------------------------------------------- /lab4/lab4new/producer/ProducerGetOrderFromDistributorBeh.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.producer; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lab.lab4new.Agents.Producer; 7 | import lab.lab4new.Auto.Parameters.Color; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | @Slf4j 11 | public class ProducerGetOrderFromDistributorBeh extends Behaviour { 12 | 13 | Producer agent; 14 | @Override 15 | public void onStart() { 16 | agent = (Producer) myAgent; 17 | } 18 | 19 | @Override 20 | public void action() { 21 | ACLMessage request = myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.REJECT_PROPOSAL)); 22 | if (request != null) { 23 | double energySold = Double.parseDouble(request.getContent()); 24 | agent.setEnergy(agent.getEnergy() - energySold); 25 | String remains = String.format("%.2f", agent.getEnergy()); 26 | log.info(Color.CYAN + "{} продал {} кВт для {}, осталось {}" + Color.RESET, 27 | myAgent.getLocalName(), energySold, request.getSender().getLocalName(), remains); 28 | } else block(); 29 | } 30 | 31 | @Override 32 | public boolean done() { 33 | return false; 34 | } 35 | } -------------------------------------------------------------------------------- /lab4/lab4new/producer/ProducerGetReqFromDistributorBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.producer; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lab.lab4new.Agents.Producer; 7 | import lombok.extern.slf4j.Slf4j; 8 | import lab.lab4new.Auto.Parameters.Color; 9 | 10 | @Slf4j 11 | public class ProducerGetReqFromDistributorBehavior extends Behaviour { 12 | 13 | @Override 14 | public void action() { 15 | ACLMessage request = myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.REQUEST)); 16 | Producer agent = (Producer) myAgent; 17 | if (request != null) { 18 | double energyRequestF = Double.parseDouble(request.getContent().split(";")[0]); 19 | double energyRequestS = Double.parseDouble(request.getContent().split(";")[1]); 20 | double energyRequestT = Double.parseDouble(request.getContent().split(";")[2]); 21 | double currentEnergy = agent.getEnergy(); 22 | 23 | if (request.getPerformative() == ACLMessage.REQUEST) { 24 | try { 25 | Thread.sleep(10); 26 | } catch (InterruptedException e) { 27 | throw new RuntimeException(e); 28 | } 29 | log.info(Color.GREEN + "Запрашивают -> [{} | {} | {}], {}: в наличии -> {}" + Color.RESET, 30 | energyRequestF, energyRequestS, energyRequestT, myAgent.getLocalName(), currentEnergy); 31 | ACLMessage response = request.createReply(); 32 | if (energyRequestF > currentEnergy & energyRequestS > currentEnergy & energyRequestT > currentEnergy) { 33 | response.setPerformative(ACLMessage.REFUSE); 34 | } else { 35 | response.setPerformative(ACLMessage.PROPOSE); 36 | response.setContent(energyRequestF + ";" + energyRequestS + ";" + energyRequestT + ";" + agent.getStartCost()); 37 | } 38 | myAgent.send(response); 39 | } 40 | } else block(); 41 | } 42 | 43 | @Override 44 | public boolean done() { 45 | return false; 46 | } 47 | } -------------------------------------------------------------------------------- /lab4/lab4new/producer/ProducerWaitStartChat.java: -------------------------------------------------------------------------------- 1 | package lab.lab4new.producer; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | import lab.lab4new.ChatRoom.ProducerChat; 7 | 8 | public class ProducerWaitStartChat extends Behaviour { 9 | 10 | @Override 11 | public void action() { 12 | ACLMessage request = myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.CONFIRM)); 13 | if (request != null) myAgent.addBehaviour(new ProducerChat(request.getContent())); 14 | else block(); 15 | } 16 | @Override 17 | public boolean done() { 18 | return false; 19 | } 20 | } -------------------------------------------------------------------------------- /lab4/lab4other/Auto/Coefficients.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Auto; 2 | 3 | import jakarta.xml.bind.annotation.XmlAccessType; 4 | import jakarta.xml.bind.annotation.XmlAccessorType; 5 | import jakarta.xml.bind.annotation.XmlElement; 6 | import jakarta.xml.bind.annotation.XmlRootElement; 7 | import lombok.Data; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | @Slf4j 11 | @Data 12 | @XmlRootElement(name="Coefficients") 13 | @XmlAccessorType(XmlAccessType.FIELD) 14 | public class Coefficients { 15 | 16 | /** Коэффициент, характеризующий генерацию ТЭС в текущий час */ 17 | @XmlElement(name="A") 18 | private Double A; 19 | 20 | /** Коэффициент, характеризующий генерацию ВЭС в текущий час */ 21 | @XmlElement(name="B1") 22 | private Double B1; 23 | 24 | /** Коэффициент, характеризующий генерацию ВЭС в текущий час */ 25 | @XmlElement(name="B2") 26 | private Double B2; 27 | 28 | /** Коэффициент, характеризующий генерацию СЭС в текущий час */ 29 | @XmlElement(name="C0") 30 | private Double C0; 31 | 32 | /** Коэффициент, характеризующий генерацию СЭС в текущий час */ 33 | @XmlElement(name="C1") 34 | private Double C1; 35 | 36 | /** Коэффициент, характеризующий генерацию СЭС в текущий час */ 37 | @XmlElement(name="C2") 38 | private Double C2; 39 | 40 | /** Коэффициент, характеризующий генерацию СЭС в текущий час */ 41 | @XmlElement(name="C3") 42 | private Double C3; 43 | } -------------------------------------------------------------------------------- /lab4/lab4other/Auto/JExcelHelper.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Auto; 2 | 3 | import lab4.Config.DistributerConfig; 4 | import org.apache.poi.ss.usermodel.Cell; 5 | import org.apache.poi.ss.usermodel.CellType; 6 | import org.apache.poi.ss.usermodel.Row; 7 | import org.apache.poi.xssf.usermodel.XSSFSheet; 8 | import org.apache.poi.xssf.usermodel.XSSFWorkbook; 9 | import lab4.Helper.XMLHelper; 10 | 11 | 12 | import java.io.FileInputStream; 13 | import java.io.IOException; 14 | import java.util.ArrayList; 15 | import java.util.Iterator; 16 | import java.util.List; 17 | import java.util.Objects; 18 | 19 | public class JExcelHelper { 20 | 21 | public static void main(String[] args) { 22 | handler(); 23 | } 24 | 25 | public static void handler() { 26 | try (FileInputStream file = new FileInputStream("C:\\Users\\gamza\\IdeaProjects\\MAC\\src\\main\\resources\\Load.xlsx")) { 27 | XSSFWorkbook workbook = new XSSFWorkbook(file); 28 | XSSFSheet sheet = workbook.getSheet("Sheet"); 29 | Cell cell = null; 30 | List listz = new ArrayList<>(); 31 | List firstListz, secondListz, thirdListz; 32 | for (Row row : sheet) { 33 | Iterator cellIterator = row.cellIterator(); 34 | while (cellIterator.hasNext()) { 35 | cell = cellIterator.next(); 36 | if (Objects.requireNonNull(cell.getCellType()) == CellType.NUMERIC) { 37 | listz.add(cell.getNumericCellValue()); 38 | } 39 | } 40 | } 41 | firstListz = listz.subList(0, 24); 42 | secondListz = listz.subList(24, 48); 43 | thirdListz = listz.subList(48, 72); 44 | Parameters firstParameters = new Parameters(); 45 | Parameters secondParameters = new Parameters(); 46 | Parameters thirdParameters = new Parameters(); 47 | assert cell != null; 48 | firstParameters.setFirstPower(firstListz); 49 | secondParameters.setSecondPower(secondListz); 50 | thirdParameters.setThirdPower(thirdListz); 51 | firstParameters.setDistributer("firstDistributer"); 52 | secondParameters.setDistributer("secondDistributer"); 53 | thirdParameters.setDistributer("thirdDistributer"); 54 | // create 55 | XMLHelper.marshalAny(firstParameters, "src/main/resources/residentialBuildingConsumer.xml"); 56 | XMLHelper.marshalAny(secondParameters, "src/main/resources/colormetConsumer.xml"); 57 | XMLHelper.marshalAny(thirdParameters, "src/main/resources/foodIndustryConsumer.xml"); 58 | 59 | DistributerConfig distributerConfig = new DistributerConfig(); 60 | distributerConfig.setProducersName("residentialBuildingConsumer"); 61 | distributerConfig.setTopicName("topic1"); 62 | XMLHelper.marshalAny(distributerConfig, "firstDistributer.xml"); 63 | distributerConfig.setProducersName("secondDistributer"); 64 | distributerConfig.setTopicName("topic2"); 65 | XMLHelper.marshalAny(distributerConfig, "secondDistributer.xml"); 66 | distributerConfig.setProducersName("thirdDistributer"); 67 | distributerConfig.setTopicName("topic3"); 68 | XMLHelper.marshalAny(distributerConfig, "thirdDistributer.xml"); 69 | 70 | // parser 71 | // File xml = new File(args); 72 | // JAXBContext jaxbContext = JAXBContext.newInstance(Parameters.class); 73 | // Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 74 | // Parameters object = (Parameters) jaxbUnmarshaller.unmarshal(xml); 75 | // 76 | // for (Double def : object.getFirstPower()){ 77 | // List listParameters = new ArrayList<>(); 78 | // listParameters.add(firstParameters); 79 | //// def.setFile(firstListz); 80 | // System.out.println(def + " def"); 81 | // System.out.println(listParameters + " list"); 82 | // } 83 | } 84 | 85 | catch (IOException e) { 86 | e.printStackTrace(); 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /lab4/lab4other/Auto/Parameters.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Auto; 2 | 3 | import jakarta.xml.bind.annotation.XmlAccessType; 4 | import jakarta.xml.bind.annotation.XmlAccessorType; 5 | import jakarta.xml.bind.annotation.XmlElement; 6 | import jakarta.xml.bind.annotation.XmlRootElement; 7 | import lombok.Data; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | import java.util.List; 11 | 12 | @Slf4j 13 | @Data 14 | @XmlRootElement(name="Parameters") 15 | @XmlAccessorType(XmlAccessType.FIELD) 16 | public class Parameters { 17 | 18 | /** Потребляемая ЭЭ в текущий час */ 19 | @XmlElement(name="L") 20 | private List firstPower; 21 | @XmlElement(name="L") 22 | private List secondPower; 23 | @XmlElement(name="L") 24 | private List thirdPower; 25 | @XmlElement 26 | private String distributer; 27 | 28 | } -------------------------------------------------------------------------------- /lab4/lab4other/Consumer/AgentConsumer.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Consumer; 2 | 3 | import lab.lab4other.Consumer.Behaviors.DiscoverLoadBehavior; 4 | import jade.core.Agent; 5 | import lombok.extern.slf4j.Slf4j; 6 | 7 | /** 8 | * Класс агента потребителя 9 | * Имеет график нагрузки в XML виде, связанный со временем 10 | * Для покрытия этого графика делает запрос Агенту-Распределителю 11 | */ 12 | @Slf4j 13 | public class AgentConsumer extends Agent { 14 | 15 | @Override 16 | protected void setup() { 17 | log.info("{} starting to consume", getLocalName()); 18 | addBehaviour(new DiscoverLoadBehavior()); 19 | } 20 | } 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /lab4/lab4other/Consumer/Behaviors/ActiveBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Consumer.Behaviors; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.core.behaviours.ParallelBehaviour; 5 | import jade.core.behaviours.WakerBehaviour; 6 | import lombok.AllArgsConstructor; 7 | 8 | @AllArgsConstructor 9 | public class ActiveBehavior extends ParallelBehaviour { 10 | private Behaviour buyEnergy; 11 | private WakerBehaviour stopBuying; 12 | 13 | @Override 14 | public void onStart() { 15 | addSubBehaviour(buyEnergy); 16 | addSubBehaviour(stopBuying); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lab4/lab4other/Consumer/Behaviors/DiscoverLoadBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Consumer.Behaviors; 2 | 3 | import lab.lab4other.Master.Meeting; 4 | import lab.lab4other.Master.Definition; 5 | import lab.lab4other.Master.TimeHandler; 6 | import jade.core.behaviours.OneShotBehaviour; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | import javax.xml.bind.JAXBContext; 10 | import javax.xml.bind.JAXBException; 11 | import javax.xml.bind.Unmarshaller; 12 | import java.io.File; 13 | 14 | /** 15 | * Поведение Агента-Потребителя 16 | * По XML файлу сверяет график нагрузки и имеющиеся запасы ЭЭ 17 | * Если ЭЭ недостаточно, то запускает диалог с Агентом-распределителем энергии 18 | * В этом же поведении принимает сообщение от Распределителя о количестве закупленной ЭЭ 19 | */ 20 | @Slf4j 21 | public class DiscoverLoadBehavior extends OneShotBehaviour { 22 | 23 | @Override 24 | public void action() { 25 | // актуальное виртуальное время и время до конца часа 26 | int currentTime = (int) TimeHandler.getCurrentHour(); 27 | int tillTime = (int) TimeHandler.calcMillisTillNextHour(); 28 | // забирает из xml-файла значение необходимой энергии на следующий час 29 | double energyLess = parser(currentTime, getAgent().getLocalName()); 30 | if (energyLess != 0) { 31 | log.info("У агента {} на момент {} нехватка {}", getAgent().getLocalName(), currentTime, energyLess); 32 | getAgent().addBehaviour(new ActiveBehavior(new SendRequestAndWaitBehavior(energyLess), new TimeToEatBehavior(myAgent, tillTime))); 33 | } 34 | } 35 | 36 | public static double parser(int time, String agentName) { 37 | double value = 0; 38 | try { 39 | JAXBContext jaxbContext = JAXBContext.newInstance(Meeting.class); 40 | Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 41 | Meeting object = (Meeting) jaxbUnmarshaller.unmarshal(new File("src/main/resources/firstConsumer.xml"));; 42 | for (Definition def : object.getDefinitions()) { 43 | // возвращает из массива значений нагрузки нагрузку на актуальный час 44 | if (def.getAgent().equals(agentName)) value = def.getFile().get(time); 45 | } 46 | } catch (JAXBException | ClassCastException e) { 47 | e.printStackTrace(); 48 | } 49 | return value; 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /lab4/lab4other/Consumer/Behaviors/SendRequestAndWaitBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Consumer.Behaviors; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import jade.lang.acl.MessageTemplate; 7 | import lombok.extern.slf4j.Slf4j; 8 | 9 | /** 10 | * Класс поведения Агента-Потребителя 11 | * На входе отправляет сообщение о количестве необходимой ему энергии для покрытия графика нагрузки на следующий час. 12 | * Принимает сообщения от Агента-Дистрибьютора о количестве купленной энергии. 13 | * Если дистрибьютор успевает купить нужное количество энергии до истечения часа, то поведение извещает об этом. 14 | * Параллельно принимает сообщения от WakerBehavior. 15 | * Если при принятии сообщения об окончании поведения необходимое количество ЭЭ не доставлено, то план на час не выполнен и агент извещает об этом. 16 | */ 17 | @Slf4j 18 | public class SendRequestAndWaitBehavior extends Behaviour { 19 | 20 | static boolean keyExit; 21 | private double energyLess; 22 | private boolean lever = false; 23 | 24 | /** 25 | * @param energyLess количество необходимой потребителю энергии на следующий час 26 | */ 27 | SendRequestAndWaitBehavior(double energyLess) { 28 | this.energyLess = energyLess; 29 | } 30 | 31 | @Override 32 | public void onStart() { 33 | // сообщение-инициация о потребности в ЭЭ 34 | ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 35 | msg.setContent(String.valueOf(energyLess)); 36 | msg.setProtocol("giveMeElectricity"); 37 | msg.addReceiver(stack(getAgent().getLocalName())); 38 | getAgent().send(msg); 39 | keyExit = true; 40 | } 41 | 42 | @Override 43 | public void action() { 44 | // получает сообщение, содержащее купленную для потребителя энергию 45 | ACLMessage receive = getAgent().receive(MessageTemplate.MatchProtocol("get")); 46 | if (receive != null) { 47 | // из количества необходимой энергии вычитается полученная 48 | energyLess = energyLess - Double.parseDouble(receive.getContent()); 49 | if (energyLess <= 0) { 50 | log.info("Got all quantity"); 51 | lever = true; 52 | } else log.info("Потребителю {} осталось покрыть {}", getAgent().getLocalName(), energyLess); 53 | } 54 | // при пробуждении Waker с ключом приходит оповещение о конце ожидания 55 | if (!keyExit) { 56 | System.err.println("Distributor is failed! Not Enough energy!"); 57 | lever = true; 58 | } 59 | } 60 | 61 | /** 62 | * @param agentName задается имя агента, выполняющего операцию 63 | * @return имя получателя сообщения 64 | */ 65 | AID stack(String agentName){ 66 | return switch (agentName) { 67 | case "AgentConsumer1" -> new AID("AgentDistributor1", false); 68 | case "AgentConsumer2" -> new AID("AgentDistributor2", false); 69 | case "AgentConsumer3" -> new AID("AgentDistributor3", false); 70 | default -> null; 71 | }; 72 | } 73 | 74 | @Override 75 | public boolean done() { 76 | return lever; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /lab4/lab4other/Consumer/Behaviors/TimeToEatBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Consumer.Behaviors; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.WakerBehaviour; 5 | 6 | public class TimeToEatBehavior extends WakerBehaviour { 7 | public TimeToEatBehavior(Agent agent, long timeout) { 8 | super(agent, timeout); 9 | } 10 | @Override 11 | protected void onWake() { 12 | SendRequestAndWaitBehavior.keyExit = false; 13 | getAgent().addBehaviour(new DiscoverLoadBehavior()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lab4/lab4other/Distributor/AgentDistributor.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Distributor; 2 | 3 | import lab.lab4other.Distributor.Behaviors.WaitConsumer; 4 | import jade.core.Agent; 5 | import lombok.extern.slf4j.Slf4j; 6 | 7 | /** 8 | * Класс Агента-Распределителя связывает Агента-Производителя и Агента-Потребителя 9 | * При получении запроса на покупку ЭЭ обращается к Агентам-Производителям с предложением организовать торги. 10 | * Он же их и заканчивает, выбирая наилучшую цену и заключая контракт с Производителем. Передает купленную ЭЭ обратно Потребителю 11 | */ 12 | @Slf4j 13 | public class AgentDistributor extends Agent { 14 | @Override 15 | protected void setup() { 16 | log.info("I'm {}", getLocalName()); 17 | addBehaviour(new WaitConsumer()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lab4/lab4other/Distributor/Behaviors/BetEndingBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Distributor.Behaviors; 2 | 3 | import jade.core.AID; 4 | import jade.core.Agent; 5 | import jade.core.behaviours.WakerBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | 8 | public class BetEndingBehavior extends WakerBehaviour { 9 | 10 | private AID topic; 11 | public BetEndingBehavior(Agent agent, long timeout, AID topic) { 12 | super(agent, timeout); 13 | this.topic = topic; 14 | } 15 | 16 | @Override 17 | protected void onWake() { 18 | ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 19 | msg.setProtocol("KeyExit"); 20 | msg.setContent("NotNull"); 21 | msg.addReceiver(topic); 22 | myAgent.send(msg); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lab4/lab4other/Distributor/Behaviors/GetBetBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Distributor.Behaviors; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.lang.acl.ACLMessage; 6 | import jade.lang.acl.MessageTemplate; 7 | import lab.lab4other.Master.TimeHandler; 8 | import lombok.NoArgsConstructor; 9 | import lombok.extern.slf4j.Slf4j; 10 | 11 | @Slf4j 12 | @NoArgsConstructor 13 | public class GetBetBehavior extends Behaviour { 14 | 15 | private int pieceOfPie = 1; 16 | private AID topic; 17 | private double quantity; 18 | private boolean keyExit, getTest; 19 | private int till, tilt; 20 | double initialBet = 500_000; 21 | private double bestBet = initialBet; 22 | 23 | public GetBetBehavior(double quantity, int till) { 24 | this.quantity = quantity; 25 | this.tilt = till; 26 | } 27 | 28 | @Override 29 | public void onStart() { 30 | keyExit = false; 31 | getTest = false; 32 | till = tilt; 33 | initialBet = 500_000; 34 | bestBet = initialBet; 35 | 36 | // ждем получения названия топика, чтобы начать сканирование лучшей цены 37 | while (!getTest) { 38 | ACLMessage receive = getAgent().receive(MessageTemplate.MatchProtocol("Test")); 39 | if (receive != null) { 40 | try { 41 | Thread.sleep(2000); 42 | } catch (InterruptedException e) { 43 | e.printStackTrace(); 44 | } 45 | getTest = true; 46 | topic = new AID(receive.getContent(), true); 47 | // начальная ставка - флаг, от которой начинают отталкиваться производителя в торгах 48 | convertInMSG(topic, String.valueOf(initialBet), "getBet"); 49 | // создаем Waker, заканчивающий торги и помогающий впоследствии объявить победителя 50 | getAgent().addBehaviour(new BetEndingBehavior(myAgent, 15000, topic)); 51 | } 52 | } 53 | } 54 | 55 | @Override 56 | public void action() { 57 | ACLMessage msg = getAgent().receive(MessageTemplate.and(MessageTemplate.MatchTopic(topic), MessageTemplate.MatchProtocol("getBet"))); 58 | if (msg != null) { 59 | double contentBet = Double.parseDouble(msg.getContent()); 60 | if (contentBet < bestBet) { 61 | bestBet = contentBet; 62 | convertInMSG(topic, String.valueOf(bestBet), "getBet"); 63 | } 64 | } 65 | 66 | ACLMessage receive = getAgent().receive(MessageTemplate.and(MessageTemplate.MatchTopic(topic), MessageTemplate.MatchProtocol("KeyExit"))); 67 | if (receive != null) { 68 | quantity -= pieceOfPie; 69 | keyExit = true; 70 | } 71 | } 72 | 73 | public boolean done() { 74 | return keyExit; 75 | } 76 | 77 | @Override 78 | public int onEnd() { 79 | if (bestBet != initialBet) convertInMSG(stack(getAgent().getLocalName()), String.valueOf(pieceOfPie), "get"); 80 | else log.info("Empty topic {}", topic.getLocalName()); 81 | // переменная, следящая за истечением срока удовлетворения нужд потребителя 82 | till -= (System.currentTimeMillis() - TimeHandler.startTime) % TimeHandler.hourDuration; 83 | long limit = 18000; 84 | if (quantity > 0) { // нужды потребителя не восполнены в должной мере 85 | if (till < limit) { // дистрибьютор не успевает уложиться, прерываем ФСМ 86 | System.out.println("Времени мало!"); 87 | return 0; 88 | } 89 | // времени еще 90 | try { 91 | Thread.sleep(2000); 92 | } catch (InterruptedException e) { 93 | e.printStackTrace(); 94 | } 95 | // идем на новый круг торгов 96 | return 1; 97 | } 98 | // все нужды удовлетворены, FSM-поведение заканчивается 99 | return 0; 100 | } 101 | 102 | /** 103 | * метод для конвертации данных в сообщение 104 | * @param agentTarget получатель сообщения 105 | * @param content содержимое сообщения 106 | * @param protocol протокол 107 | */ 108 | void convertInMSG(AID agentTarget, String content, String protocol) { 109 | ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 110 | msg.addReceiver(agentTarget); 111 | msg.setContent(content); 112 | msg.setProtocol(protocol); 113 | getAgent().send(msg); 114 | } 115 | 116 | private AID stack(String agentName) { 117 | return switch (agentName) { 118 | case "AgentDistributor1" -> new AID("AgentConsumer1", false); 119 | case "AgentDistributor2" -> new AID("AgentConsumer2", false); 120 | case "AgentDistributor3" -> new AID("AgentConsumer3", false); 121 | default -> null; 122 | }; 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /lab4/lab4other/Distributor/Behaviors/TraderBehaviorFSM.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Distributor.Behaviors; 2 | 3 | import lab.lab4other.Master.TimeHandler; 4 | import jade.core.AID; 5 | import jade.core.ServiceException; 6 | import jade.core.behaviours.FSMBehaviour; 7 | import jade.core.behaviours.OneShotBehaviour; 8 | import jade.core.messaging.TopicManagementHelper; 9 | import jade.domain.DFService; 10 | import jade.domain.FIPAAgentManagement.DFAgentDescription; 11 | import jade.domain.FIPAException; 12 | import jade.lang.acl.ACLMessage; 13 | import lombok.RequiredArgsConstructor; 14 | import lombok.extern.slf4j.Slf4j; 15 | 16 | 17 | /** 18 | * Поведение Агента-Дистрибьютора 19 | * FSM-поведение выполняет функции создания топика и поиска победителей в торгах: 20 | * 1. FirstState: создание топика и приглашение в него потенциальных участников 21 | * 2. Ведение учета лучшей цены во время ведения торгов между производителями. 22 | * Если в результате торгов вся нужная ЭЭ для потребителя была закуплена, то FSM-поведение завершается, если нет - то поведение идет на новый цикл торгов 23 | */ 24 | @Slf4j 25 | @RequiredArgsConstructor 26 | public class TraderBehaviorFSM extends FSMBehaviour { 27 | 28 | GetBetBehavior getBetBehavior = new GetBetBehavior(); 29 | private final double quantity; 30 | private DFAgentDescription dfad; 31 | private int tillTime = (int) TimeHandler.calcMillisTillNextHour(); 32 | 33 | @Override 34 | public void onStart() { 35 | registerFirstState(new OneShotBehaviour() { 36 | public void action() { 37 | // зовем в топик 38 | AID aid = createTopic(); 39 | try { 40 | findAndSend(aid); 41 | } catch (FIPAException e) { 42 | throw new RuntimeException(e); 43 | } 44 | log.info("{} created a topic {}", getAgent().getLocalName(), aid.getName()); 45 | getBetBehavior.convertInMSG(getAgent().getAID(), aid.getName(), "Test"); 46 | } 47 | }, "Start"); 48 | 49 | // активная фаза торгов 50 | registerState(new GetBetBehavior(quantity, tillTime), "Gap"); 51 | // это условие должно выполняться при полном пополнении ЭЭ либо при досрочном выходе по истечении времени 52 | registerLastState(new OneShotBehaviour() { 53 | public void action() { 54 | log.info("Stop bargains"); 55 | } 56 | }, "End"); 57 | // Поскольку после первого состояния должно быть выполнено второе и никакого ветвления не подразумевается, используем 58 | registerDefaultTransition("Start", "Gap", new String[]{"Start", "Gap"}); 59 | registerTransition("Gap", "Start", 1); 60 | registerTransition("Gap", "End", 0); 61 | } 62 | 63 | private AID createTopic() { 64 | AID jadeTopic = null; 65 | try { 66 | TopicManagementHelper topicHelper = (TopicManagementHelper) getAgent().getHelper(TopicManagementHelper.SERVICE_NAME); 67 | // создаем топик со случайным именем 68 | double random = Math.random() * 100; 69 | jadeTopic = topicHelper.createTopic("Test" + random); 70 | topicHelper.register(jadeTopic); 71 | } catch (ServiceException se) { 72 | se.printStackTrace(); 73 | } 74 | return jadeTopic; 75 | } 76 | 77 | private void findAndSend(AID aid) throws FIPAException { 78 | for (DFAgentDescription foundAgent : DFService.search(myAgent, dfad)) { 79 | ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 80 | msg.setProtocol("Registration"); 81 | msg.setContent(aid.getLocalName()); 82 | msg.addReceiver(foundAgent.getName()); 83 | getAgent().send(msg); 84 | } 85 | } 86 | } 87 | 88 | -------------------------------------------------------------------------------- /lab4/lab4other/Distributor/Behaviors/WaitConsumer.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Distributor.Behaviors; 2 | 3 | import jade.core.behaviours.Behaviour; 4 | import jade.lang.acl.ACLMessage; 5 | import jade.lang.acl.MessageTemplate; 6 | 7 | /** 8 | * Поведение Агента-Распределителя 9 | * Ожидает запроса на покупку ЭЭ от Агента-Потребителя, создает FSM-поведение, в котором происходят последующие торги 10 | */ 11 | 12 | public class WaitConsumer extends Behaviour { 13 | 14 | @Override 15 | public void action() { 16 | ACLMessage receive = getAgent().receive(MessageTemplate.MatchProtocol("giveMeElectricity")); 17 | if (receive != null) { 18 | // получаем сообщение от потребителей о нужде в ЭЭ 19 | double quantity = Double.parseDouble(receive.getContent()); 20 | // запуск ФСМ 21 | getAgent().addBehaviour(new TraderBehaviorFSM(quantity)); 22 | } 23 | } 24 | @Override 25 | public boolean done() { 26 | return false; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lab4/lab4other/Master/Container.java: -------------------------------------------------------------------------------- 1 | //package lab.lab4.Master; 2 | // 3 | //import jade.core.ProfileImpl; 4 | //import jade.core.Runtime; 5 | //import jade.util.leap.Properties; 6 | //import jade.wrapper.AgentContainer; 7 | //import jade.wrapper.AgentController; 8 | //import lombok.SneakyThrows; 9 | // 10 | //public class Container { 11 | // 12 | // private static AgentContainer agentContainer; 13 | // 14 | // public static void main(String[] args) { 15 | // 16 | // Properties properties = new Properties(); 17 | // properties.setProperty("gui", "true"); 18 | // ProfileImpl profile = new ProfileImpl(properties); 19 | // Runtime.instance().setCloseVM(true); 20 | // agentContainer = Runtime.instance().createMainContainer(profile); 21 | // createAgents(); 22 | // 23 | // } 24 | // 25 | // @SneakyThrows 26 | // public static void createAgents() { 27 | // AgentController T = agentContainer.createNewAgent("ТЭС", ProducerAgent.class.getName(), new Object[]{}); 28 | // AgentController B = agentContainer.createNewAgent("ВЭС", ProducerAgent.class.getName(), new Object[]{}); 29 | // AgentController S = agentContainer.createNewAgent("СЭС", ProducerAgent.class.getName(), new Object[]{}); 30 | // 31 | // AgentController distributor_1 = agentContainer.createNewAgent("Distributor-1", DistributorAgent.class.getName(), new Object[]{}); 32 | // AgentController consumer_1 = agentContainer.createNewAgent("Consumer-1", ConsumerAgent.class.getName(), new Object[]{}); 33 | // AgentController master = agentContainer.createNewAgent("master.Master-1", Master.class.getName(), new Object[]{}); 34 | // 35 | // T.start(); 36 | // B.start(); 37 | // S.start(); 38 | // distributor_1.start(); 39 | // consumer_1.start(); 40 | // master.start(); 41 | // } 42 | //} 43 | -------------------------------------------------------------------------------- /lab4/lab4other/Master/Definition.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Master; 2 | 3 | import lombok.Data; 4 | 5 | import jakarta.xml.bind.annotation.XmlAccessType; 6 | import jakarta.xml.bind.annotation.XmlAccessorType; 7 | import jakarta.xml.bind.annotation.XmlAttribute; 8 | 9 | import java.util.List; 10 | 11 | @Data 12 | @XmlAccessorType(XmlAccessType.FIELD) 13 | public class Definition { 14 | @XmlAttribute 15 | private String agent; 16 | @XmlAttribute 17 | private String clazz; 18 | @XmlAttribute 19 | private List file; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /lab4/lab4other/Master/Launcher.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Master; 2 | import jade.core.Agent; 3 | import jade.wrapper.AgentController; 4 | import jade.wrapper.StaleProxyException; 5 | 6 | public class Launcher extends Agent { 7 | 8 | @Override 9 | protected void setup() { 10 | String path = getArguments()[0].toString(); 11 | Meeting meeting = xmlHandler.unMarshalAny(Meeting.class, path); 12 | assert meeting != null; 13 | for (Definition definition : meeting.getDefinitions()) { 14 | try { 15 | AgentController createdAgent = getContainerController(). 16 | createNewAgent(definition.getAgent(), definition.getClazz(), new Object[]{definition.getFile()}); 17 | createdAgent.start(); 18 | } catch (StaleProxyException e) { 19 | e.printStackTrace(); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lab4/lab4other/Master/Main.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Master; 2 | 3 | import jade.core.Profile; 4 | import jade.core.ProfileImpl; 5 | import jade.wrapper.AgentController; 6 | import jade.wrapper.ContainerController; 7 | import jade.wrapper.ControllerException; 8 | import lombok.Data; 9 | import jade.core.Runtime; 10 | 11 | import java.util.Properties; 12 | 13 | @Data 14 | public class Main { 15 | 16 | public static void main(String[] args) { 17 | System.out.println("Starting launcher app"); 18 | Properties property = new Properties(); 19 | System.out.println("Parsing config"); 20 | // try (FileInputStream fis = new FileInputStream(args.length > 0 ? args[0] : "config.properties")){ 21 | // property.load(fis); 22 | // System.out.println("Config OK"); 23 | // } catch (IOException e) { 24 | // System.err.println("ОШИБКА: файл конфигурации не найден!"); 25 | // return; 26 | // } 27 | 28 | Runtime runtime = Runtime.instance(); 29 | System.out.println("Connecting to JADE"); 30 | ProfileImpl profile = createProfile(property); 31 | ContainerController container = runtime.createMainContainer(profile); 32 | System.out.println("Connected to JADE"); 33 | 34 | 35 | try { 36 | AgentController agentController = container. 37 | createNewAgent(property.getProperty("agent.name","Smith"), 38 | property.getProperty("agent.class","lab.lab4.Master.Launcher"), 39 | new Object[] { property.getProperty("xml.filepath", "Meeting.xml") } 40 | ); 41 | 42 | // здесь импортируем в xml файлы из excel 43 | // importLoad(property.getProperty("xml.filepath", "src/main/resources/config.xml")); 44 | // importPower(property.getProperty("xml.filepath")); 45 | // handler(property.getProperty("xml.filepath", "firstConsumer.xml")); 46 | property.getProperty("xml.filepath", "src/main/resources/Meeting.xml"); 47 | agentController.start(); 48 | System.out.println("Launcher agent has been created"); 49 | } catch (ControllerException e) { 50 | System.out.println("Невозможно создать агента Launcher: " + e.getMessage()); 51 | } 52 | } 53 | 54 | private static ProfileImpl createProfile(Properties property) { 55 | ProfileImpl profile = new ProfileImpl(); 56 | profile.setParameter(Profile.CONTAINER_NAME, property.getProperty("agent.container", "Container")); 57 | profile.setParameter(Profile.MAIN_HOST, property.getProperty("agent.host", "127.0.0.1")); 58 | profile.setParameter(Profile.MAIN_PORT, property.getProperty("agent.port", "1099")); 59 | profile.setParameter(Profile.LOCAL_PORT, property.getProperty("agent.local-port", "1201")); 60 | 61 | if (property.getProperty("agent.gui", "false").equals("true")) profile.setParameter("gui", "true"); 62 | if (property.containsKey("agent.services")) profile.setParameter("services", property.getProperty("agent.services", "")); 63 | if (property.containsKey("agent.mtp")) profile.setParameter("mtps", property.getProperty("agent.mtp","")); 64 | return profile; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /lab4/lab4other/Master/Meeting.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Master; 2 | 3 | import lombok.Data; 4 | 5 | import jakarta.xml.bind.annotation.*; 6 | import java.util.List; 7 | @Data 8 | @XmlRootElement(name="cfg") 9 | @XmlAccessorType(XmlAccessType.FIELD) 10 | public class Meeting { 11 | @XmlElement(name="definition") 12 | @XmlElementWrapper(name="agents") 13 | private List definitions; 14 | } 15 | -------------------------------------------------------------------------------- /lab4/lab4other/Master/TimeHandler.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Master; 2 | 3 | /** 4 | * Класс-реализация методов обращения к виртуальному времени 5 | */ 6 | public class TimeHandler { 7 | public static long startTime = System.currentTimeMillis(); 8 | public static long hourDuration = 120_000; 9 | 10 | public static long getCurrentHour(){ 11 | return (System.currentTimeMillis() - startTime) / hourDuration % 24; 12 | } 13 | 14 | public static long calcMillisTillNextHour(){ 15 | return hourDuration - (System.currentTimeMillis() - startTime) % hourDuration; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lab4/lab4other/Master/xlsxHandler.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Master; 2 | 3 | import lombok.Data; 4 | import org.apache.poi.ss.usermodel.Cell; 5 | import org.apache.poi.ss.usermodel.CellType; 6 | import org.apache.poi.ss.usermodel.Row; 7 | import org.apache.poi.xssf.usermodel.XSSFSheet; 8 | import org.apache.poi.xssf.usermodel.XSSFWorkbook; 9 | 10 | import jakarta.xml.bind.JAXBContext; 11 | import jakarta.xml.bind.JAXBException; 12 | import jakarta.xml.bind.Marshaller; 13 | import jakarta.xml.bind.Unmarshaller; 14 | import java.io.File; 15 | import java.io.FileInputStream; 16 | import java.io.IOException; 17 | import java.util.ArrayList; 18 | import java.util.Iterator; 19 | import java.util.Objects; 20 | 21 | /** 22 | * Класс для импорта данных из xlsx-файлов 23 | */ 24 | @Data 25 | public class xlsxHandler { 26 | 27 | /** 28 | * Метод, импортирующий график нагрузки потребителя из xlsx-файла в xml 29 | */ 30 | public static void importLoad(String load) { 31 | File file = new File("C:\\Users\\gamza\\IdeaProjects\\MAC\\src\\main\\java\\lab\\lab4\\resources\\Load.xlsx"); 32 | XSSFWorkbook workBook = null; 33 | try { 34 | FileInputStream fis = new FileInputStream(file); 35 | // Finds the workbook instance for XLSX file 36 | workBook = new XSSFWorkbook(fis); 37 | } catch (IOException e) { 38 | e.printStackTrace(); 39 | } 40 | // Return first sheet from the XLSX workbook 41 | assert workBook != null; 42 | XSSFSheet mySheet = workBook.getSheet("Sheet"); 43 | try { 44 | JAXBContext jaxbContext = JAXBContext.newInstance(Meeting.class); 45 | Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 46 | Meeting object = (Meeting) jaxbUnmarshaller.unmarshal(new File(load));; 47 | for (Definition def : object.getDefinitions()) { 48 | ArrayList list = new ArrayList<>(); 49 | Iterator rowIterator = mySheet.iterator(); 50 | Row row = rowIterator.next(); 51 | Iterator cellIterator = row.cellIterator(); 52 | 53 | while (cellIterator.hasNext()) { 54 | Cell cell = cellIterator.next(); 55 | // System.out.println(cell.getStringCellValue()); 56 | 57 | if (Objects.equals(cell.getNumericCellValue(), def.getAgent())) { 58 | int colin = cell.getColumnIndex(); 59 | 60 | // Traversing over each row of XLSX file 61 | while (rowIterator.hasNext()) { 62 | Row row1 = rowIterator.next(); 63 | Cell cell1 = row1.getCell(colin); 64 | if (cell1.getCellType() == CellType.NUMERIC) list.add(cell1.getNumericCellValue()); 65 | } 66 | } 67 | } 68 | // def.setFile(list); 69 | } 70 | Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 71 | jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 72 | jaxbMarshaller.marshal(object, new File(load)); 73 | 74 | } catch (JAXBException | ClassCastException e) { 75 | e.printStackTrace(); 76 | } 77 | } 78 | 79 | /** 80 | * Метод, импортирующий график объема производства электроэнергии ЭЭ из xlsx-файла в xml 81 | */ 82 | public static void importPower(String power) { 83 | 84 | File file = new File("C:\\Users\\gamza\\IdeaProjects\\MAC\\src\\main\\java\\lab\\lab4\\resources\\Power.xlsx"); 85 | XSSFWorkbook myWorkBook = null; 86 | try { 87 | FileInputStream fis = new FileInputStream(file); 88 | myWorkBook = new XSSFWorkbook(fis); 89 | } catch (IOException e) { 90 | e.printStackTrace(); 91 | } 92 | 93 | assert myWorkBook != null; 94 | XSSFSheet mySheet = myWorkBook.getSheet("Sheet"); 95 | try { 96 | JAXBContext jaxbContext = JAXBContext.newInstance(Meeting.class); 97 | Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 98 | Meeting object = (Meeting) jaxbUnmarshaller.unmarshal(new File(power));; 99 | 100 | for (Definition def : object.getDefinitions()) { 101 | Iterator rowIterator = mySheet.iterator(); 102 | Row row = rowIterator.next(); 103 | Iterator cellIterator = row.cellIterator(); 104 | 105 | while (cellIterator.hasNext()) { 106 | Cell cell = cellIterator.next(); 107 | if (cell.getStringCellValue().equals(def.getAgent())) { 108 | int colin = cell.getColumnIndex(); 109 | 110 | // Traversing over each row of XLSX file 111 | while (rowIterator.hasNext()) { 112 | Row row1 = rowIterator.next(); 113 | Cell cell1 = row1.getCell(colin); 114 | 115 | if (cell1.getCellType() == CellType.NUMERIC) { 116 | // def.getFile().add(cell1.getNumericCellValue()); 117 | } 118 | } 119 | } 120 | } 121 | } 122 | Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 123 | jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 124 | jaxbMarshaller.marshal(object, new File(power)); 125 | 126 | } catch (JAXBException | ClassCastException e) { 127 | e.printStackTrace(); 128 | } 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /lab4/lab4other/Master/xmlHandler.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Master; 2 | 3 | import jakarta.xml.bind.JAXBContext; 4 | import jakarta.xml.bind.JAXBException; 5 | import jakarta.xml.bind.Marshaller; 6 | 7 | import jakarta.xml.bind.Unmarshaller; 8 | import java.io.File; 9 | 10 | public class xmlHandler { 11 | public static T unMarshalAny(Class clazz, String outPutFileName) { 12 | T object = null; 13 | try { 14 | JAXBContext jaxbContext = JAXBContext.newInstance(clazz); 15 | Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 16 | try { 17 | object = (T) jaxbUnmarshaller.unmarshal(new File(outPutFileName));; 18 | } catch (ClassCastException cce) { 19 | cce.printStackTrace(); 20 | } catch (JAXBException e) { 21 | throw new RuntimeException(e); 22 | } 23 | } catch (JAXBException e) { 24 | e.printStackTrace(); 25 | } 26 | return object; 27 | } 28 | 29 | public static void marshalAny(Class clazz, T information, String outPutFileName) { 30 | try { 31 | JAXBContext jaxbContext = JAXBContext.newInstance(clazz); 32 | Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 33 | jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 34 | jaxbMarshaller.marshal(information, new File(outPutFileName)); 35 | } catch (JAXBException e) { 36 | e.printStackTrace(); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lab4/lab4other/Producer/AgentProducer.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Producer; 2 | 3 | 4 | import lab.lab4other.Producer.Behaviors.WaitInviteBehavior; 5 | import jade.core.Agent; 6 | import lombok.extern.slf4j.Slf4j; 7 | 8 | import static lab.lab4other.Producer.ProducerBehavior.registration; 9 | 10 | 11 | // Класс Агента-Производителя. Производит ЭЭ, по предложению Агента-Распределителя участвует в торгах за право продать ему ЭЭ 12 | 13 | @Slf4j 14 | public class AgentProducer extends Agent { 15 | 16 | @Override 17 | protected void setup() { 18 | // создание нового объекта класса "батарея" 19 | Battery battery = new Battery(getLocalName()); 20 | // начало накопления электроэнергии 21 | battery.charge(); 22 | log.info("I'm producer {}!", getLocalName()); 23 | registration(this); 24 | addBehaviour(new WaitInviteBehavior(battery)); 25 | } 26 | 27 | } 28 | 29 | enum Services { 30 | Producer 31 | } 32 | -------------------------------------------------------------------------------- /lab4/lab4other/Producer/Battery.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Producer; 2 | 3 | import lab.lab4other.Master.TimeHandler; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | 7 | import static lab.lab4other.Consumer.Behaviors.DiscoverLoadBehavior.parser; 8 | 9 | @Slf4j 10 | @RequiredArgsConstructor 11 | public class Battery { 12 | private static int turnInAhour = 6; 13 | private final String agentName; 14 | public double batteryCharge = 0; 15 | public void charge(){ 16 | // забирает из xml-файла значение необходимой энергии на следующий час 17 | Thread tready = new Thread(() -> { 18 | while (true) { 19 | int currentHour = (int) TimeHandler.getCurrentHour(); 20 | // забирает из xml-файла значение необходимой энергии на следующий час 21 | batteryCharge += parser(currentHour, agentName) / turnInAhour; 22 | log.info("Agent's current stock {}: {}", agentName, batteryCharge); 23 | try { 24 | Thread.sleep(TimeHandler.hourDuration / turnInAhour - (turnInAhour * 25 | (System.currentTimeMillis() - TimeHandler.startTime)) % TimeHandler.hourDuration); 26 | } catch (InterruptedException e) { 27 | e.printStackTrace(); 28 | } 29 | } 30 | }); 31 | tready.start(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lab4/lab4other/Producer/Behaviors/TopicDialogueBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Producer.Behaviors; 2 | 3 | import lab.lab4other.Producer.Battery; 4 | import jade.core.AID; 5 | import jade.core.behaviours.Behaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import jade.lang.acl.MessageTemplate; 8 | import lombok.extern.slf4j.Slf4j; 9 | 10 | // Поведение Агента-Производителя. Имитирует участие в торгах с другими производителями 11 | @Slf4j 12 | public class TopicDialogueBehavior extends Behaviour { 13 | 14 | private int pieceOfPie = 1; 15 | private AID topic; 16 | private boolean key = false; 17 | private double bet = Double.POSITIVE_INFINITY; 18 | private Battery battery; 19 | private double limit; 20 | String kingName; 21 | 22 | TopicDialogueBehavior(AID topic, Battery battery, String kingName){ 23 | this.topic = topic; 24 | this.battery = battery; 25 | this.kingName = kingName; 26 | } 27 | 28 | 29 | @Override 30 | public void onStart() { 31 | limit = 1000 / (battery.batteryCharge + 1); 32 | } 33 | 34 | @Override 35 | public void action() { 36 | ACLMessage first_msg = getAgent().receive(MessageTemplate.and(MessageTemplate.MatchTopic(topic), MessageTemplate.MatchProtocol("getBet"))); 37 | if (first_msg != null){ 38 | if (first_msg.getSender().getLocalName().equals(kingName)) { 39 | double betRival = Double.parseDouble(first_msg.getContent()); 40 | if (betRival <= bet) { 41 | if (0.7 * betRival >= limit) bet = 0.7 * betRival; 42 | else if (betRival >= limit) bet = limit; 43 | else { 44 | key = true; 45 | log.info("{} is going out of betting {}!", getAgent().getLocalName(), topic.getLocalName()); 46 | // возвращаем значение проигравшему в торгах обратно 47 | battery.batteryCharge += pieceOfPie; 48 | } 49 | } 50 | ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 51 | msg.addReceiver(topic); 52 | msg.setProtocol("getBet"); 53 | msg.setContent(Double.toString(bet)); 54 | getAgent().send(msg); 55 | } 56 | } 57 | ACLMessage second_msg = getAgent().receive(MessageTemplate.and(MessageTemplate.MatchTopic(topic), MessageTemplate.MatchProtocol("KeyExit"))); 58 | if (second_msg != null) { 59 | key = true; 60 | log.info("I'm {} a winner in a topic {}", getAgent().getLocalName(), topic.getName()); 61 | } 62 | } 63 | 64 | @Override 65 | public boolean done() { 66 | return key; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /lab4/lab4other/Producer/Behaviors/WaitInviteBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Producer.Behaviors; 2 | 3 | import lab.lab4other.Producer.Battery; 4 | import jade.core.AID; 5 | import jade.core.ServiceException; 6 | import jade.core.behaviours.Behaviour; 7 | import jade.core.messaging.TopicManagementHelper; 8 | import jade.lang.acl.ACLMessage; 9 | import jade.lang.acl.MessageTemplate; 10 | import lombok.extern.slf4j.Slf4j; 11 | 12 | // Поведение Агента-Производителя. Ждет приглашения в топик и подписывает контракт с Дистрибьютором в случае победы в торгах 13 | @Slf4j 14 | public class WaitInviteBehavior extends Behaviour { 15 | 16 | private int pieceOfPie = 1; 17 | private Battery battery; 18 | public WaitInviteBehavior(Battery battery) { 19 | this.battery = battery; 20 | } 21 | 22 | @Override 23 | public void action() { 24 | // блок ожидания сообщения о приглашении в топик 25 | ACLMessage msg = getAgent().receive(MessageTemplate.MatchProtocol("Registration")); 26 | if (msg != null) { 27 | if (battery.batteryCharge > pieceOfPie) { 28 | // изымаем некоторое количество энергии из доступного резерва на время торгов 29 | battery.batteryCharge -= pieceOfPie; 30 | // производитель подписывается на топик 31 | AID topic = subscribeTopic(msg.getContent()); 32 | getAgent().addBehaviour(new TopicDialogueBehavior(topic, battery, msg.getSender().getLocalName())); 33 | log.info("{} got inviting from {} to enter a {} topic", getAgent().getLocalName(), msg.getSender().getLocalName(), msg.getContent()); 34 | } 35 | } 36 | } 37 | 38 | @Override 39 | public boolean done() { 40 | return false; 41 | } 42 | 43 | /* создаем чат с именем name 44 | * метод подписывается на топик, созданный дистрибьютором 45 | * @param name имя агента-производителя, подписывающегося на топик 46 | * @return 47 | */ 48 | private AID subscribeTopic(String name) { 49 | AID jadeTopic = null; 50 | try { 51 | TopicManagementHelper topicHelper = (TopicManagementHelper) getAgent().getHelper(TopicManagementHelper.SERVICE_NAME); 52 | jadeTopic = topicHelper.createTopic(name); 53 | topicHelper.register(jadeTopic); 54 | } catch (ServiceException e) { 55 | e.printStackTrace(); 56 | } 57 | return jadeTopic; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lab4/lab4other/Producer/ProducerAgent.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Producer; 2 | 3 | import jade.core.Agent; 4 | import jade.domain.DFService; 5 | import jade.domain.FIPAAgentManagement.DFAgentDescription; 6 | import jade.domain.FIPAAgentManagement.ServiceDescription; 7 | import lombok.Data; 8 | import lombok.EqualsAndHashCode; 9 | import lombok.SneakyThrows; 10 | import lombok.extern.slf4j.Slf4j; 11 | 12 | 13 | @Slf4j 14 | @EqualsAndHashCode(callSuper = true) 15 | @Data 16 | public class ProducerAgent extends Agent { 17 | 18 | private Double energy, startCost, minCost = 0d; 19 | 20 | @Override 21 | @SneakyThrows 22 | protected void setup() { 23 | log.info("{} запущен", this.getLocalName()); 24 | switch (this.getLocalName()) { 25 | case "ТЭС" -> this.addBehaviour(new ProducerBehavior("ТЭС", 15.7)); 26 | case "ВЭС" -> this.addBehaviour(new ProducerBehavior("ВЭС", 7.2, 8.3)); 27 | case "СЭС" -> this.addBehaviour(new ProducerBehavior("СЭС", -78.985, 20.313, -1.3185, 0.0247)); 28 | } 29 | // this.addBehaviour(new ProducerGetReqFromDistributorBehavior()); 30 | // this.addBehaviour(new ProducerWaitStartChat()); 31 | // this.addBehaviour(new ProducerGetOrderFromDistributorBeh()); 32 | 33 | // регистрация в yellow pages. Агент производитель предоставляет сервис Producer 34 | DFAgentDescription dfd = new DFAgentDescription(); 35 | dfd.setName(getAID()); 36 | ServiceDescription sd = new ServiceDescription(); 37 | sd.setName(getLocalName()); 38 | sd.setType("Producer"); 39 | dfd.addServices(sd); 40 | DFService.register(this, dfd); 41 | } 42 | 43 | public void generate(double generatedEnergy) { 44 | energy = energy + generatedEnergy; 45 | } 46 | } -------------------------------------------------------------------------------- /lab4/lab4other/Producer/ProducerBehavior.java: -------------------------------------------------------------------------------- 1 | package lab.lab4other.Producer; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.Behaviour; 5 | import jade.domain.DFService; 6 | import jade.domain.FIPAAgentManagement.DFAgentDescription; 7 | import jade.domain.FIPAAgentManagement.ServiceDescription; 8 | import jade.domain.FIPAException; 9 | import jade.lang.acl.ACLMessage; 10 | import jade.lang.acl.MessageTemplate; 11 | import lombok.extern.slf4j.Slf4j; 12 | 13 | @Slf4j 14 | public class ProducerBehavior extends Behaviour { 15 | 16 | String type; 17 | double A, B1, B2, C0, C1, C2, C3; 18 | int hour = 1; 19 | 20 | public ProducerBehavior(String type, double A) { 21 | this.type = type; 22 | this.A = A; 23 | } 24 | 25 | public ProducerBehavior(String type, double B1, double B2) { 26 | this.type = type; 27 | this.B1 = B1; 28 | this.B2 = B2; 29 | } 30 | 31 | public ProducerBehavior(String type, double C0, double C1, double C2, double C3) { 32 | this.type = type; 33 | this.C0 = C0; 34 | this.C1 = C1; 35 | this.C2 = C2; 36 | this.C3 = C3; 37 | } 38 | 39 | 40 | @Override 41 | public void action() { 42 | 43 | ACLMessage start = myAgent.receive(MessageTemplate.MatchPerformative(ACLMessage.PROPAGATE)); 44 | if (start != null) { 45 | switch (type) { 46 | case "ТЭС" -> { 47 | ProducerAgent producerAgent = (ProducerAgent) this.getAgent(); 48 | Double energy = A; 49 | producerAgent.setEnergy(energy); 50 | producerAgent.setMinCost(3.0); 51 | producerAgent.setStartCost(4.8d); 52 | log.info("Энергия ТЭС {}", producerAgent.getEnergy()); 53 | hour++; 54 | if (hour == 24) hour = 1; 55 | } 56 | case "ВЭС" -> { 57 | ProducerAgent producerAgent = (ProducerAgent) this.getAgent(); 58 | double energy = (1 / (B2 * Math.sqrt(2 * Math.PI)) * Math.exp(-(hour - B1) * (hour - B1) / (2 * B2 * B2))) * 250; 59 | double startCost = 50 / (energy + 2); 60 | if (startCost > 7) startCost = 8d; 61 | producerAgent.setStartCost(startCost); 62 | producerAgent.setMinCost(startCost / 2); 63 | producerAgent.setEnergy(energy); 64 | System.out.println("Энергия ВЭС " + producerAgent.getEnergy()); 65 | hour++; 66 | if (hour == 24) hour = 1; 67 | } 68 | case "СЭС" -> { 69 | ProducerAgent producerAgent = (ProducerAgent) this.getAgent(); 70 | double energy; 71 | double startCost = 100d; 72 | if (hour > 5 && hour < 19) { 73 | energy = C0 + C1 * hour + C2 * hour * hour + C3 * hour * hour * hour; 74 | startCost = 40 / (energy + 2); 75 | } else energy = 0d; 76 | producerAgent.setStartCost(startCost); 77 | producerAgent.setMinCost(startCost / 2); 78 | producerAgent.setEnergy(energy); 79 | log.info("Энергия СЭС {}", producerAgent.getEnergy()); 80 | hour++; 81 | if (hour == 24) hour = 1; 82 | } 83 | } 84 | } else block(); 85 | } 86 | 87 | // регистрация производителя в желтой книге 88 | static void registration(Agent agent) { 89 | DFAgentDescription dfad = new DFAgentDescription(); 90 | ServiceDescription sd = new ServiceDescription(); 91 | dfad.setName(agent.getAID()); 92 | sd.setType(Services.Producer.toString()); 93 | sd.setName(Services.Producer + agent.getLocalName()); 94 | dfad.addServices(sd); 95 | try { 96 | DFService.register(agent, dfad); 97 | } catch (FIPAException e) { 98 | e.printStackTrace(); 99 | } 100 | } 101 | 102 | @Override 103 | public boolean done() { 104 | return false; 105 | } 106 | } -------------------------------------------------------------------------------- /testLab4/TestAgents.java: -------------------------------------------------------------------------------- 1 | package testLab4; 2 | 3 | import jade.core.Agent; 4 | import jade.core.behaviours.Behaviour; 5 | import lombok.extern.slf4j.Slf4j; 6 | 7 | import java.util.Arrays; 8 | 9 | @Slf4j 10 | public class TestAgents extends Agent { 11 | @Override 12 | protected void setup() { 13 | log.info("{} was born", this.getLocalName()); 14 | Object[] arguments = getArguments(); 15 | Arrays.stream(arguments).forEach(argument -> addBehaviour((Behaviour) argument)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /testLab4/TestBeh/ConsumerFSMTest.java: -------------------------------------------------------------------------------- 1 | package testLab4.TestBeh; 2 | 3 | import jade.core.AID; 4 | import jade.core.behaviours.FSMBehaviour; 5 | import jade.core.behaviours.WakerBehaviour; 6 | import jade.lang.acl.ACLMessage; 7 | import lab4.Behaviour.Consumer.ReceivingAnswerForConsumerParallel; 8 | import lab4.Config.Data; 9 | import lombok.extern.slf4j.Slf4j; 10 | 11 | @Slf4j 12 | public class ConsumerFSMTest extends FSMBehaviour { 13 | Data consumerData; 14 | Data onEnd = new Data(); 15 | double load, maxPrice; 16 | 17 | 18 | public ConsumerFSMTest(Data consumerData, double load, double maxPrice) { 19 | this.consumerData = consumerData; 20 | this.load = load; 21 | this.maxPrice = maxPrice; 22 | 23 | registerFirstState(new WakerBehaviour(getAgent(), 21000) { 24 | @Override 25 | protected void onWake() { 26 | log.info("{}: My current load is {}", getAgent().getLocalName(), load); 27 | ACLMessage needs = new ACLMessage(ACLMessage.REQUEST); 28 | needs.setContent(load + "," + maxPrice); 29 | needs.setProtocol("Task"); 30 | needs.addReceiver(new AID("firstDistributer", false)); 31 | getAgent().send(needs); 32 | consumerData.setConsumerLoad(load); 33 | } 34 | }, "SendReq"); 35 | registerLastState(new ReceivingAnswerForConsumerParallel(getAgent(), consumerData, onEnd), "ReceivingAnswer"); 36 | registerDefaultTransition("SendReq", "ReceivingAnswer"); 37 | } 38 | 39 | @Override 40 | public int onEnd() { 41 | return onEnd.getOnEnd(); 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /testLab4/TestBeh/FSMTestВЭС.java: -------------------------------------------------------------------------------- 1 | package testLab4.TestBeh; 2 | 3 | import jade.core.behaviours.FSMBehaviour; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import lab4.Config.Data; 6 | import lab4.Config.GenerationData; 7 | import lab4.Helper.DfHelper; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class FSMTestВЭС extends FSMBehaviour { 13 | Data producerDataВЭС; 14 | 15 | public FSMTestВЭС(Data producerDataВЭС) { 16 | this.producerDataВЭС = producerDataВЭС; 17 | 18 | registerFirstState(new OneShotBehaviour() { 19 | @Override 20 | public void action() { 21 | List AgentsInAllTrade = new ArrayList<>(); 22 | AgentsInAllTrade.add("Production"); 23 | DfHelper.registerItself(AgentsInAllTrade, getAgent()); 24 | } 25 | }, "Register"); 26 | registerLastState(new GenerationData(getAgent(),20000, null, producerDataВЭС, null), "Parsing"); 27 | registerDefaultTransition("Register", "Parsing"); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /testLab4/TestBeh/FSMTestСЭС.java: -------------------------------------------------------------------------------- 1 | package testLab4.TestBeh; 2 | 3 | import jade.core.behaviours.FSMBehaviour; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import lab4.Config.Data; 6 | import lab4.Config.GenerationData; 7 | import lab4.Helper.DfHelper; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class FSMTestСЭС extends FSMBehaviour { 13 | Data producerDataСЭС; 14 | 15 | public FSMTestСЭС(Data producerDataСЭС) { 16 | this.producerDataСЭС = producerDataСЭС; 17 | 18 | registerFirstState(new OneShotBehaviour() { 19 | @Override 20 | public void action() { 21 | List AgentsInAllTrade = new ArrayList<>(); 22 | AgentsInAllTrade.add("Production"); 23 | DfHelper.registerItself(AgentsInAllTrade, getAgent()); 24 | } 25 | }, "Register"); 26 | registerLastState(new GenerationData(getAgent(),20000, null, null, producerDataСЭС), "Parsing"); 27 | registerDefaultTransition("Register", "Parsing"); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /testLab4/TestBeh/FSMTestТЭС.java: -------------------------------------------------------------------------------- 1 | package testLab4.TestBeh; 2 | 3 | import jade.core.behaviours.FSMBehaviour; 4 | import jade.core.behaviours.OneShotBehaviour; 5 | import lab4.Config.Data; 6 | import lab4.Config.GenerationData; 7 | import lab4.Helper.DfHelper; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class FSMTestТЭС extends FSMBehaviour { 13 | Data producerDataТЭС; 14 | 15 | public FSMTestТЭС(Data producerDataТЭС) { 16 | this.producerDataТЭС = producerDataТЭС; 17 | 18 | registerFirstState(new OneShotBehaviour() { 19 | @Override 20 | public void action() { 21 | List AgentsInAllTrade = new ArrayList<>(); 22 | AgentsInAllTrade.add("Production"); 23 | DfHelper.registerItself(AgentsInAllTrade, getAgent()); 24 | } 25 | }, "Register"); 26 | registerLastState(new GenerationData(getAgent(),20000, producerDataТЭС, null, null), "Parsing"); 27 | registerDefaultTransition("Register", "Parsing"); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /testLab4/TestScenarios.java: -------------------------------------------------------------------------------- 1 | package testLab4; 2 | 3 | import lab4.Behaviour.Distributer.ReceiveTaskToAuction; 4 | import lab4.Behaviour.Producer.ReceiveTask; 5 | import testLab4.TestBeh.ConsumerFSMTest; 6 | import testLab4.TestBeh.FSMTestСЭС; 7 | import testLab4.TestBeh.FSMTestТЭС; 8 | import testLab4.TestBeh.FSMTestВЭС; 9 | import lab4.Config.Data; 10 | import org.junit.jupiter.api.Assertions; 11 | import org.junit.jupiter.api.Test; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | import static java.lang.Thread.sleep; 17 | 18 | public class TestScenarios extends TestUtil { 19 | Data producerData = new Data(); 20 | Data consumerData = new Data(); 21 | @Test 22 | public void firstScenario() throws InterruptedException { 23 | List services = new ArrayList<>(); 24 | services.add("jade.core.messaging.TopicManagementService"); 25 | services.add("jade.core.event.NotificationService"); 26 | 27 | startJade(services); 28 | ConsumerFSMTest behaviourToTest = new ConsumerFSMTest(consumerData, 12, 50); 29 | CreateAgent("residentialBuildingConsumer", behaviourToTest); 30 | CreateAgent("ТЭС",new FSMTestТЭС(producerData), new ReceiveTask(producerData)); 31 | CreateAgent("ВЭС",new FSMTestВЭС(producerData), new ReceiveTask(producerData)); 32 | CreateAgent("firstDistributer", new ReceiveTaskToAuction()); 33 | sleep(35000); 34 | 35 | Assertions.assertEquals(2, behaviourToTest.onEnd()); 36 | } 37 | @Test 38 | public void secondScenario() throws InterruptedException { 39 | List services = new ArrayList<>(); 40 | services.add("jade.core.messaging.TopicManagementService"); 41 | services.add("jade.core.event.NotificationService"); 42 | 43 | startJade(services); 44 | ConsumerFSMTest behaviourToTest = new ConsumerFSMTest(consumerData, 9, 100); 45 | CreateAgent("residentialBuildingConsumer", behaviourToTest); 46 | CreateAgent("ТЭС",new FSMTestТЭС(producerData), new ReceiveTask(producerData)); 47 | CreateAgent("СЭС",new FSMTestСЭС(producerData), new ReceiveTask(producerData)); 48 | CreateAgent("ВЭС",new FSMTestВЭС(producerData), new ReceiveTask(producerData)); 49 | CreateAgent("firstDistributer", new ReceiveTaskToAuction()); 50 | sleep(35000); 51 | 52 | Assertions.assertEquals(1, behaviourToTest.onEnd()); 53 | } 54 | @Test 55 | public void thirdScenario() throws InterruptedException { 56 | List services = new ArrayList<>(); 57 | services.add("jade.core.messaging.TopicManagementService"); 58 | services.add("jade.core.event.NotificationService"); 59 | 60 | startJade(services); 61 | ConsumerFSMTest behaviourToTest = new ConsumerFSMTest(consumerData,18, 100); 62 | CreateAgent("residentialBuildingConsumer", behaviourToTest); 63 | CreateAgent("ТЭС",new FSMTestТЭС(producerData), new ReceiveTask(producerData)); 64 | CreateAgent("СЭС",new FSMTestСЭС(producerData), new ReceiveTask(producerData)); 65 | CreateAgent("ВЭС",new FSMTestВЭС(producerData), new ReceiveTask(producerData)); 66 | CreateAgent("firstDistributer", new ReceiveTaskToAuction()); 67 | sleep(50000); 68 | 69 | Assertions.assertEquals(4, behaviourToTest.onEnd()); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /testLab4/TestUtil.java: -------------------------------------------------------------------------------- 1 | package testLab4; 2 | 3 | import jade.core.ProfileImpl; 4 | import jade.core.Runtime; 5 | import jade.core.behaviours.Behaviour; 6 | import jade.wrapper.AgentContainer; 7 | import jade.wrapper.AgentController; 8 | import jade.wrapper.StaleProxyException; 9 | 10 | import java.util.List; 11 | 12 | public class TestUtil { 13 | private AgentContainer mainContainer; 14 | public void startJade(List services){ 15 | 16 | ProfileImpl profileIMPL = new ProfileImpl(); 17 | profileIMPL.setParameter("gui", "true"); 18 | StringBuilder sb = new StringBuilder(); 19 | for (String service : services) { 20 | sb.append(service).append(";"); 21 | } 22 | profileIMPL.setParameter("services", sb.toString()); 23 | Runtime.instance().setCloseVM(true); 24 | 25 | mainContainer = Runtime.instance().createMainContainer(profileIMPL); 26 | } 27 | public void CreateAgent(String name, Behaviour... bhs) { 28 | try { 29 | AgentController newAgent = mainContainer.createNewAgent(name, TestAgents.class.getName(), bhs); 30 | newAgent.start(); 31 | } catch (StaleProxyException e) { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | --------------------------------------------------------------------------------