質問するログイン新規登録

質問編集履歴

11

2020/08/03 07:46

投稿

reina1125
reina1125

スコア21

title CHANGED
@@ -1,1 +1,1 @@
1
- pythonで組み合わせをチェックするプログラム
1
+ 組み合わせをチェックするプログラム
body CHANGED
File without changes

10

2020/08/03 07:46

投稿

reina1125
reina1125

スコア21

title CHANGED
File without changes
body CHANGED
@@ -1,1 +1,1 @@
1
- 全列挙した組み合わせから支配されている組み合わせを除去して、残りの組み合わせを全列挙する方法があれば教えていただきたいです。
1
+ 全列挙した組み合わせから特定の組み合わせを除去して、残りの組み合わせを全列挙する方法があれば教えていただきたいです。

9

ra

2020/08/03 07:45

投稿

reina1125
reina1125

スコア21

title CHANGED
@@ -1,1 +1,1 @@
1
- 支配関係をチェックするプログラム
1
+ pythonで組み合わせをチェックするプログラム
body CHANGED
@@ -1,196 +1,1 @@
1
- |優先度|A|B | C|
2
- |:--|:--:|--:|
3
- | 1|{ 1, 1, 0, 0 }|{ 1, 0, 1, 0 }|{ 0, 1, 0, 1 }|
4
- | 2|{ 1, 0, 1, 0 }|{ 0, 0, 1, 0 }|{ 0, 0, 0, 1 }|
5
- | 3|{ 0, 1, 0, 0 }|{ 0, 1, 0, 0 }|{ 1, 0, 0, 0 }|
6
-
7
- 上記のようにA,B,Cの3社があり、各社に1~3位の優先度がついたプロジェクトがあるとします。
8
- 例えば、A社の1位のプロジェクトは{1,1,0,0}です。
9
-
10
- この状況で実現したいことは下記の2ステップです。
11
- ①プロジェクトの和が{1,1,1,1}になるような組み合わせを全列挙する
12
- ②支配関係にある組み合わせがある場合、支配されている組み合わせを消去する
13
-
14
-
15
- ①は下記のコードで全列挙が可能になりましたが、②の支配関係をチェックする部分がわかりません。
16
- 例えば(1){A社1位,B社1,C社1位}と(2){A社2位,B社1位,C社1位}の組み合わせがあった場合、
17
- B社,C社の順位は同じ1位ですが、A社に関しては(1)が1位,(2)が2位なので
18
- (2)の組み合わせは(1)の組み合わせに含まれている(=支配されている)と言います。
19
-
20
- 支配関係の条件は
21
- ・同じ数のプロジェクトで成り立っていること
22
- ・同じ会社において、支配される側の順位が支配する側の順位以下であること
23
- (例)
24
- 支配する側 ==> A社1位、B社2位、C社2位
25
- 支配される側==>A社2位、B社2位、C社3位
26
-
27
- ①のステップで全列挙した組み合わせから支配されている組み合わせを除去して、残りの組み合わせを全列挙する方法があれば教えていただきたいです。
1
+ 全列挙した組み合わせから支配されている組み合わせを除去して、残りの組み合わせを全列挙する方法があれば教えていただきたいです。
28
-
29
-
30
- 私が現状考えている方法としては下記です。
31
- ①配列を用意してそこに最初の解の順位を保存
32
- ②以降、既存の解と新規の解との順位を比較
33
-     ----支配関係がある場合 ==>支配されている解を消去、新たな解を保存
34
- ----支配関係がない場合 ==>新たな解として保存
35
- ③保存されている解を出力
36
-
37
-
38
-
39
-
40
-
41
- ```java
42
- public class NNN {
43
-
44
- static int ProjectA[][] = { { 1, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 } };
45
- static int ProjectB[][] = { { 1, 0, 1, 0 }, { 0, 0, 1, 0 }, { 1, 0, 0, 0 } };
46
- static int ProjectC[][] = { { 1, 0, 0, 1 }, { 0, 0, 0, 1 }, { 0, 0, 1, 0 } };
47
-
48
- static int[][][] ProjectALL = {ProjectA, ProjectB, ProjectC};
49
- static int count=0;
50
-
51
- public static void main(String[] args) {
52
- test2(args);
53
- test3(args);
54
- test4(args);
55
- }
56
-
57
-
58
- //[case1] プロジェクトが2つの組み合わせ--------------------------------------
59
- public static void test2(String[] args) {
60
- for (int i = 0; i < 9; i++) {
61
- for (int j = i ; j < 9; j++) {
62
- if (check2(i, j)) {
63
- for (int ret = 0; ret < 9; ret++) {
64
- sysoutResult(ret, ret == i || ret == j );
65
- }
66
- System.out.println("-------------------------");
67
- }
68
- }
69
- }
70
- }
71
-
72
- private static boolean check2(int i, int j) {
73
- //配列の中身の合計が{1,1,1,1}になるかチェックする
74
- return getArray(i)[0] + getArray(j)[0] == 1 &&
75
- getArray(i)[1] + getArray(j)[1] == 1 &&
76
- getArray(i)[2] + getArray(j)[2] == 1 &&
77
- getArray(i)[3] + getArray(j)[3] == 1;
78
- }
79
- //---------------------------------------------------------------
80
-
81
- //[case2] プロジェクトが3つの組み合わせ ---------------------------------------
82
- public static void test3(String[] args) {
83
- for (int i = 0; i < 9; i++) {
84
- for (int j = i ; j < 9; j++) {
85
- for (int k = j; k < 9; k++) {
86
- if (check3(i, j, k)) {
87
- for (int ret = 0; ret < 9; ret++) {
88
- sysoutResult(ret, ret == i || ret == j || ret == k);
89
- }
90
- System.out.println("-------------------------");
91
- }
92
- }
93
- }
94
- }
95
- }
96
-
97
- private static boolean check3(int i, int j, int k) {
98
- //配列の中身の合計が{1,1,1,1}になるかチェックする
99
- return getArray(i)[0] + getArray(j)[0] + getArray(k)[0] == 1 &&
100
- getArray(i)[1] + getArray(j)[1] + getArray(k)[1] == 1 &&
101
- getArray(i)[2] + getArray(j)[2] + getArray(k)[2] == 1 &&
102
- getArray(i)[3] + getArray(j)[3] + getArray(k)[3] == 1;
103
- }
104
- //----------------------------------------------------------------------
105
-
106
- //[case3] プロジェクトが4つの組み合わせ --------------------------------------
107
- public static void test4(String[] args) {
108
- for (int i = 0; i < 9; i++) {
109
- for (int j = i ; j < 9; j++) {
110
- for (int k = j; k < 9; k++) {
111
- for (int l = k; l < 9; l++) {
112
- if (check4(i, j, k,l)) {
113
- for (int ret = 0; ret < 9; ret++) {
114
- sysoutResult(ret, ret == i || ret == j || ret == k|| ret == l);
115
- }
116
- System.out.println("------------------------");
117
- }
118
- }
119
- }
120
- }
121
- }
122
- }
123
-
124
- private static boolean check4(int i, int j, int k, int l) {
125
- //配列の中身の合計が{1,1,1,1}になるかチェックする
126
- return getArray(i)[0] + getArray(j)[0] + getArray(k)[0]+ getArray(l)[0] == 1 &&
127
- getArray(i)[1] + getArray(j)[1] + getArray(k)[1]+ getArray(l)[1] == 1 &&
128
- getArray(i)[2] + getArray(j)[2] + getArray(k)[2]+ getArray(l)[2] == 1 &&
129
- getArray(i)[3] + getArray(j)[3] + getArray(k)[3]+ getArray(l)[3] == 1;
130
- }
131
- //----------------------------------------------------------------------
132
-
133
-
134
-
135
- private static int[] getArray(int num) {
136
- return ProjectALL[num / 3][num % 3];
137
- }
138
-
139
- private static void sysoutResult(int num, boolean ret) {
140
- String company[] = { "A社", "B社", "C社" };
141
- if(ret==true) {
142
- System.out.println(
143
- company[num / 3] + "の" + (num % 3 + 1) + "位のプロジェクト=" + (ret ? "1" : "0"));
144
- }
145
- }
146
- }
147
-
148
- ```
149
- ```
150
- 出力画面
151
-
152
-
153
- A社の2位のプロジェクト=1
154
- C社の1位のプロジェクト=1
155
- -------------------------
156
- B社の1位のプロジェクト=1
157
- C社の1位のプロジェクト=1
158
- -------------------------
159
- A社の1位のプロジェクト=1
160
- B社の2位のプロジェクト=1
161
- C社の2位のプロジェクト=1
162
- -------------------------
163
- A社の2位のプロジェクト=1
164
- A社の3位のプロジェクト=1
165
- C社の2位のプロジェクト=1
166
- -------------------------
167
- A社の2位のプロジェクト=1
168
- B社の3位のプロジェクト=1
169
- C社の2位のプロジェクト=1
170
- -------------------------
171
- A社の3位のプロジェクト=1
172
- B社の1位のプロジェクト=1
173
- C社の2位のプロジェクト=1
174
- -------------------------
175
- B社の1位のプロジェクト=1
176
- B社の3位のプロジェクト=1
177
- C社の2位のプロジェクト=1
178
- -------------------------
179
- B社の2位のプロジェクト=1
180
- C社の1位のプロジェクト=1
181
- C社の3位のプロジェクト=1
182
- -------------------------
183
- A社の3位のプロジェクト=1
184
- B社の2位のプロジェクト=1
185
- C社の2位のプロジェクト=1
186
- C社の3位のプロジェクト=1
187
- ------------------------
188
- B社の2位のプロジェクト=1
189
- B社の3位のプロジェクト=1
190
- C社の2位のプロジェクト=1
191
- C社の3位のプロジェクト=1
192
- ------------------------
193
-
194
-
195
-
196
- ```

8

2020/08/03 07:44

投稿

reina1125
reina1125

スコア21

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- |優先度|A|B | C|
1
+ |優先度|A|B | C|
2
2
  |:--|:--:|--:|
3
3
  | 1|{ 1, 1, 0, 0 }|{ 1, 0, 1, 0 }|{ 0, 1, 0, 1 }|
4
4
  | 2|{ 1, 0, 1, 0 }|{ 0, 0, 1, 0 }|{ 0, 0, 0, 1 }|

7

修正

2020/08/03 03:06

投稿

reina1125
reina1125

スコア21

title CHANGED
File without changes
body CHANGED
@@ -17,6 +17,13 @@
17
17
  B社,C社の順位は同じ1位ですが、A社に関しては(1)が1位,(2)が2位なので
18
18
  (2)の組み合わせは(1)の組み合わせに含まれている(=支配されている)と言います。
19
19
 
20
+ 支配関係の条件は
21
+ ・同じ数のプロジェクトで成り立っていること
22
+ ・同じ会社において、支配される側の順位が支配する側の順位以下であること
23
+ (例)
24
+ 支配する側 ==> A社1位、B社2位、C社2位
25
+ 支配される側==>A社2位、B社2位、C社3位
26
+
20
27
  ①のステップで全列挙した組み合わせから支配されている組み合わせを除去して、残りの組み合わせを全列挙する方法があれば教えていただきたいです。
21
28
 
22
29
 

6

修正

2020/07/30 08:09

投稿

reina1125
reina1125

スコア21

title CHANGED
File without changes
body CHANGED
@@ -143,6 +143,12 @@
143
143
  出力画面
144
144
 
145
145
 
146
+ A社の2位のプロジェクト=1
147
+ C社の1位のプロジェクト=1
148
+ -------------------------
149
+ B社の1位のプロジェクト=1
150
+ C社の1位のプロジェクト=1
151
+ -------------------------
146
152
  A社の1位のプロジェクト=1
147
153
  B社の2位のプロジェクト=1
148
154
  C社の2位のプロジェクト=1
@@ -179,4 +185,5 @@
179
185
  ------------------------
180
186
 
181
187
 
188
+
182
189
  ```

5

修正

2020/07/30 07:45

投稿

reina1125
reina1125

スコア21

title CHANGED
File without changes
body CHANGED
@@ -48,7 +48,7 @@
48
48
  }
49
49
 
50
50
 
51
- //[case1] プロジェクトが2つの組み合わせ------------------------------------------
51
+ //[case1] プロジェクトが2つの組み合わせ--------------------------------------
52
52
  public static void test2(String[] args) {
53
53
  for (int i = 0; i < 9; i++) {
54
54
  for (int j = i ; j < 9; j++) {
@@ -69,8 +69,9 @@
69
69
  getArray(i)[2] + getArray(j)[2] == 1 &&
70
70
  getArray(i)[3] + getArray(j)[3] == 1;
71
71
  }
72
- //----------------------------------------------------------------------
72
+ //---------------------------------------------------------------
73
+
73
- //[case2] プロジェクトが3つの組み合わせ ------------------------------------------
74
+ //[case2] プロジェクトが3つの組み合わせ ---------------------------------------
74
75
  public static void test3(String[] args) {
75
76
  for (int i = 0; i < 9; i++) {
76
77
  for (int j = i ; j < 9; j++) {

4

修正

2020/07/30 07:43

投稿

reina1125
reina1125

スコア21

title CHANGED
File without changes
body CHANGED
@@ -48,7 +48,7 @@
48
48
  }
49
49
 
50
50
 
51
- //[case1] プロジェクトが3つの組み合わせ------------------------------------------
51
+ //[case1] プロジェクトが2つの組み合わせ------------------------------------------
52
52
  public static void test2(String[] args) {
53
53
  for (int i = 0; i < 9; i++) {
54
54
  for (int j = i ; j < 9; j++) {

3

修正

2020/07/30 07:41

投稿

reina1125
reina1125

スコア21

title CHANGED
File without changes
body CHANGED
@@ -42,11 +42,35 @@
42
42
  static int count=0;
43
43
 
44
44
  public static void main(String[] args) {
45
+ test2(args);
45
46
  test3(args);
46
47
  test4(args);
47
48
  }
48
49
 
50
+
51
+ //[case1] プロジェクトが3つの組み合わせ------------------------------------------
52
+ public static void test2(String[] args) {
53
+ for (int i = 0; i < 9; i++) {
54
+ for (int j = i ; j < 9; j++) {
55
+ if (check2(i, j)) {
56
+ for (int ret = 0; ret < 9; ret++) {
57
+ sysoutResult(ret, ret == i || ret == j );
58
+ }
59
+ System.out.println("-------------------------");
60
+ }
61
+ }
62
+ }
63
+ }
64
+
65
+ private static boolean check2(int i, int j) {
66
+ //配列の中身の合計が{1,1,1,1}になるかチェックする
67
+ return getArray(i)[0] + getArray(j)[0] == 1 &&
68
+ getArray(i)[1] + getArray(j)[1] == 1 &&
69
+ getArray(i)[2] + getArray(j)[2] == 1 &&
70
+ getArray(i)[3] + getArray(j)[3] == 1;
71
+ }
72
+ //----------------------------------------------------------------------
49
- //[case1] プロジェクトが3つの組み合わせ ------------------------------------------
73
+ //[case2] プロジェクトが3つの組み合わせ ------------------------------------------
50
74
  public static void test3(String[] args) {
51
75
  for (int i = 0; i < 9; i++) {
52
76
  for (int j = i ; j < 9; j++) {
@@ -71,7 +95,7 @@
71
95
  }
72
96
  //----------------------------------------------------------------------
73
97
 
74
- //[case2] プロジェクトが4つの組み合わせ --------------------------------------
98
+ //[case3] プロジェクトが4つの組み合わせ --------------------------------------
75
99
  public static void test4(String[] args) {
76
100
  for (int i = 0; i < 9; i++) {
77
101
  for (int j = i ; j < 9; j++) {

2

修正

2020/07/30 07:38

投稿

reina1125
reina1125

スコア21

title CHANGED
File without changes
body CHANGED
@@ -1,8 +1,8 @@
1
1
  |優先度|A社|B社 | C社|
2
2
  |:--|:--:|--:|
3
- | 1|{ 1, 1, 0, 0 }|{ 1, 0, 1, 0 }|{ 1, 0, 0, 1 }|
3
+ | 1|{ 1, 1, 0, 0 }|{ 1, 0, 1, 0 }|{ 0, 1, 0, 1 }|
4
- | 2|{ 0, 1, 0, 0 }|{ 0, 0, 1, 0 }|{ 0, 0, 0, 1 }|
4
+ | 2|{ 1, 0, 1, 0 }|{ 0, 0, 1, 0 }|{ 0, 0, 0, 1 }|
5
- | 3|{ 0, 0, 0, 1 }|{ 1, 0, 0, 0 }|{ 0, 0, 1, 0 }|
5
+ | 3|{ 0, 1, 0, 0 }|{ 0, 1, 0, 0 }|{ 1, 0, 0, 0 }|
6
6
 
7
7
  上記のようにA,B,Cの3社があり、各社に1~3位の優先度がついたプロジェクトがあるとします。
8
8
  例えば、A社の1位のプロジェクトは{1,1,0,0}です。
@@ -119,56 +119,39 @@
119
119
 
120
120
 
121
121
  A社の1位のプロジェクト=1
122
- A社の3位のプロジェクト=1
123
122
  B社の2位のプロジェクト=1
123
+ C社の2位のプロジェクト=1
124
124
  -------------------------
125
- A社の1位のプロジェクト=1
125
+ A社の2位のプロジェクト=1
126
126
  A社の3位のプロジェクト=1
127
- C社の3位のプロジェクト=1
128
- -------------------------
129
- A社の1位のプロジェクト=1
130
- B社の2位のプロジェクト=1
131
127
  C社の2位のプロジェクト=1
132
128
  -------------------------
133
- A社の1位のプロジェクト=1
129
+ A社の2位のプロジェクト=1
130
+ B社の3位のプロジェクト=1
134
131
  C社の2位のプロジェクト=1
135
- C社の3位のプロジェクト=1
136
132
  -------------------------
137
- A社の2位のプロジェクト=1
138
133
  A社の3位のプロジェクト=1
139
134
  B社の1位のプロジェクト=1
135
+ C社の2位のプロジェクト=1
140
136
  -------------------------
141
- A社の2位のプロジェクト=1
142
137
  B社の1位のプロジェクト=1
138
+ B社の3位のプロジェクト=1
143
139
  C社の2位のプロジェクト=1
144
140
  -------------------------
145
- A社の2位のプロジェクト=1
146
141
  B社の2位のプロジェクト=1
147
142
  C社の1位のプロジェクト=1
148
- -------------------------
149
- A社の2位のプロジェクト=1
150
- C社の1位のプロジェクト=1
151
143
  C社の3位のプロジェクト=1
152
144
  -------------------------
153
- A社の2位のプロジェクト=1
154
145
  A社の3位のプロジェクト=1
155
146
  B社の2位のプロジェクト=1
156
- B社の3位のプロジェクト=1
157
- ------------------------
158
- A社の2位のプロジェクト=1
147
+ C社の2位のプロジェクト=1
159
- A社の3位のプロジェクト=1
160
- B社の3位のプロジェクト=1
161
148
  C社の3位のプロジェクト=1
162
149
  ------------------------
163
- A社の2位のプロジェクト=1
164
150
  B社の2位のプロジェクト=1
165
151
  B社の3位のプロジェクト=1
166
152
  C社の2位のプロジェクト=1
167
- ------------------------
168
- A社の2位のプロジェクト=1
169
- B社の3位のプロジェクト=1
170
- C社の2位のプロジェクト=1
171
153
  C社の3位のプロジェクト=1
172
154
  ------------------------
173
155
 
156
+
174
157
  ```

1

誤字

2020/07/30 07:20

投稿

reina1125
reina1125

スコア21

title CHANGED
File without changes
body CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
 
15
15
  ①は下記のコードで全列挙が可能になりましたが、②の支配関係をチェックする部分がわかりません。
16
- 例えば(1){A社1位,B社1,C社1位}と(2){A社2位,B社1,C社1位}の組み合わせがあった場合、
16
+ 例えば(1){A社1位,B社1,C社1位}と(2){A社2位,B社1,C社1位}の組み合わせがあった場合、
17
17
  B社,C社の順位は同じ1位ですが、A社に関しては(1)が1位,(2)が2位なので
18
18
  (2)の組み合わせは(1)の組み合わせに含まれている(=支配されている)と言います。
19
19